メインループでメッセージを拾ってモードレスで表示した画面のTabキー制御を行いたいのですが、以下のプログラムでTabキーはコントロール間を移動しますが、移動の順番がタブオーダーと全く違います。
-------------------------------------------------
// メイン ウィンドウを作成して、実行します
Form1^m_form = gcnew Form1();
m_form->Show();
msg.message = WM_CREATE;
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (!IsDialogMessage( (HWND)m_form->Handle.ToPointer(), &msg ))
{
// メッセージが未処理の場合は処理を行う
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
-------------------------------------------------
m_form->ShowDialog();
にしたり、上記ループを
Application::Run(gcnew Form1());
に変更するとちゃんとタブオーダーの順番で移動します。
訳有りで、ループ処理を変えたくはありません。
ネットで調べる限りタブ移動について「IsDialogMessage」を
入れるという疑問はあったのですが、それ以降の動作については
何も書かれていないようです。
上記ループの書き方でタブ移動がうまく行えない場合が
あるのでしょうか?
どなたかご存知でしたら教えてください
No.1
- 回答日時:
何で開発してますか? たぶん VC2005以降のCLRだと思いますが
メインフォーム(Form1)の中のコントロールのタブ移動制御ってことでしょうか
メッセージループ自体は『.NET Freamework』に任せてしまえば良いように思います
タブオーダーの指定はどのようになさったのでしょう
タブオーダーの指定を変更すると form1.hのInitializeComponentの中の各コントロールを定義している部分で
this->button1->TabIndex = 1;
などでタブオーダー順が変更されていると思います
この順序でタブキーでの移動をするはずなんですが …
現象を再現できる最低限の手順を投稿してみましょう
早速の回答ありがとうございます。
開発環境はVC2005のCLRです。
テスト画面でコントロールの数を減らしてやっています。
画面には3つのボタンを貼り付けました。
ソース内でのタブオーダーは
this->button1->TabIndex = 0;
this->button2->TabIndex = 1;
this->button3->TabIndex = 2;
となっていますが、
実行すると
button1 -> button3 -> button2
の順に移動します。
No.2ベストアンサー
- 回答日時:
コントロールの登録順が関連しているようです
button1,button2,button3の順序で登録した場合
InitComponentの最後のほうで
this->Controls->Add(this->button3);
this->Controls->Add(this->button2);
this->Controls->Add(this->button1);
といった具合に並ぶかと思います
この状態で起動されたフォームを SPY++などで確認してみると
button1の次のウィンドウは無しになっています前のウィンドウはbutton2を指しています
同様に button2は前がbutton3で次がbutton1
button3の場合前が無し次がbutton2
となっています
つまり button1にフォーカスがある場合に『TAB』が押されると
次のウィンドウを探しますがこれがありません
したがってこの親であるForm1は 自分の子ウィンドウのリストにある最初の子にフォーカスを与えます
この最初の子が InitCompornentで最初に追加されたコントロールになります
したがってbutton3がフォーカスを受け取ることになります
同様に button3にフォーカスがあるとき『TAB』を押すと
次のコントロールであるbutton2がフォーカスを受け取ります
this->Controls->Add(this->button1);
this->Controls->Add(this->button2);
this->Controls->Add(this->button3);
といった順に登録するとご希望通りのTAB順になります
.NET freameworkでは TabIndexを参照して次のコントロールを取得しているのであろうと思います
お示しのメッセージループではフォームを閉じた際に例外が発生してしまうと思います
Form1がDisposedされてしまっているのに Handleプロパティにアクセスするためです
ありがとうございました。
Addの順番を見たら確かにばらばらでした。
順番を昇順に並び替えたら、きちんと動作しました。
タブオーダーがきかなかったのはショックですが。。。
No.3
- 回答日時:
> タブオーダーがきかなかったのはショックですが。
。。タブオーダーが利かなかったのではありません
ちゃんと処理されております
ただ、処理方法が.NET FrameworkとWinAPIとで違うから今回のような現象になってしまうのです
扱う環境を適切に使用する場合起きない現象だと思います
現に Application::Run経由の場合きちんとデザイナーで指示したタブオーダーになりますし、コントロールの登録順を希望するとおりに配置すればWinAPIでも処理されます
無理やり WinAPIで行う際に 新たなフォームを追加するとアプリケーションクラスから使えないようです
# 詳細の調査はしておりません
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
ActiveXコントロールを.NETにイ...
-
エクセルのコントロールツール...
-
スピンボタンを右クリックして...
-
DateTimePickerでに年月までし...
-
TabControlとToolBarの背景色変更
-
ExcelVBAのリストボックスで項...
-
ワードのドロップダウンリスト
-
ダイアログボックスのボタンコ...
-
ダイアログベースのexeで最適な...
-
コモンダイアログコントロール...
-
C#タブコントロールについて質...
-
.NETでチャートにスクロールバ...
-
フォームでPDFを表示させた...
-
C++とWin32APIでタブコントロー...
-
EXCELVBA リストボックスで選択...
-
エクセル - リストボックスのマ...
-
EXCEL VBAでwebページを保存す...
-
Delphiの学習に適したWebサイト...
-
C#でChartコントロールを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
DateTimePickerでに年月までし...
-
スピンボタンを右クリックして...
-
フォームでPDFを表示させた...
-
ActiveXコントロールを.NETにイ...
-
コモンダイアログコントロール...
-
連続で印刷すると画像が更新さ...
-
警告表示を非表示にしたい
-
エクセル - リストボックスのマ...
-
ダイアログボックスのボタンコ...
-
TabControlとToolBarの背景色変更
-
文字色を変えたい(ACCESS VBA)
-
Excel VBAでのMultipageの選択
-
EXCELVBA リストボックスで選択...
-
ワードのドロップダウンリスト
-
WM_SIZEを発生させる方法
-
CEdit の内容が変わった時にメ...
-
リストコントロール(MFC or API...
-
VBAでリストボックス内で↑↓の操...
おすすめ情報