タブコントロールのページ内のタブ・キーによるフォーカスの移動

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
jacoby

 タブコントロールのページ内のタブ・キーによるフォーカスの移動

#1

投稿記事 by jacoby » 14年前

 BCC Developer(BCC 5.5)でWin32アプリのプログラムを書いています。
あるモーダル・ダイアログ上にタブコントロールがあり、そのタブ・ページ内で
「タブ・キーによるフォーカスの移動」を行いたいのですが、どうもうまく行きません。
形としては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); 
タブページはモードレスダイアログなので、更にWinMainのメッセージ・ループ内において、

コード:

    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
        if (bRet == -1) {
            break;
        } else {
            if (!IsDialogMessage(hModelessDlgWnd,&msg)){
                   TranslateMessage(&msg);
                   DispatchMessage(&msg);
            }
          }
    }
と書き、この5行目のIsDialogMessage(hModelessDlgWnd,&msg)の
「hModelessDlgWnd」(グローバル変数)に現在開いているタブページ(モードレスダイアログ)の
ハンドルを入れるものとします。
 実際には、それぞれのタブページのウインドウプロシージャ内で
WM_ACTIVATEメッセージが送られてきた時にこの「hModelessDlgWnd」にそのタブページのウインドウハンドルをセットしています。

 この方法は「普通の独立したモードレスダイアログ」についてはうまく動作してくれます。(つまり何かの子ウインドウでは無く、それ単体のウインドウである場合)
 ところがタブ・コントロールウインドウの子として作った場合にはどうもうまく行きません。
 どうもこのタブコントロールの親であるモーダルダイアログの方にばかりフォーカスが飛んで行くようです。

 テストとしてWinMainのメッセージループ内、hModelessDlgWnd(グローバル変数)を介してではなく、直接「hTabPage1」を書いてやってみたりもしたんですがこれも駄目でした。

 タブページ上のコントロールには全てWS_TABSTOP(0x00010000)をセットして、タプ・ページの親であるタブコントロール・ウインドウにもWS_TABSTOPを付けています。


 このような場合にキーボードからのフォーカス移動を行うにはどのようにすれば良いのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re:  タブコントロールのページ内のタブ・キーによるフォーカスの移動

#2

投稿記事 by softya(ソフト屋) » 14年前

こちらが参考になるのでは?

「教えて! Watch - TABによるフォーカス移動」
http://oshiete1.watch.impress.co.jp/qa4671118.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jacoby

Re:  タブコントロールのページ内のタブ・キーによるフォーカスの移動

#3

投稿記事 by jacoby » 14年前

返信有難うございます。
付けていただいたリンクを読んでいるところですが、
どうもこれはメイン・ウインドウに対するタブ移動のようで少し自分のやりたい
こととは変わっているのかなと思います。(でも有難うございます)
モーダルダイアログ上のタブコントロールのページ内での
TABキーによるフォーカス移動(紛らわしくてすみません)ですが、
そのベースとなるモーダルダイアログ上ではしっかりTABキーのフォーカス移動は
効いています。タブのページ内が効かなくて。
もう少し粘ってみようと思います。また何か見たほうがいいところがあったら
教えて下さい。

閉鎖

“C言語何でも質問掲示板” へ戻る