タブコントロールのページ内のタブ・キーによるフォーカスの移動
Posted: 2012年1月25日(水) 08:01
BCC Developer(BCC 5.5)でWin32アプリのプログラムを書いています。
あるモーダル・ダイアログ上にタブコントロールがあり、そのタブ・ページ内で
「タブ・キーによるフォーカスの移動」を行いたいのですが、どうもうまく行きません。
形としてはIEの「インターネット・オプション」のダイアログの様な感じのフォーカス移動(タブページ内のコントロールを順次移動→親であるモーダルダイアログのOK/キャンセルに移動→その後再びタブ内に移動)をさせたいのですが、タブページ内のコントロールは反応してくれません。
それぞれのタブページは以下のようにCreateDialog()による「モードレス・ダイアログ」として作成しました。
タブページはモードレスダイアログなので、更にWinMainのメッセージ・ループ内において、
と書き、この5行目のIsDialogMessage(hModelessDlgWnd,&msg)の
「hModelessDlgWnd」(グローバル変数)に現在開いているタブページ(モードレスダイアログ)の
ハンドルを入れるものとします。
実際には、それぞれのタブページのウインドウプロシージャ内で
WM_ACTIVATEメッセージが送られてきた時にこの「hModelessDlgWnd」にそのタブページのウインドウハンドルをセットしています。
この方法は「普通の独立したモードレスダイアログ」についてはうまく動作してくれます。(つまり何かの子ウインドウでは無く、それ単体のウインドウである場合)
ところがタブ・コントロールウインドウの子として作った場合にはどうもうまく行きません。
どうもこのタブコントロールの親であるモーダルダイアログの方にばかりフォーカスが飛んで行くようです。
テストとしてWinMainのメッセージループ内、hModelessDlgWnd(グローバル変数)を介してではなく、直接「hTabPage1」を書いてやってみたりもしたんですがこれも駄目でした。
タブページ上のコントロールには全てWS_TABSTOP(0x00010000)をセットして、タプ・ページの親であるタブコントロール・ウインドウにもWS_TABSTOPを付けています。
このような場合にキーボードからのフォーカス移動を行うにはどのようにすれば良いのでしょうか?
あるモーダル・ダイアログ上にタブコントロールがあり、そのタブ・ページ内で
「タブ・キーによるフォーカスの移動」を行いたいのですが、どうもうまく行きません。
形としてはIEの「インターネット・オプション」のダイアログの様な感じのフォーカス移動(タブページ内のコントロールを順次移動→親であるモーダルダイアログのOK/キャンセルに移動→その後再びタブ内に移動)をさせたいのですが、タブページ内のコントロールは反応してくれません。
それぞれのタブページは以下のようにCreateDialog()による「モードレス・ダイアログ」として作成しました。
//タブコントロールを作成する
hTabWnd=CreateWindowEx(NULL,
"SysTabControl32",
"",//タイトル(使用しない)
WS_CHILD | WS_VISIBLE | WS_TABSTOP, //スタイル
rc.left, rc.top, rc.right, rc.bottom, //位置とサイズ
hSettingWnd,//親ウィンドウであるモーダルダイアログのハンドル
NULL, //ID
hInstance, //インスタンスハンドル
NULL);
//タブページ1,2の作成
hTabPage1=CreateDialog(hInstance, "IDD_MODELESS", hTabWnd, (DLGPROC)TabPage1Proc);
hTabPage2=CreateDialog(hInstance, "IDD_MODELESS", hTabWnd, (DLGPROC)TabPage2Proc);
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
if (bRet == -1) {
break;
} else {
if (!IsDialogMessage(hModelessDlgWnd,&msg)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
「hModelessDlgWnd」(グローバル変数)に現在開いているタブページ(モードレスダイアログ)の
ハンドルを入れるものとします。
実際には、それぞれのタブページのウインドウプロシージャ内で
WM_ACTIVATEメッセージが送られてきた時にこの「hModelessDlgWnd」にそのタブページのウインドウハンドルをセットしています。
この方法は「普通の独立したモードレスダイアログ」についてはうまく動作してくれます。(つまり何かの子ウインドウでは無く、それ単体のウインドウである場合)
ところがタブ・コントロールウインドウの子として作った場合にはどうもうまく行きません。
どうもこのタブコントロールの親であるモーダルダイアログの方にばかりフォーカスが飛んで行くようです。
テストとしてWinMainのメッセージループ内、hModelessDlgWnd(グローバル変数)を介してではなく、直接「hTabPage1」を書いてやってみたりもしたんですがこれも駄目でした。
タブページ上のコントロールには全てWS_TABSTOP(0x00010000)をセットして、タプ・ページの親であるタブコントロール・ウインドウにもWS_TABSTOPを付けています。
このような場合にキーボードからのフォーカス移動を行うにはどのようにすれば良いのでしょうか?