windows菜单

菜单:非常重要的用户界面
从编程的角度来对菜单进行分类:静态菜单,动态菜单,快捷菜单

静态菜单:在菜单资源编辑器预先编辑好直接加载
动态菜单:在程序运行的过程中通过代码生成
快捷菜单:是前两种菜单的组合,在菜单资源编辑器预先编辑好,然后在程序运行的过程中动态显示

对于菜单而言,可以理解为一个二维数组
菜单里面的每一个元素叫菜单项,菜单项包含两个最基本的要素: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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风赤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值