エディットコントロールのSetSel
VC++ MFCの備忘録です。
CEditのSetSelについて数年前に悩んだことと同じ内容で、最近小一時間悩んでしまいました。
SetSelはエディットボックス内の文字領域を選択することに使います。
void SetSel(
int nStartChar,
int nEndChar,
BOOL bNoScroll = FALSE
);
nStartCharは選択領域の開始位置、nEndCharは終了位置。nStartCharを0, nEndCharを-1とすることでエディットコントロール内の文字列全てが選択されます。
今回作成したのはこんな感じです。
リストコントロールに表示されている名前をダブルクリックすることで名前編集用のダイアログを表示して名前を変更できるようなものです。
いちいちエディットボックス内のコントロール内の文字列を選択するのが面倒なので、起動時に選択状態にしておこうと思いました。
何も考えずに「名前の編集」ダイアログのクラスの「OnInitialUpdate」関数内で、
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_NAME);
pEdit->SetSel(0, -1, FALSE);
pEdit->SetFocus();
とやってみたのですが上手くいきません。
SetFocusが上手く働かず、エディットボックスではなく「OK」ボタンにフォーカスされてしまい、文字列が選択状態(青色白抜き)になりません。
リソースファイルをテキストエディタで開いてコントロールの順番を入れ替えてやることで、起動時にエディットボックスをフォーカスすることができますが、SetFocusの問題解決ではありません。
しかし、ダイアログの「OnInitialUpdate」関数内の戻り値のところを見ると、ご丁寧に英語で答えが書いてありました。
return TRUE; // return TRUE unless you set the focus to a control
「コントロールにフォーカスを設定しないなら、TRUEを返してください」とのこと。
戻り値を「FALSE」に設定することで、問題解決しました。
BOOL CDlgEditLabel::OnInitDialog()
{
CDialog::OnInitDialog();
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_NAME);
pEdit->SetSel(0, -1, FALSE);
pEdit->SetFocus();
return FALSE;
//return TRUE; // return TRUE unless you set the focus to a control
// 例外 : OCX プロパティ ページは必ず FALSE を返します。
}
初歩的なところで無駄な時間を費やしてしまったことと、自分の無知に反省...
| 固定リンク
「プログラミング」カテゴリの記事
- EMONSTERで動くGPSアプリ作成(2008.06.06)
- MFCのMDIで、起動時に空のウィンドウが表示されないようにするには(2009.01.09)
- エディットコントロールのSetSel(2008.02.06)
「備忘録」カテゴリの記事
- EMONSTERで動くGPSアプリ作成(2008.06.06)
- MFCのMDIで、起動時に空のウィンドウが表示されないようにするには(2009.01.09)
- エディットコントロールのSetSel(2008.02.06)



コメント