• 締切済み

TABによるフォーカス移動

実行環境: Microsoft Visual Studio 2005 質問: TABによるフォーカス移動が行えません。どのようにソースを変更すれば宜しいか教えてください。 以下ソース //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HINSTANCE main_inst; static HFONT main_hfont; main_inst = (HINSTANCE)GetWindowLong( hWnd, GWL_HINSTANCE ) ; static HWND hEdit1,hEdit2,hEdit3; switch (msg) { case WM_SETFOCUS: SetFocus(hEdit1); break; case WM_COMMAND: switch(LOWORD(wp)){ case ID_EDIT1: if(wp == VK_TAB) SetFocus(hEdit2); break; case ID_EDIT2: if(wp == VK_TAB) SetFocus(hEdit3); break; case ID_EDIT3: if(wp == VK_TAB) SetFocus(hEdit1); break; } case WM_CREATE: hEdit1 = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("EDIT"),NULL,WS_CHILD|ES_NUMBER|WS_VISIBLE|ES_AUTOHSCROLL, 106, 89, 158, 34, hWnd, (HMENU)ID_EDIT1, main_inst, NULL ); hEdit2 = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("EDIT"),NULL,WS_CHILD|ES_NUMBER|WS_VISIBLE|ES_NUMBER|ES_AUTOHSCROLL, 106, 143, 158, 34, hWnd, (HMENU)ID_EDIT2, main_inst, NULL ); hEdit3 = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("EDIT"),NULL,WS_CHILD|ES_NUMBER|WS_VISIBLE|ES_AUTOHSCROLL, 106, 198, 158, 34, hWnd, (HMENU)ID_EDIT3, main_inst, NULL ); CreateWindow( TEXT("BUTTON"),TEXT("起動"),WS_CHILD|WS_VISIBLE|BS_MULTILINE|BS_CENTER, 89, 301, 112, 40, hWnd, (HMENU)ID_BUTTON, main_inst, NULL ); main_hfont = CreateFont( -19, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, FIXED_PITCH|FF_MODERN, TEXT("MS ゴシック") ); SendDlgItemMessage( hWnd, ID_EDIT1, WM_SETFONT, (WPARAM)main_hfont, MAKELPARAM(TRUE, 0) ); SendDlgItemMessage( hWnd, ID_EDIT2, WM_SETFONT, (WPARAM)main_hfont, MAKELPARAM(TRUE, 0) ); SendDlgItemMessage( hWnd, ID_EDIT3, WM_SETFONT, (WPARAM)main_hfont, MAKELPARAM(TRUE, 0) ); SendDlgItemMessage( hWnd, ID_BUTTON, WM_SETFONT, (WPARAM)main_hfont, MAKELPARAM(TRUE, 0) ); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }

みんなの回答

回答No.4

>それとWS_TABSTOPに関してですが、 >ダイアログボックスでの使用ではないでしょうか? 誰も「ダイアログボックスだけでしか使えない」とは言ってない。 ・メインウィンドウのwc.cbWndExtraにDLGWINDOWEXTRAを指定する。 ・スタイルにWS_TABSTOPを足す。 ・メッセージループでIsDialogMessage()を呼ぶ。 ・ウィンドウプロシージャでDefWindowProcの変わりにDefDlgProcを呼ぶ。 ・ウィンドウの地の色が「ダイアログのデフォルトの地の色」に変わるから、WM_CTLCOLORDLGメッセージに対し「通常ウィンドゥのデフォルト色のブラシ」を返し、地の色を変える。 という細工をすれば「メインウィンドウが、ダイアログ属性を持ったまま作られるので、タブストップが効く」ようになる。 >私がやっているのはメインウィンドウでのTABによるフォーカスを行いと考えています。 騙されたと思って、上のように細工してみよう。メインウィンドゥで勝手にタブでフォーカス移動するぞ。

すると、全ての回答が全文表示されます。
  • os6v100i
  • ベストアンサー率44% (16/36)
回答No.3

#1さんの仰るとおり、WM_COMMANDの処理はなんの意味も持ちませんね。 また、WM_COMMANDメッセージの仕様から、WM_COMMANDを処理してもTabキーによるフォーカス移動は実現できないと思います。 Windowsのウィンドウ、ダイアログ、モードレスダイアログのメッセージ処理について調べて見ると良いと思います。 ヒント:キーワードはIsDialogMessage

hcs101010
質問者

お礼

ご回答有難うございます。 Windowsのウィンドウ、ダイアログ、モードレスダイアログのメッセージ処理について、そしてヒントを頂いたIsDialogMessageについて勉強してみます。

すると、全ての回答が全文表示されます。
回答No.2

つ~かさ、タブでのフォーカス移動、なんで自分でやるの? CreateWindowExする時にWS_TABSTOP付けりゃ、DefWindowProcん中で勝手にやってくれるだろ? それと、TABキーでhEdit1→hEdit2→hEdit3→hEdit1とフォーカス移動するけど、なんでShift+TABを処理しない? Shift+TABを押した場合は、フォーカスが逆順でhEdit3→hEdit2→hEdit1→hEdit3と移動しないとならないぞ。

すると、全ての回答が全文表示されます。
回答No.1

switch(LOWORD(wp)){ case ID_EDIT1: if(wp == VK_TAB) SetFocus(hEdit2); の4行の意味を考えてみた事はあるか? LOWORD(wp)がID_EDIT1と等しい時は、wpはVK_TABとは等しくない。 wpがVKTABと等しい時は、LOWORD(wp)はVK_TABとは等しくない。 つまり「wpが何になってても、SetFocus(hEdit2);が実行される事は永久に来ない」って事。 これじゃフォーカス移動する訳がない。 以下の2つのソースは、どちらも、何もしない。 ソース1 int a; a = VK_TAB; switch (a) { case ID_EDIT1: // aはVK_TABなので、ここには来ない if(a == VK_TAB) // ここには来ないから、このif文も実行しない SetFocus(hEdit2); break; } ソース2 int a; a = ID_EDIT1; switch (a) { case ID_EDIT1: // aはID_EDIT1なので、ここに来る if(a == VK_TAB) // aはVK_TABではないので、次の文は実行しない SetFocus(hEdit2); // if文は絶対に成り立たないので、この文は無意味 break; } 自分が「何をしているか?」を、もう一度考えてみよう。

hcs101010
質問者

お礼

ご回答有難うございます。 確かにご指摘なさられた4行に意味がない事に気づきました。 もう一度考え直してみたいと思います。 それとWS_TABSTOPに関してですが、私はC言語を始めてまだ間もないので知識がなく調べてみてはいたのですがダイアログボックスでの使用ではないでしょうか? 私がやっているのはメインウィンドウでのTABによるフォーカスを行いと考えています。 説明不足で申し訳ありませんでした。

すると、全ての回答が全文表示されます。

関連するQ&A