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;
}
お礼
1,2.WM_SIZEでやるとタイムラグが有り1テンポ遅れて文字サイズが変わると思って渋っていたのですが実際にやってみるとうまくいきました。 3.デリートする順番ですが以前指摘を受けたようにフォントをクリエイトしてセンドした後デリートすると文字が大きくならない(多分瞬間的にだけ大きくなっている)のです。 だからフォントをクリエイトする直前まで以前のフォントをデリートしてはいけないのです。 とにかく以下のコーディングでうまくいきました。 ありがとうございました。 LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP) { RECT rt; int W,H; static HFONT hF; switch(wM) { case WM_COMMAND: SetFocus(hW);return 0; case WM_SIZE: GetClientRect(hW,&rt); W=rt.right-rt.left;H=rt.bottom-rt.top; if(hF!=0)DeleteObject(hF); hF=CreateFont(H/4,W/4,0,0,FW_NORMAL,FALSE,FALSE,FALSE,SHIFTJIS_CHARSET,OUT_TT_ONLY_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,"MS Pゴシック"); SendMessage(hB,WM_SETFONT,(WPARAM)hF,1); MoveWindow(hB,W/4,H/4,W/2,H/2,1); return 0; case WM_DESTROY: DeleteObject(hF); PostQuitMessage(0); return 0; default: return(DefWindowProc(hW,wM,wP,lP)); } } WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) { WNDCLASS wc; HWND hW; MSG ms; wc.lpszClassName ="I"; wc.lpfnWndProc =(WNDPROC)WinProcedure; wc.hInstance =hI; wc.style =CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; wc.cbClsExtra =0; wc.cbWndExtra =0; wc.hIcon =0; wc.hCursor =LoadCursor(0,IDC_ARROW); wc.hbrBackground =HBRUSH(COLOR_WINDOW+1); wc.lpszMenuName =0; RegisterClass(&wc); hW=CreateWindow("I","親",WS_OVERLAPPEDWINDOW,0,0,99,99,0,0,hI,0); hB=CreateWindow("BUTTON","子",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,0,0,0,0,hW,0,hI,0); ShowWindow(hW,SW_SHOW); UpdateWindow(hW); while(GetMessage(&ms,0,0,0)) { TranslateMessage(&ms); DispatchMessage(&ms); } return (ms.wParam); }