0

編集コントロール(その中のいくつかのテキスト)とボタン(クリックすると他のダイアログボックスが開きます)を持つ1つのダイアログボックスがあります。

一部のテキストを選択 (強調表示) してボタンをクリックすると、他のダイアログが開きましたが、編集コントロールのテキストが選択されていませんでした。

テキストを選択したままにしたいのですが、それは起こっていませんか? なぜそうなのか?どうすればできますか?

4

1 に答える 1

1

EDIT コントロールの既定の動作では、コントロールがフォーカスを失うと選択が非表示になります。デフォルトの動作を無効にするには、コントロールを動的に作成するか、スタイルを動的に変更する場合にES_NOHIDESEL呼び出して、編集コントロール スタイルを適用する必要があります。CWnd::ModifyStyle静的リソースの場合、リソース エディターから [非表示の選択]プロパティを設定できます。

ただし、エディット コントロールがフォーカスを取得すると、デフォルトでコンテンツ全体が選択されることに注意してください。これが望ましくない場合は、エディット コントロールをサブクラス化する必要があります (C++ の意味と Win32-API の意味の両方で)。これを行うには、 から派生させ、ハンドラーをCEdit追加し、ビットをマスクします。ON_WM_GETDLGCODEDLGC_HASSETSEL

class CPreservingSelectionEdit : public CEdit
{
protected:
    DECLARE_MESSAGE_MAP();
public:
    afx_msg UINT OnGetDlgCode()
    {
        UINT uiCode = CEdit::OnGetDlgCode();
        uiCode &= ~DLGC_HASSETSEL;
        return uiCode;
    }
};

BEGIN_MESSAGE_MAP( CPreservingSelectionEdit, CEdit )
    ON_WM_GETDLGCODE()
END_MESSAGE_MAP()

コントロールをサブクラス化するには、この派生クラスをコントロールにアタッチする必要もあります。最も簡単な方法は、実装にDDX_Control-statement を追加することです。DoDataExchange

void CMyDlg::DoDataExchange( CDataExchange* pDX )
{
    CDialogEx::DoDataExchange( pDX );
    DDX_Control( pDX, IDC_EDIT1, m_PreservingSelectionEdit );
}

IDC_EDIT1、サブクラス化するコントロールのコントロール識別子であり、m_PreservingSelectionEdittype のダイアログ クラスのメンバー変数ですCPreservingSelectionEdit

また、動作と視覚的表現は互いに独立していることにも注意してください。それぞれ個別にお申し込みいただけます。したがって、視覚的なフィードバックを変更せずに編集コントロールのみが選択を保持するようにする場合は、回答の 2 番目の部分に示されている変更を単独で実装できます。

于 2013-07-18T19:56:30.623 に答える