在窗口API中,我有一個彈出菜單,其中分別包含3行「Line」,「Circle」和「Exit」。如何知道Win32 API中的選定菜單項目
我的程序是讓用戶選擇要繪製的形狀,然後獲取點,參數(即線的起點和終點...)。這是我迄今爲止編寫的代碼的一部分。
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) {
HMENU hMenu;
POINT point;
HDC hdc;
hdc = GetDC(hwnd);
static int x1, y1,x2,y2,count = 0;
switch (msg) {
case WM_LBUTTONDOWN:
count++;
if (count == 1)
{
x1 = LOWORD(lParam);
y1 = HIWORD(lParam);
}
else
{
x2 = LOWORD(lParam);
y2 = HIWORD(lParam);
// I think the problem goes here, it never execute else part
//even if global_ID ==2, Am I missing something?
if (global_ID == 1)//Line
{DirectMethod(hdc, x1, y1, x2, y2, RGB(0, 0, 0));}
else if (global_ID == 2)//Circle
{Ellipse(hdc, x1, y1, x2, y2);}
count = 0;
}
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDM_FILE_LINE:
global_ID = 1;
break;
case IDM_FILE_CIRCLE:
global_ID = 2;//Global Variable
break;
case IDM_FILE_QUIT:
SendMessage(hwnd, WM_CLOSE, 0, 0);
break;
}
break;
case WM_RBUTTONUP:
point.x = LOWORD(lParam);
point.y = HIWORD(lParam);
hMenu = CreatePopupMenu();
ClientToScreen(hwnd, &point);
AppendMenuW(hMenu, MF_STRING, IDM_FILE_LINE, L"&line");
AppendMenuW(hMenu, MF_STRING, IDM_FILE_CIRCLE, L"&Circle");
AppendMenuW(hMenu, MF_SEPARATOR, 0, NULL);
AppendMenuW(hMenu, MF_STRING, IDM_FILE_QUIT, L"&Quit");
TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, point.x, point.y, 0, hwnd, NULL);
DestroyMenu(hMenu);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProcW(hwnd, msg, wParam, lParam);
}
我想什麼做的是,根據選擇的菜單項(直線,圓,......)我執行特定的一塊也依賴於從用戶(WM_LBUTTONDOWN)獲得鼠標點擊代碼。
例如: 如果用戶選擇「線」,我應該採取兩點來繪製該線。
你是什麼實際問題?您的代碼已經在檢測哪個菜單項被選中,這是由WM_COMMAND消息報告的。那麼,你的問題只是收集用戶的輸入?例如,你可以讓你的'WM_COMMAND'處理程序設置一個標誌,指示所需座標的數量,然後讓你的'WM_LBUTTONDOWN/UP'處理程序保存座標直到達到該數字。你遇到的實際問題是什麼? –
@RemyLebeau問題是當選擇一個菜單項我改變「global_ID」的值,以知道哪個菜單項被選中,但在「WM_LBUTTONDOWN」它「總是」執行if語句,永遠不會執行其他部分,我已調試該代碼和「global_ID」設置爲「2」。我的意思是假設執行「其他」部分,但總是執行「如果」部分 –
你應該在你的問題中說明這些細節。你所描述的不應該是可能的,因爲'global_ID'不是'WndProc()'本地的,所以'WM_COMMAND'指定的任何值都會被傳遞給後續的'WM_LBUTTONDOWN'。但是,代碼中存在邏輯漏洞:1)即使不應該出現鼠標點擊,也要計數。當你設置'global_ID'時,你不會將'count'重置爲0; 2)'global_ID'不是1或2時,'WM_LBUTTONDOWN'不應該做任何事情; 3)在調用'DirectMethod()'/'Ellipse()'... –