【发布时间】:2019-12-19 20:59:43
【问题描述】:
我正在创建一个带有如下下拉列表的窗口:
如果我点击前四个选项中的任何一个,包括它们的子选项,那么我想处理那个选项。问题是我需要在这些选项中使用WM_LBUTTONDOWN、WM_LBUTTONUP 和其他类似的东西,但不知道如何使用。
我不知道在case WM_COMMAND 内部做什么来处理所有这些选项,所以这是我的WindowProcedure:
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_LBUTTONDOWN
case WM_CREATE:
AddMenu(hwnd);
break;
case WM_COMMAND:
switch(wParam)
{
case Line_DDA:
break;
case Line_Midpoint:
break;
case Line_Parametric:
break;
case Ellipse_Direct:
break;
case Ellipse_Polar:
break;
case Ellipse_Midpoint:
break;
case Line_Clipping:
break;
case Convex_Filling:
break;
case Load_File:
break;
case Save_File:
break;
}
break;
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
这是AddMenu():
void AddMenu(HWND hwnd)
{
hMenu = CreateMenu();
HMENU hSubMenu = CreateMenu();
HMENU hLineMenu = CreateMenu();
HMENU hEllipseMenu = CreateMenu();
AppendMenu(hLineMenu, MF_STRING, Line_DDA, "DDA");
AppendMenu(hLineMenu, MF_STRING, Line_Midpoint, "Midpoint");
AppendMenu(hLineMenu, MF_STRING, Line_Parametric, "Parametric");
AppendMenu(hEllipseMenu, MF_STRING, Ellipse_Direct, "Direct");
AppendMenu(hEllipseMenu, MF_STRING, Ellipse_Polar, "Polar");
AppendMenu(hEllipseMenu, MF_STRING, Ellipse_Midpoint, "Midpoint");
AppendMenu(hSubMenu, MF_POPUP, (UINT_PTR)hLineMenu, "Line");
AppendMenu(hSubMenu, MF_POPUP, (UINT_PTR)hEllipseMenu, "Ellipse");
AppendMenu(hSubMenu, MF_SEPARATOR, NULL, NULL);
AppendMenu(hSubMenu, MF_STRING, Line_Clipping, "Line Clipping");
AppendMenu(hSubMenu, MF_SEPARATOR, NULL, NULL);
AppendMenu(hSubMenu, MF_STRING, Convex_Filling, "Convex Filling");
AppendMenu(hSubMenu, MF_SEPARATOR, NULL, NULL);
AppendMenu(hSubMenu, MF_STRING, Load_File, "Load");
AppendMenu(hSubMenu, MF_STRING, Save_File, "Save");
AppendMenu(hMenu, MF_POPUP,(UINT_PTR)hSubMenu , "Draw");
SetMenu(hwnd, hMenu);
}
【问题讨论】:
-
需要“在这些选项中使用 WM_LBUTTONDOWN、WM_LBUTTONUP 和其他类似的东西”是什么意思?你的意思是当一个菜单项触发时你想根据鼠标按钮的状态执行不同的行为?
-
是的,完全正确。我想画一条线,椭圆..等,为此我需要获取它的坐标(x,y),
WM_LBUTTONDOWN和WM_LBUTTONUP可以使用它的坐标 -
哦,所以你想知道如何实现用户扫出的整个交互,例如通过鼠标拖动椭圆?
-
您不会将
WM_LBUTTON...消息与菜单本身一起使用,而仅与窗口一起使用。WM_COMMAND将告诉您用户选择了哪个菜单项。在某处的变量中记住该选择。 THEN,当你稍后得到WM_LBUTTONDOWN时,将那些鼠标坐标记住在另一个变量中,然后当你得到WM_MOUSEMOVE时,你可以根据需要在两组坐标之间绘制,基于第一个变量的值你保存了,当你收到WM_LBUTTONUP时停止绘图。