/* 右クリックポップアップメニュー 2005/ 1/ 1 宍戸 輝光 */ #include LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; WNDCLASSEX wndclass; HWND hwMain; /* ウインドウクラス設定 */ 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 = "CLMenu"; wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* ウインドウクラス登録 */ RegisterClassEx(&wndclass); /* ウインドウ作成 */ hwMain = CreateWindow("CLMenu", "右クリックポップアップメニュー", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 320, NULL, NULL, hInstance, NULL); /* ウインドウを表示 */ ShowWindow(hwMain, iCmdShow); while (GetMessage(&msg, NULL, 0, 0)) { /* メッセージループ */ TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { static HMENU hMenuP; POINT pt; switch (iMsg) { case WM_CREATE: /* ポップアップメニュー作成 */ hMenuP = CreatePopupMenu(); /* メニュー項目追加 */ AppendMenu(hMenuP, MF_STRING, 1, "Message"); AppendMenu(hMenuP, MF_STRING, 2, "Exit"); return 0; case WM_RBUTTONDOWN: /* マウスカーソル座標取得 */ pt.x = LOWORD(lParam); pt.y = HIWORD(lParam); /* スクリーン座標に変換 */ ClientToScreen(hwnd, &pt); /* カーソル位置にメニューを出す */ TrackPopupMenu(hMenuP, 0, pt.x, pt.y, 0, hwnd, NULL); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case 1: /* Messageメニュー */ MessageBox(hwnd, "Test", "Test", MB_OK); break; case 2: /* Exitメニュー */ DestroyWindow(hwnd); break; } return 0; case WM_DESTROY : /* 終了処理 */ DestroyMenu(hMenuP); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, iMsg, wParam, lParam) ; }