/* リソースを使わないモーダルダイアログ 2000/ 5/21 宍戸 輝光 */ #include HWND hwMain; HINSTANCE hInst; LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); LRESULT CALLBACK DialogProc(HWND,UINT,WPARAM,LPARAM); DWORD dialog(); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, PSTR szCmdLine,int iCmdShow){ MSG msg; WNDCLASSEX wndclass,diaclass; 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(LTGRAY_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "CWindow"; wndclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION); RegisterClassEx(&wndclass); /* ウインドウクラス登録 */ diaclass.cbSize = sizeof(wndclass); diaclass.style = CS_HREDRAW | CS_VREDRAW; diaclass.lpfnWndProc = DialogProc; diaclass.cbClsExtra = 0; diaclass.cbWndExtra = 0; diaclass.hInstance = hInstance; diaclass.hIcon = NULL; diaclass.hCursor = LoadCursor(NULL, IDC_ARROW); diaclass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); diaclass.lpszMenuName = NULL; diaclass.lpszClassName = "CDialog"; diaclass.hIconSm = NULL; RegisterClassEx(&diaclass); /* ウインドウクラス登録 */ hwMain = CreateWindow("CWindow","プロトタイプウインドウ", WS_OVERLAPPEDWINDOW | WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT, 256,96,NULL,NULL,hInstance,NULL); while (GetMessage(&msg,NULL,0,0)) { /* メッセージループ */ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HWND btDialog; DWORD dwMRes; char lpszStr[64]; switch (iMsg) { case WM_CREATE: /* ウインドウ作成時の処理 */ /* ボタン作成 */ btDialog=CreateWindow("Button","ダイアログ",WS_CHILD|WS_VISIBLE, 8,8,128,32,hwnd,(HMENU)0,hInst,NULL); return 0; case WM_COMMAND: /* コマンドメッセージ */ switch (LOWORD(wParam)) { case 0: /* 「ダイアログ」ボタン */ dwMRes=dialog(); /* ダイアログ呼び出し */ wsprintf(lpszStr,"%dを選択",dwMRes); SetWindowText(hwnd,lpszStr); break; } return 0; case WM_DESTROY : /* 終了処理 */ PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } DWORD dialog() { /* モーダルダイアログ関数 */ HWND hwDialog; DWORD dwRes; MSG msg; /* ダイアログのウインドウプロシージャ−に結果変数のアドレスを渡す */ DialogProc(NULL,(UINT)(&dwRes),0,0); /* ダイアログボックス作成 */ hwDialog = CreateWindow("CDialog","モーダルダイアログ", WS_OVERLAPPEDWINDOW | WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT, 256,96,NULL,NULL,hInst,NULL); /* メインウインドウを無効化してモーダルに */ EnableWindow(hwMain,FALSE); /* メッセージループ */ while (dwRes==0) { /* ダイアログが結果を返すまでループ */ GetMessage(&msg,NULL,0,0); TranslateMessage(&msg); DispatchMessage(&msg); } /* メインウインドウを有効にしてモーダル解除 */ EnableWindow(hwMain,TRUE); BringWindowToTop(hwMain); /* ダイアログの選択結果を返す */ return dwRes; } LRESULT CALLBACK DialogProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam) { HWND btN1,btN2; static LPDWORD lpRes; if (hwnd==NULL) { /* 結果変数のアドレスを保存 */ lpRes=(LPDWORD)iMsg; *lpRes=0; return 0; } switch (iMsg) { case WM_CREATE: /* ウインドウ作成時の処理 */ /* ボタン作成 */ btN1=CreateWindow("Button","1番",WS_CHILD|WS_VISIBLE, 8,8,80,32,hwnd,(HMENU)0,hInst,NULL); btN2=CreateWindow("Button","2番",WS_CHILD|WS_VISIBLE, 96,8,80,32,hwnd,(HMENU)1,hInst,NULL); return 0; case WM_COMMAND: /* コマンドメッセージ */ switch (LOWORD(wParam)) { case 0: /* 1番ボタン */ *lpRes=1; DestroyWindow(hwnd); break; case 1: /* 2番ボタン */ *lpRes=2; DestroyWindow(hwnd); break; } return 0; case WM_DESTROY : /* 終了処理 */ if (*lpRes==0) /* どちらも選択されていなければ-1 */ *lpRes=-1; return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }