タブ キーまたは矢印キーを使用してダイアログの CEdit コントロールに移動すると、コントロール内のすべてのテキストが選択されます。この動作は私に問題を引き起こしています。コントロールがカーソルをテキストの最初 (または最後) に置き、何も選択しなかった場合は、それを好むでしょう。これを行う簡単な方法はありますか (たとえば、設定できるコントロールのプロパティ)?
3 に答える
目標を達成するもう1つの方法は、コンテンツが選択されないようにすることです。ダイアログ内のコントロールをナビゲートするとき、ダイアログマネージャは、それらの動作に関連する特定のプロパティについてそれぞれのコントロールにクエリを実行します。デフォルトでは、編集コントロールはDLGC_HASSETSEL
(とりわけ)フラグで応答して、その内容を自動選択する必要があることをダイアログマネージャーに示します。
これを回避するには、編集コントロールをサブクラス化し、WM_GETDLGCODEメッセージを処理して、フラグを適切に変更する必要があります。まず、以下からクラスを派生させますCEdit
。
class CPersistentSelectionEdit : public CEdit {
public:
DECLARE_MESSAGE_MAP()
afx_msg UINT OnGetDlgCode() {
// Return default value, removing the DLGC_HASSETSEL flag
return ( CEdit::OnGetDlgCode() & ~DLGC_HASSETSEL );
}
};
BEGIN_MESSAGE_MAP( CPersistentSelectionEdit, CEdit )
ON_WM_GETDLGCODE()
END_MESSAGE_MAP()
次に、実際のコントロールをサブクラス化します。これを行うにはいくつかの方法があります。物事を単純にするために、ダイアログクラスm_Edit1
でタイプのクラスメンバーを宣言し、次の場所CPersistentSelectionEdit
に適切なエントリを追加するだけDoDataExchange
です。
// Subclass the edit control
DDX_Control( pDX, IDC_EDIT1, m_Edit1 );
この時点で、移動時にコンテンツが自動選択されていない編集コントロールがあります。選択は好きなように制御できます。
そんなスタイルはなかなか無いと思います。
ただし、ウィザードを使用して OnSetfocus ハンドラーを追加できます。
void CMyDlg::OnSetfocusEdit1()
{
CEdit* e = (CEdit*)GetDlgItem(IDC_EDIT1);
e->SetSel(0); // <-- hide selection
}