• Windows菜单


    1 Windows菜单    1

    1.1 窗口菜单和弹出菜单    1

    1.2 使用SetMenu    2

    1.3 使用TrackPopupMenu    4

    1 Windows菜单

    1.1 窗口菜单和弹出菜单

    Windows菜单分为两类:窗口菜单和弹出菜单。窗口菜单主要用来放在某个窗口上。弹出菜单有两个作用,一是鼠标右键单击时显示的菜单;二是作为子菜单添加到窗口菜单。

    打开"记事本"程序,右键菜单就是一个弹出菜单:

    1.1 弹出菜单

    "记事本"程序的菜单栏部分就是一个窗口菜单,它又包含了"文件""编辑"……这些弹出菜单。

    1.2 窗口菜单

    窗口菜单由CreateMenu创建,使用SetMenu将其设置到某个窗口,使用DestroyMenu销毁。

    弹出菜单由CreatePopupMenu创建,使用AppendMenuInsertMenuItem将其添加到窗口菜单或上一级弹出菜单,也可以使用TrackPopupMenu显示弹出菜单。弹出菜单的销毁同样是调用DestroyMenu函数。

    1.2 使用SetMenu

    下面以代码的方式创建图1.2所示的窗口菜单:

    //创建窗口菜单

    HMENU hMenuWnd = ::CreateMenu();

    {//创建"文件"弹出菜单,并将其添加到窗口菜单

    //创建"文件"菜单,这是一个弹出菜单

    HMENU hMenuFile = ::CreatePopupMenu();

    //"文件"菜单添加"新建"菜单项,0x8000是菜单项ID

    ::AppendMenu(hMenuFile,MF_STRING,0x8000,_T("新建"));

    //"文件"菜单添加"打开"菜单项

    ::AppendMenu(hMenuFile,MF_STRING,0x8001,_T("打开"));

    //"文件"菜单添加一条分隔线

    ::AppendMenu(hMenuFile,MF_SEPARATOR,0,NULL);

    //继续给"文件"菜单添加菜单项

    ... ... ... ...

    //将整个"文件"菜单添加到窗口菜单

    ::AppendMenu(hMenuWnd,MF_POPUP,(UINT)hMenuFile,_T("文件"));

    }

    {//创建"编辑"弹出菜单,并将其添加到窗口菜单

    //创建"编辑"菜单,这是一个弹出菜单

    HMENU hMenuEdit = ::CreatePopupMenu();

    //"编辑"菜单添加菜单项

    ... ... ... ...

    //将整个"编辑"菜单添加到窗口菜单

    ::AppendMenu(hMenuWnd,MF_POPUP,(UINT)hMenuEdit,_T("编辑"));

    }

    {//创建"格式"弹出菜单,并将其添加到窗口菜单

    ... ... ... ...

    }

    {//创建"查看"弹出菜单,并将其添加到窗口菜单

    ... ... ... ...

    }

    {//创建"帮助"弹出菜单,并将其添加到窗口菜单

    ... ... ... ...

    }

    //将窗口菜单设置到窗口上

    ::SetMenu(hWnd,hMenuWnd);

    代码说明:

    1SetMenu的第二个参数必须是窗口菜单句柄,即这个句柄必须由CreateMenu函数创建,而不能是CreatePopupMenu创建的弹出菜单句柄。

    2::AppendMenu(hMenuWnd,MF_POPUP,(UINT)hMenuFile,_T("文件"));将弹出菜单hMenuFile添加到窗口菜单hMenuWnd。它只是把hMenuFile这个句柄添加到hMenuWnd所维护的数据结构里,即它添加的只是弹出菜单的一个引用,并不是把弹出菜单的所有菜单项添加到窗口菜单。因此,可以先将hMenuFile添加到hMenuWnd,再给hMenuFile添加菜单项,如下面的代码所示:

    {//创建"文件"弹出菜单,并将其添加到窗口菜单

    //创建"文件"菜单,这是一个弹出菜单

    HMENU hMenuFile = ::CreatePopupMenu();

    //将整个"文件"菜单添加到窗口菜单

    ::AppendMenu(hMenuWnd,MF_POPUP,(UINT)hMenuFile,_T("文件"));

    //"文件"菜单添加"新建"菜单项,0x8000是菜单项ID

    ::AppendMenu(hMenuFile,MF_STRING,0x8000,_T("新建"));

    ... ... ... ...

    }

    3DestroyMenu(hMenuWnd)将销毁它的子菜单、孙菜单。也就是说执行DestroyMenu(hMenuWnd)之后,hMenuFilehMenuEdit……也被销毁了。上面的代码里,在::SetMenu(hWnd,hMenuWnd);之前增加如下测试代码:

    DestroyMenu(hMenuWnd);

    hMenuWnd = ::CreateMenu();

    ::AppendMenu(hMenuWnd,MF_POPUP,(UINT)hMenuFile,_T("文件"));

    DestroyMenu(hMenuWnd);将销毁hMenuWndhMenuFile,所以AppendMenu将会增加无效的hMenuFilehMenuWnd。可以想象,"文件"菜单里是不会有菜单项的。

    4、何时调用DestroyMenu(hMenuWnd)销毁窗口菜单呢?应该是不再使用时销毁,具体的就是在处理窗口的WM_DESTROY消息时销毁,或者在SetMenu更换菜单后销毁。

    1.3 使用TrackPopupMenu

    上一节的代码里包含了弹出菜单的创建,并增加到窗口菜单。弹出菜单还有一个作用就是用来显示图1.1所示的右键弹出菜单,方法就是调用TrackPopupMenu函数。需要注意的是:TrackPopupMenu的第一个参数必须是一个弹出菜单的句柄,就是说它必须由CreatePopupMenu创建。

    以上一节的代码为例:

    //可以显示出弹出菜单

    TrackPopupMenu(hMenuFile,...);

    //无法显示弹出菜单,因为hMenuWnd是一个窗口菜单,不是弹出菜单

    TrackPopupMenu(hMenuWnd,...);

    //GetSubMenu(hMenuWnd,0) 返回的其实就是hMenuFile

    //因此下面的代码可以正常显示弹出菜单

    TrackPopupMenu(GetSubMenu(hMenuWnd,0),...);

    当使用LoadMenu从资源里载入菜单时,其返回的是一个窗口菜单句柄,直接传递给TrackPopupMenu是无法正常显示的。必须使用GetSubMenu获得窗口菜单里的弹出菜单句柄,才能正常调用TrackPopupMenu

    执行TrackPopupMenu之后,可以立即调用DestroyMenu销毁菜单。

  • 相关阅读:
    Windows10系统PHP开发环境配置
    hexo博客MathJax公式渲染问题
    js获取单选框和复选框的值并判断值存在后允许转跳
    Google HTML/CSS 编码规范
    js阻止表单提交的两种方法
    php下安装动态扩展库的相关事项
    PHP程序员的职业规划,走进PHP后端工程师的世界
    allen今天来开通我的程序员的博客
    ajax
    jQuery语法
  • 原文地址:https://www.cnblogs.com/hanford/p/6163690.html
Copyright © 2020-2023  润新知