1

次のスニペットは、「WantReturn」が設定された複数行 CEdit コントロールの OnChange() ハンドラからのものです。

void DLG::OnChangeEditPrepareTape() 
{
    CString ss;
    std::vector<char> aTape;
    m_prepareTape.GetWindowText(ss);
    m_prepareTape.SetWindowText(ss);
}

SetWindowText() がコメント アウトされている場合、ユーザーのテキストは右側に積み上げられ、すべて問題ありません。しかし、それを入れると、テキスト挿入ポイントが左端に移動し、ユーザーの文字が既存の文字の左側に入ります..

CEdit をサブクラス化することで、必要なものを取得できます。しかし、Get() & Set() でそれを行う方法があるかどうか知りたいです。

私は Visual C++ 6 と Service Pack 5 を使用しています。現在 11 歳ですが、彼らが言うように「ソフトウェアは摩耗しません」:-)。

4

2 に答える 2

2

SetWindowText()コントロールの観点からすると、テキスト コンテンツ全体が (おそらく空の文字列に) リセットされたばかりであり、挿入ポイントと現在の選択の両方がそれらを保持するのに十分な意味を持たない可能性があるため、挿入ポイントは によってリセットされます。

GetSel()SetSel()を使用して、この動作を自分で実装できます。

void DLG::OnChangeEditPrepareTape() 
{
    CString ss;
    std::vector<char> aTape;

    int start, end;
    m_prepareTape.GetSel(start, end);
    m_prepareTape.GetWindowText(ss);

    // Tinker with the text...

    m_prepareTape.SetWindowText(ss);
    m_prepareTape.SetSel(start, end);
}
于 2011-03-13T11:32:06.117 に答える
1

を使用GetSelして、テキストを置換する前にカーソル位置を取得し、SetSel後で同じ場所に配置できます。

void DLG::OnChangeEditPrepareTape() 
{
    CString ss;
    int start, stop;
    std::vector<char> aTape;
    m_prepareTape.GetWindowText(ss);
    m_prepareTape.GetSel(&start, &stop);
    m_prepareTape.SetWindowText(ss);
    m_prepareTape.SetSel(start, stop);
}

テキスト ボックスに戻す前にテキストを変更すると、それに応じて増加または減少start(およびend) することができます。

于 2011-03-13T11:28:11.580 に答える