/*    フローティングメニュー 2000/ 4/ 2 宍戸 輝光 */ #include HINSTANCE hInst; LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); HWND hwMain; 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(LTGRAY_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "CWindow"; wndclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION); RegisterClassEx(&wndclass); /* ウインドウクラス登録 */ hwMain = CreateWindow("CWindow","フローティングメニュー", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,320, 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) { static HMENU hMenu,hMenuP; POINT pt; switch (iMsg) { case WM_CREATE: hMenu=CreateMenu(); /* トップレベルメニュー */ hMenuP=CreateMenu(); /* フローティングメニュー */ /* フローティングメニュー作成 */ AppendMenu(hMenuP,MF_STRING,1,"Message"); AppendMenu(hMenuP,MF_STRING,2,"Exit"); /* フローティングメニューをメニューに登録 */ AppendMenu(hMenu,MF_POPUP,(UINT)hMenuP,NULL); 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(hwMain); break; } return 0; case WM_DESTROY : /* 終了処理 */ PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }