/* ウインドウのサブクラス化 2000/ 6/25 宍戸 輝光 */ #include HWND hwMain,hwWin[4]; HINSTANCE hInst; WNDPROC lpfnProc[4]; LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); LRESULT CALLBACK CtrProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, PSTR szCmdLine,int iCmdShow){ MSG msg; WNDCLASSEX wndclass; hInst=hInstance; /* プロセスのハンドルを保存 */ wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "CWindow"; wndclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION); RegisterClassEx(&wndclass); /* ウインドウクラス登録 */ hwMain = CreateWindow("CWindow","ウインドウのサブクラス化", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,256,96, NULL,NULL,hInstance,NULL); ShowWindow(hwMain,iCmdShow); /* ウインドウを表示 */ UpdateWindow(hwMain); while (GetMessage(&msg,NULL,0,0)) { /* メッセージループ */ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { int i; switch (iMsg) { case WM_CREATE: /* ウインドウ作成時の処理 */ for (i=0;i<4;i++) { /* EDITの配列作成 */ hwWin[i]=CreateWindow("EDIT",NULL,WS_CHILD|WS_VISIBLE, 8+i*40,8,32,24,hwnd,(HMENU)i,hInst,NULL); /* EDITのウインドウプロシージャ−を置換 */ lpfnProc[i]=(WNDPROC)SetWindowLong(hwWin[i],GWL_WNDPROC,(DWORD)CtrProc); } return 0; case WM_DESTROY : /* 終了処理 */ PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } LRESULT CALLBACK CtrProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { int i; /* メッセージを受信したウインドウを特定 */ i=GetWindowLong(hwnd,GWL_ID); switch (iMsg) { case WM_CHAR: if ((DWORD)wParam=='\t') { /* Tabキー */ /* 次のウインドウにフォーカス移動 */ SetFocus(hwWin[(i+1) % 4]); return 0; } break; } return (CallWindowProc(lpfnProc[i],hwnd,iMsg,wParam,lParam)); }