« Canon PowerShot SX100 IS | トップページ | 野球肘-関節ネズミ除去 »

エディットコントロールのSetSel

VC++ MFCの備忘録です。
CEditのSetSelについて数年前に悩んだことと同じ内容で、最近小一時間悩んでしまいました。

SetSelはエディットボックス内の文字領域を選択することに使います。

void SetSel(
   int nStartChar,
   int nEndChar,
   BOOL bNoScroll = FALSE
);

nStartCharは選択領域の開始位置、nEndCharは終了位置。nStartCharを0, nEndCharを-1とすることでエディットコントロール内の文字列全てが選択されます。


今回作成したのはこんな感じです。

Setsel2_2

リストコントロールに表示されている名前をダブルクリックすることで名前編集用のダイアログを表示して名前を変更できるようなものです。

いちいちエディットボックス内のコントロール内の文字列を選択するのが面倒なので、起動時に選択状態にしておこうと思いました。

何も考えずに「名前の編集」ダイアログのクラスの「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 を返します。

}


初歩的なところで無駄な時間を費やしてしまったことと、自分の無知に反省...

|

« Canon PowerShot SX100 IS | トップページ | 野球肘-関節ネズミ除去 »

「プログラミング」カテゴリの記事

「備忘録」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/447000/10286987

この記事へのトラックバック一覧です: エディットコントロールのSetSel:

« Canon PowerShot SX100 IS | トップページ | 野球肘-関節ネズミ除去 »