菜单:非常重要的用户界面
从编程的角度来对菜单进行分类:静态菜单,动态菜单,快捷菜单
静态菜单:在菜单资源编辑器预先编辑好直接加载
动态菜单:在程序运行的过程中通过代码生成
快捷菜单:是前两种菜单的组合,在菜单资源编辑器预先编辑好,然后在程序运行的过程中动态显示
对于菜单而言,可以理解为一个二维数组
菜单里面的每一个元素叫菜单项,菜单项包含两个最基本的要素:1、菜单项的名字;2、该菜单项唯一的标识id
每一个元素可以是嵌套的子菜单数组
AppendMenuA函数
BOOL AppendMenuA(
HMENU hMenu, //菜单栏,下拉菜单,子菜单或快捷菜单的句柄将被更改。
UINT uFlags, //控制新菜单项的外观和行为。此参数可以是以下值的组合。
UINT_PTR uIDNewItem, //新菜单项的标识符,或者,如果uFlags参数设置为MF_POPUP,则为下拉菜单或子菜单的句柄。
LPCSTR lpNewItem //新菜单项的内容。lpNewItem的解释取决于uFlags参数是否包含以下值。
);
MF_CHECKED
在菜单项旁边放置一个复选标记。如果应用程序提供了复选标记位图(请参见SetMenuItemBitmaps,则此标志在菜单项旁边显示复选标记位图。
MF_DISABLED
禁用菜单项,使其不能被选择,但标志不会将其变为灰色。
MF_ENABLED
启用菜单项以便可以选择它,并将其从灰色状态恢复。
MF_GRAYED
禁用菜单项并将其变为灰色,以便无法选择它。
MF_MENUBARBREAK
功能与菜单栏的MF_MENUBREAK标志相同。对于下拉菜单,子菜单或快捷菜单,新列与旧列之间用竖线分隔。
MF_MENUBREAK
将项目放在新行(用于菜单栏)或新列(用于下拉菜单,子菜单或快捷菜单)中,而不分隔列。
MF_OWNERDRAW
指定该项目是所有者绘制的项目。在第一次显示菜单之前,拥有菜单的窗口会收到WM_MEASUREITEM消息,以检索菜单项的宽度和高度。所述WM_DRAWITEM然后消息被发送到所有者窗口每当菜单项的外观必须更新的窗口过程。
MF_POPUP
指定菜单项打开一个下拉菜单或子菜单。该uIDNewItem参数指定的句柄下拉菜单或子菜单。此标志用于将菜单名称添加到菜单栏,或将菜单项打开到下拉菜单,子菜单或快捷菜单的菜单项。
MF_SEPARATOR
画一条水平分隔线。此标志仅在下拉菜单,子菜单或快捷菜单中使用。该行不能灰显,禁用或突出显示。该lpNewItem和uIDNewItem参数将被忽略。
MF_STRING
指定菜单项是文本字符串;所述lpNewItem参数是一个指向该字符串。
MF_UNCHECKED
不在项目旁边放置复选标记(默认)。如果应用程序提供复选标记位图(请参见SetMenuItemBitmaps),则此标志在菜单项旁边显示清除位图。
InsertMenuA函数.
BOOL InsertMenuA(
HMENU hMenu,
UINT uPosition,
UINT uFlags,
UINT_PTR uIDNewItem,
LPCSTR lpNewItem
);
MF_BYPOSITION
0x00000400L
指示uPosition参数给出新菜单项的从零开始的相对位置。如果uPosition为-1,则新菜单项将附加到菜单末尾。
InsertMenu(hmenu2, 0, MF_BYPOSITION, 20086, _T("撤销"));
InsertMenu(hmenu2, 20086, MF_BYCOMMAND, 20087, _T("剪切"));//按id号插入,插入到20086这个id号前面
InsertMenu(hmenu2, 1, MF_BYPOSITION, 20088, _T("复制"));//按下标插入,插入到下标1的位置
按照下标和id是倒叙输出
所有的menu操作都要写在updawindows()之前,否则就要通过 SetMenu(hWnd, hmenu);//更新菜单
EnableMenuItem函数
BOOL EnableMenuItem(
HMENU hMenu,
UINT uIDEnableItem,
UINT uEnable
);
MF_GRAYED
0x00000001L
表示该菜单项已禁用并显示为灰色,因此无法选择它。
MF_ENABLED
0x00000000L
表示该菜单项已启用并从灰色状态还原,因此可以选择它。
MF_BYPOSITION
0x00000400L
表示uIDEnableItem给出菜单项的从零开始的相对位置。
所有的插入都类似于链表最后插入的在最上面显示。
右键菜单
case WM_CREATE:
rMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU2));
break;
case WM_LBUTTONDOWN:
{
POINT pt;
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
//需要客户区的坐标转为屏幕坐标
ClientToScreen(hWnd, &pt);
HMENU h1 = GetSubMenu(rMenu,0);//把g_hRMenu里面的0列表示的菜单给到h1
//弹出右键菜单
TrackPopupMenu(h1,//哪一个菜单
TPM_LEFTALIGN | TPM_TOPALIGN,//菜单风格
pt.x, pt.y,//右键菜单的起始坐标
0,
hWnd,
nullptr);
}break;