win32之菜单

菜单是软件开发之中不可或缺的一个部分,正因为菜单我们才能对一个软件窗口进行丰富多彩的操作,今天主要介绍win32的菜单的创建和其他菜单的相关函数。

本次使用的开发环境是vs2013,使用的开发语言是C/C++, 创建的项目是win32项目

这次主要介绍的是通过软件加载的方式进行菜单的创建,其实在vs2013的win32项目里面我们也可以直接添加菜单资源

我们可以在这里进行菜单项的编辑,添加和删除也可以对每一项进行属性的编辑

对属性进行编辑,选中某一项,单击鼠标右键

在右侧会出现属性编辑栏

然后我们需要定义菜单句柄然后加载菜单资源。(可以从资源里面找到菜单资源ID)

1菜单的分类

菜单的分类并没有一个严格的划分,但是按照不同的标准我们可以对菜单进行不同的类别的分类

分类一

顶层菜单--在我们窗口上面的菜单

     右键菜单--鼠标右键出现的菜单

     系统菜单--点击非客户区右键弹出的菜单

分类二

//菜单  window中一个很重要的用户界面
//分为三类:静态菜单,动态菜单,快捷菜单
//静态菜单:是在菜单编辑器里预先编辑好的,直接显示的
//动态菜单:在程序运行过程中创建及显示
//快捷菜单:是前两种组合

2.系统菜单

  2.1.获取系统菜单

      返回菜单句柄GetSystemMenu(窗口句柄, 标志);

      标志:true--- 删除旧菜单,回复到默认菜单

      False—返回当前系统菜单

  2.2删除系统菜单

          DeleteMenu(菜单句柄, 标记, 删除方式);

          删除方式:MF_BYCOMMAND:为默认值。说明参数nIDCheckItem表示菜单项的ID

         MF_BYPOSITION:说明参数Item表示菜单项的位置,第一个菜单项的位置是0

  2.3 添加系统菜单

    AppendMenu(菜单句柄, 模式,菜单ID,显示字符);

   MF_STRING:添加的是字符串

   MF_BITMAP:将位图用作菜单项。lpNewltem里含有该位图的句柄。

   MF_DISABLED:菜单项无效,该项不能被选择,菜单项不变灰。

   MF_ENABLED:菜单项有效,使该项能被选择,从变灰的状态恢复。

   MF_GRAYED:使菜单项无效并变灰,使其不能被选择。

   MF_OWNERDRAW:指定该菜单项为自绘制菜单项。(菜单第一次显示前,拥有菜

   单的窗口接收一个WM_MEASUREITEM消息来得到菜单项的宽和高。

   只要菜单项被修改,都将发送WM_DRAWITEM消息给菜单拥有者的窗口程序)

   MF_POPUP:指定菜单打开一个下拉式菜单或子菜单。

   MF_SEPARATOR:画一条水平区分线,下拉式菜单使用。参数IpNew和uID无用。

  2.4系统菜单相应

     WM_SYSCOMMEND消息.wparam的低字节是菜单ID.

3右键菜单

  3.1创建菜单

     CreatePopupMenu()创建右键菜单,是弹出式菜单,创建后返回句柄

   3.2添加显示

      添加菜单项:AppendMenu()参数如上

      显示菜单:

      TrackPopupMenu( 菜单句柄 显示方式 屏幕x坐标,屏幕Y坐标,0,窗口句柄,NULL  )

   注意:右键消息得到的x和y是客户端坐标,需要转换成屏幕坐标

        POINT p;  p.x = LOWORD(WPARAM)  p.y = HIWORD(WPARAM);

        客户端转换成屏幕坐标:ClienttoScreen(窗口句柄,point指针)

   3.3消息响应:

       点击菜单发送: WM_COMMAND消息      wparam的低字节是菜单ID.

 

4.顶层菜单

  4.1顶层菜单

顶层菜单 = 多个弹出式菜单项+弹出式菜单每一项

创建顶层菜单:    HMENU hMenu = CreateMenu(void)

    创建弹出式菜单:  HMEUE  createPopupMenu(void);

    把弹出式菜单插入顶层菜单:

     AppendMenu(顶层菜单句柄, MF_POPUP,弹出式菜单句柄,菜单名称);

     AppendMenu(弹出式菜单句柄,菜单风格,菜单ID,菜单名称 )

 4.2.菜单消息响应

         WM_COMMEND -----  WPARA 低字节保存的是菜单的ID

         根据菜单的id处理不同的菜单项

其他相关的菜单函数

使菜单项失效(激活或者静默菜单)
EnableMenuItem(hmenu, 5002, MF_BYCOMMAND | MF_GRAYED);

设置菜单,使菜单在这个位置刷新

 SetMenu(hWnd, hmenu);//在hWnd这个窗口,重新设置一次hmenu

修改菜单

ModifyMenu(hmenu, 8002, MF_BYCOMMAND, 9002, _T("点我"));

获取子菜单

    //GetSubMenu(h,0)得到h这个菜单句柄的0下标子列

 

猜你喜欢

转载自blog.csdn.net/ASZSYJ/article/details/82109943
今日推荐