// // メニューの制御 // // 2001/ 1/ 4 宍戸 輝光 // #include HINSTANCE hInst; LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); HWND hwMain; HMENU hMenu,hMenu1,hMenuSub; HMENU hMenuSub1; int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, PSTR szCmdLine,int iCmdShow){ MSG msg; WNDCLASSEX wndclass; // ウインドウクラス設定 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(hInstance,"APP_ICON"); wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "CWindow"; wndclass.hIconSm = NULL; RegisterClassEx(&wndclass); // ウインドウクラス登録 hwMain = CreateWindow("CWindow","メニューの制御", WS_OVERLAPPEDWINDOW | WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT, 280,120,NULL,NULL,hInstance,NULL); // メニュー作成 hMenu=CreateMenu(); // トップレベル hMenu1=CreateMenu(); // 「ファイル」メニュー hMenuSub=CreateMenu(); // 「画像情報」メニュー // 「メニュー1」メニュー項目作成 AppendMenu(hMenu1,MF_STRING,1,"項目2有効(&S)"); AppendMenu(hMenu1,MF_STRING,2,"項目2(&2)"); AppendMenu(hMenu1,MF_SEPARATOR,0,NULL); AppendMenu(hMenu1,MF_STRING,3,"終了(&X)"); // 「設定」メニュー項目作成 hMenuSub1=CreateMenu(); // 「サブメニュー」メニュー AppendMenu(hMenuSub1,MF_STRING,11,"ラジオ1(&1)"); AppendMenu(hMenuSub1,MF_STRING,12,"ラジオ2(&2)"); AppendMenu(hMenuSub1,MF_STRING,13,"ラジオ3(&3)"); hMenuSub=CreateMenu(); // 「サブメニュー」メニュー AppendMenu(hMenuSub,MF_POPUP,(UINT)hMenuSub1,"サブ項目(&S)"); // トップレベルメニューに追加 AppendMenu(hMenu,MF_POPUP,(UINT)hMenu1,"メニュー1(&1)"); AppendMenu(hMenu,MF_POPUP,(UINT)hMenuSub,"サブメニュー(&S)"); CheckMenuRadioItem(hMenuSub,11,13,12,MF_BYCOMMAND); // ウインドウにメニューを設定 SetMenu(hwMain,hMenu); while (GetMessage(&msg,NULL,0,0)) { /* メッセージループ */ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch (iMsg) { case WM_INITMENUPOPUP: if (lParam==0 && (GetMenuState(hMenu1,1,MF_BYCOMMAND)&MF_CHECKED)!=0) EnableMenuItem((HMENU)wParam,2,MF_ENABLED); else EnableMenuItem((HMENU)wParam,2,MF_GRAYED); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case 1: if ((GetMenuState(hMenu1,1,MF_BYCOMMAND)&MF_CHECKED)==0) CheckMenuItem(hMenu1,1,MF_CHECKED); else CheckMenuItem(hMenu1,1,MF_UNCHECKED); break; case 3: DestroyWindow(hwnd); break; case 11: case 12: case 13: CheckMenuRadioItem(hMenuSub,11,13,LOWORD(wParam),MF_BYCOMMAND); break; } return 0; case WM_DESTROY : // 終了処理 PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }