• 締切済み

TabでEDITのフォーカスを移す

猫でもの第36章で、TabでEDITのフォーカスを移す処理を やっているけど、それをするのにサブクラスは必須ですか? WS_TABSTOPはEDITではサブクラスをしないと意味がないんですか? EM_SETTABSTOPSもサブクラスをしないと意味がないんですか? EM_SETTABSTOPSの具体的な使い方も教えてください。

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>サブクラスを使っていないソースを教えてください。 >ちなみに、フックするなどまわりくどいくだらない発想はご勘弁です。 なんかえらい勘違いをされてると思うんですけど・・・ WS_TABSTOPをスタイルに追加するだけです。 こちらから言わせてもらうと、「猫でも・・・」の EDITのスタイルに、どれもWS_TABSTOPがついてないのが 不思議です。 サンプルを鵜呑みにするの、危険ですよ。 すべてが正しいと思わないほうがいいです。 #ソースそのままはっつけてコンパイルしただけなのが ばればれです。 自分でダイアログエディタでデザインすると すぐにわかるはずなんですけどね。 EM_SETTABSTOPSのサンプルは、なかなかいいのがないですね。 VBのサンプルなら見つかったんですけど。 http://vbvbvb.com/jp/gtips/0701/gSendMessageEmSettabstops.html もちろんサブクラス化なんかしてないですよ。 当然フックも。

全文を見る
すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>猫でもの第36章で、TabでEDITのフォーカスを移す処理を >やっているけど、それをするのにサブクラスは必須ですか? なくてもかまいません。 >EM_SETTABSTOPSもサブクラスをしないと意味がないんですか? そんなことはありません。 >EM_SETTABSTOPSの具体的な使い方も教えてください。 複数行エディットボックスでタブが入力されたときの、 タブストップの幅を指定します。

hurce
質問者

お礼

ちなみに、フックするなどまわりくどいくだらない発想はご勘弁です。

hurce
質問者

補足

サブクラスを使っていないソースを教えてください。

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

関連するQ&A

  • Tabでのフォーカス(win32)

    edit = CreateWindow( TEXT("EDIT") , NULL , WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_NUMBER | ES_LEFT , 0 , 0 , 35 , 18 , hWnd , (HMENU)1 , ((LPCREATESTRUCT)(lParam))->hInstance , NULL ); でエディットコントロールを作成しました。 フォーカスがエディットコントロールにある時、TABキーで フォーカスをなくしたいのですが、どうしたらよいでしょうか? デバッガーで追ってみると、WM_KEYDOWNがウィンドウに送られていませんでした。

  • EDITのTAB移動

    EDITのTAB移動で一番簡単な方法を教えてください。 サブクラスが一番簡単な方法ですか?

  • 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; }

  • 開いたタブ(ウィンドウ)にフォーカスが当たらない

    IE8 をタブモードで利用したとき、新しく開いた タブ(ウィンドウ)にフォーカスが当たりません。 JavaScript の window.open で別タブ(ウィンドウ)を 表示する処理を onload イベントで行うと、新しい タブ(ウィンドウ)にフォーカスがあたりません。 button のクリックイベントで表示した場合は、 新しいタブ(ウィンドウ)にフォーカスが当たります。 やりたいことは submit してページを再表示するときに 新しいタブ(ウィンドウ)を表示して、そちらにフォー カスを設定することです。 また、できればブラウザのバージョンによって処理を 切り替えるようなことはしたくありません。 何か原因や解決策などありましたらご教授ください。 よろしくお願いします。 <この現象が発生する環境> IE8 と IE7 で下記のように設定した場合 ツール → インターネットオプション → 全般タブ  → タブ → 設定  → ポップアップの発生時  の設定を   「常に新しいタブでポップアップを開く」  にする。 ※IE9 ではこの現象は発生せず、新しいタブ(ウィンドウ)に  フォーカスがあたります。 ※IE7, 8 でもタブモードではなく、別ウィンドウで開く  設定になっている場合は、新しいウィンドウにフォーカスが  あたります。 <サンプルソースと説明> (説明) test1.html から window.open で test2.html を表示します。 onload で表示したときは test2.html のタブ(ウィンドウ)に フォーカスがあたりません。 button のクリックイベントで表示したときは test2.html の タブ(ウィンドウ)にフォーカスがあたります。 ---(test1.html)---------------------------------- <html> <head runat="server"> <title></title> <script language="javascript" type="text/javascript"> window.onload = function () { OpenWindowTest(); } function OpenWindowTest() { var TestWin = window.open('test2.html'); TestWin.document.focus(); } </script> </head> <body> <form> <div> <input type="button" value="button" onclick="OpenWindowTest();" /> <br /> <input type="submit" value="submit" /> </div> </form> </body> </html> --------------------------------------------------- ---(test2.html)---------------------------------- <html> <body onload="window.focus();"> テストページ </body> </html> ---------------------------------------------------

  • リストビューにフォーカスを設定するには

    開発環境はVC++6.0、SDK、Windows2000です。 CreateWindowEx( 0, WC_LISTVIEW, "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | LVS_REPORT | LVS_SINGLESEL, 10, 10, 515, 271, hdwnd, (HMENU)100, hInstance, NULL); 上記APIでリストビューを表示しているのですが、表示直後には先頭ラインにフォーカスが設定されません。 当然表示された後にマウス操作にてラインをクリックするとフォーカスがあたるのですが、 表示された直後に指定行にフォーカスをあてたい場合にはどうすればよいでしょうか? ご存知の方ご教授お願いします。

  • テキストボックスからフォーカス外す

     editBox = CreateWindow(   "EDIT",   "あああ",   SS_CENTER | WS_CHILD | WS_VISIBLE,   0,0,100,20,   hWnd,   NULL,   hInstance,   NULL); テキストボックスのフォーカスを外すにはどうしたら いいんですか? ESCキーでフォーカスを外そうと思ったら、 テキストボックスにフォーカスがあるせいで case WM_KEYDOWN が動作しません。 フォーカスを外すというソース自体も分かっていません。  case WM_KEYDOWN:   if( wParam == VK_ESCAPE )    ?  break;

  • Tabコントロールに貼り付けたダイアログ内のフォーカス移動について

    Tabコントロールを使ったソフトを製作中です。 各Tab内のダイアログは、CHILDフラグの付いたウインドウをリソースで作っておき、CreateDialog関数で作成し、TCN_SELCHANGEメッセージを拾ってShowWindowでどのダイアログを見せるかを切り替えています。 マウス操作は問題ないのですが、キーボードのタブキーによるフォーカスの移動がうまくできません。子ダイアログ内の各コントロールを移動させたいのですが、どこにフォーカスがあっても、1回タブキーを押すとTabコントロールにフォーカスが移り、それ以降どこにも移動しないという状態です。 何かメッセージをうまく処理していないのでしょうか?解決策があればご教授お願いします。

  • WS_TABSTOPが機能するコントロールを作る

    Windowsにおいてダイアログに貼り付ける独自のコントロールを作っているのですが、TABキーでコントロールのフォーカスを移動させたとき、自分のコントロールを素通りしてしまいます。 もちろんウィンドウスタイルにWS_TABSTOPを指定して生成しているのですが、今さらながらWS_TABSTOPはWS_MINIMIZEBOXと同じ値であることに気づきました。 もしかすると、WS_TABSTOPではなく、WS_MINIMIZEBOXとして認識されているのではないか?と思いましたが、 その違いがどのように判別されているのかが分かりませんでした。 SPY++で調べてみると、確かに今回問題のコントロールのスタイルは0x50030000となっていますが、SPY++はこれをWS_CHILDWINDOW、WS_VISIBLE、WS_MINIMIZEBOX、WS_MAXIMIZEBOXと表示しています。 一方、普通にダイアログに貼り付けたプッシュボタンでは、スタイルは0x50010000なのにSPY++はWS_CHILDWINDOW、WS_VISIBLE、WS_TABSTOP、BS_PUSHBUTTONとなっていて、同じ値であるのにWS_TABSTOPとWS_MINIMIZEBOXを区別して表示しています。 これは、どういう理屈なのでしょうか? ご存じの方、よろしくお願いします。

  • windowsプログラミンで質問です

    EDITコントロールを一度クリックすると、そこにフォーカスが当たり  | ←こんな感じの棒が点滅します。 そのコントロールにフォーカスが当たったことを知らせてくれるメッセージは無いですか? 別の WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU を持つ親ウィンドウをクリックしても ずっとこのEDITコントロールにフォーカスが当たりっぱなしなので質問しました。 もしそんなメッセージが無いならば、ESCボタンが押されたらSetFocus関数で強制的にフォーカスを外そうかなとも考えたのですがEDITコントロールにフォーカスがあたっていると WM_CHARではメッセージを受け取ることが出来ませんでした。 どうすればよいのでしょうか?

  • ダイアログボックスのボタンコントロールのフォーカスについて

    ダイアログボックスのボタンコントロールのフォーカスについて 教えて下さい。  モーダルダイアログにボタン「OK」を一つ貼り付けて それを「標準のボタン」(BS_DEFPUSHBUTTON)として作成したのですが ダイアログ表示直後は下画像(1)のようになってエンターキーを押しても 反応しません。何度かカーソルキーを押すとようやく(2)のように ボタンに枠線がついてエンターで押せるようになるのですが ダイアログ表示直後に(2)のようにするにはどうするべきでしょうか? ダイアログのコールバック・プロシージャ(WM_INITDIALOG部分でボタン作成) LRESULT CALLBACK SettingWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ switch (msg){ case WM_INITDIALOG: CreateWindowEx(0x00000000,"BUTTON","OK", WS_CHILD |WS_VISIBLE| WS_TABSTOP | BS_DEFPUSHBUTTON, 16,16,80,21,hWnd,(HMENU)IDOK,GetModuleHandle(0),0); return TRUE; } return FALSE; }