< PathAddExtension の挙動 | 非表示のウインドウの最大化を解除する >

October 7, 2005

ダイアログのデフォルトボタンを変更する

ダイアログのデフォルトボタンを動的に変更したい、あるいは、一時的にデフォルトでなくしたい、などを行うには、ダイアログに対して DM_SETDEFID メッセージを送出し、デフォルトにするボタンの ID を渡す。MFC だと、CDialog::SetDefID がそれにあたる。しかし、それだけではボタンの周囲の黒枠が更新されないんである。Enter キーを押下すると、確かにデフォルトボタンが変更されていることが分かるが、表示上は更新されていない。SendMessage で送出したあと Invalidate したり、UpdateWindow したりしてもだめだったので、メッセージ受信と非同期に「デフォルト」という属性を更新しているのかもしれない。

あれこれやってみたところ、以下のようにフォーカスを強制的にセットしてやる以外のうまい方法は見つけられなかった。

// フォーカスのあるコントロールを取得しておく
CWnd *pWndFocus = GetFocus ();

// ボタンをデフォルトに
SetDefID (IDC_BUTTON1);

// 一旦フォーカスをセットする
GotoDlgCtrl (&m_Button1);

// 以前にフォーカスのあったコントロールに戻る
if (pWndFocus)
{
    GotoDlgCtrl (pWndFocus);
}

もともと IDC_BUTTON1 にフォーカスがあったとしても、この方法でうまくいくようだ。ちなみに、単にデフォルト属性をはずす場合は、WPARAM を 0 にして DF_SETDEFID するのでいけるようだ。(SetDefID (0); ってこと)

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/1096

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?