SetMenu和LoadMenu函数学习

《Windows API每日一练》9.25 系统菜单 实例在窗口过程处理WM_CREATE消息时,调用LoadMenu函数,分别加载"MenuMain"、"MenuEdit"和"MenuFile"三个菜单资源,并返回三个菜单资源的句柄。实例的窗口过程拦截系统菜单消息WM_SYSCOMMAND,分别根据菜单ID处理"ABOUT..."、"HELP..."和"REMOVE..."菜单。点击ID_MAIN菜单时,调用SetMenu函数将"MenuMain"菜单分配给窗口。点击ID_EDIT菜单时,调用SetMenu函数将"MenuEdit"菜单分配给窗口。 阅读详情

函数功能:该函数分配一个新菜单到指定窗口。

    函数原型:BOOL SetMenu(HWND hWnd,HMENU hMenu);

    参数:

    hWnd:菜单被分配到其中的窗口的句柄。

    HMenu:新菜单的句柄。如果菜单参数为NULL,则窗口的当前菜单被删除。

    返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLaSError函数。

    备注:窗口被重画来反映菜单的修改。函数SetMenu替换原来的菜单(如果存在),但并不将其销毁。应用程序必须调用函数DestroyMenu来销毁菜单。

 

 

一个单文档MFC程序,想要在程序中手工修改框架菜单,在CMainFrame::OnCreate中加入如下语句:  
  -------------------------------------------------------------------  
  //   Create   a   new   menu   for   the   application   window.  
  CMenu   mainMenu1;  
  mainMenu1.CreateMenu();  
  CMenu   popupMenu;  
  popupMenu.CreatePopupMenu();  
  popupMenu.AppendMenu(MF_STRING,   ID_APP_EXIT,   (LPCTSTR)"E&xit");  
  mainMenu1.AppendMenu(MF_POPUP,   (UINT)opupMenu.m_hMenu,   "&File");  
   
  popupMenu.Detach();  
   
  //   Remove   and   destroy   old   menu  
  SetMenu(NULL);  
  CMenu*   old_menu   =   CMenu::FromHandle(m_hMenuDefault);  
  // old_menu->DestroyMenu(); //***为什么有此句就出错  
   
  //   Add   new   menu.  
  SetMenu(&mainMenu1);  
  //   Assign   default   menu  
  m_hMenuDefault   =   mainMenu1.m_hMenu;  
   
                    mainMenu1.Detach();//该句可要可不要?  
   
  --------------------------------------------------------------------  
  我的问题是:  
  1)上面这种方法创建新菜单对吗?  
  2)为什么有old_menu->DestroyMenu();主这名就出错,难道不用消毁旧菜单吗,可MSDN中却说SetMenu   will   not   destroy   a   previous   menu.   An   application   should   call   the   CMenu::DestroyMenu   member   function   to   accomplish   this   task.  
  3)在什么情况下要调用Detach(),上面最后一句为什么可要可不要?

 

----------------------------------------------------------------------

我也刚学习菜单,一点看法仅供参考:1)MSND上不是说:SetMenu的作用是Sets   the   "current   menu"   to   the   "specified   menu".   Causes   the   window   to   be   "redrawn   "to   reflect   the   menu   change.   也就是说它不是销毁当前菜单,而是重画菜单的改变部分。只有当程序结束时,系统会自动调用DestroyMenu销毁菜单。因此不用我们调用DestroyMenu去销毁菜单。  
  2)Detach函数从CMenu对象中释放菜单句柄,这样可以防止CMenu在移出作用域时新菜单被破坏,  
            通过CMenu   mainMenu1;  
  mainMenu1.CreateMenu();  
                    SetMenu(&mainMenu1);  
  完成了对菜单重新设置,用不用mainMenu1.Detach();都可以。而  
                    CMenu   popupMenu;  
  popupMenu.CreatePopupMenu();  
  popupMenu.AppendMenu(MF_STRING,   ID_APP_EXIT,   (LPCTSTR)"E&xit");  
  mainMenu1.AppendMenu(MF_POPUP,   (UINT)opupMenu.m_hMenu,   "&File");  
  必须有:  
  popupMenu.Detach();  
  至于为什么我也说不清。

从SD更新字库到FLASH,再用LCD显示 用Flash当字库存储载体。思路是先将要用到的字库文件存在SD卡,然后存储到Flash,LCD显示时候从Flash中读取 还挺顺利的,移植的原子的程序,自己稍加修改,主要是我的液晶屏函数,Flash读写函数,还有存储文件的flash地址不一样。一晚上搞定,大小字体都OK。挺高兴哈哈。这几天忙工作事情有点耽搁了学习进展嘿嘿 在text.c的showstr函数中char的字体颜色随意设置的,可以显... 阅读详情

相关推荐

多目标跟踪中使用trackeval评估dancetrack运行结果

trackeval使用

qq_46144849的博客 1782

SetMenu用法

SetMenu-函数功能函数功能:该函数分配一个新菜单到指定窗口。函数原型:BOOL SetMenu(HWND hWnd,HMENU hMenu);参数:hWnd:菜单被分配到其中的窗口的句柄。HMenu:新菜单的句柄。如果菜单参数为NULL,则窗口的当前菜单被删除。SetMenu-返回值    返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。若想获得更

zhouqian88423的专栏 4456

开关电源的纹波和噪声电压-抑制方法

开关电源(包括AC/DC转换器、DC/DC转换器、AC/DC模块和DC/DC模块)与线性电源相比较,最突出的优点是转换效率高,一般可达80%~85%,高的可达90%~97%;其次,开关电源采用高频变压器替代了笨重的工频变压器,不仅重量减轻,体积也减小了,因此应用范围越来越广。 但开关电源的缺点是由于其开关管工作于高频开关状态,输出的纹波和噪声电压较大,一般为输出电压的1%左右(低的为输出电压的0.5%左右),最好产品的纹波和噪声电压也有几十mV;而线性电源的调整管工作于线性状态,无纹波电压,输出的噪声电压也

ltqdxl的博客 1万+

windows菜单资源SetMenu、LoadMenu、WM_COMMAND消息处理菜单命令

创建窗口菜单 SetMenu、LoadMenu函数 WM_COMMAND消息

单于的学习历程 952

别再被systemd-resolved坑了!银河麒麟V10下用Bind9搭建内网DNS的完整避坑指南

本文详细介绍了在银河麒麟V10和Ubuntu系统下部署Bind9 DNS服务器时,如何解决与systemd-resolved的端口冲突问题。提供了五种专业级解决方案,包括彻底禁用systemd-resolved、智能端口转发等,并特别针对银河麒麟V10的安全加固需求给出了配置建议和诊断工具,帮助用户高效搭建内网DNS服务。

weixin_30342209的博客 653

超声波雾化驱动设计:专用芯片FM8118替代MCU的工程实践

超声波雾化是一种基于压电陶瓷谐振原理的高频能量转换技术,其核心在于在1.6–2.4MHz频段精准激励雾化片以实现高效水分子破碎。传统采用通用MCU配合分立MOSFET的方案受限于PWM频率上限、栅极驱动能力不足及EMI控制困难,导致雾化效率低、温升高、可靠性差。专用雾化芯片(如FM8118)通过集成2.1MHz振荡器、零电压开关(ZVS)控制与过流/过热双重保护,从架构层面解决高频功率驱动的本质约束,显著提升驱动效率(达83.7%)与系统鲁棒性。该技术广泛适用于桌面加湿器、医疗雾化器、农业微喷等对体积、功耗

weixin_34620658的博客 404

Win32学习笔记 - 菜单相关函数(一)

1、CreateMenu()HMENU CreateMenu(VOID); 功能   该函数创建一个弹出式菜单。此菜单最初是空的,但可用函数InsertMenultem,AppendMenu,和lnsertMenu来填入菜单项。 参数:无。 返回值:   如果函数调用成功,返回值是新创建菜单的句柄。如果函数调用失败,返回值是NULL。若想获得更多的错误信息,请调用GetLastError函数。

Vinx Blog 1590

matlab 点云按高程进行赋色【2024最新版】

首先按照Z轴方向求取所在点云的高程极值(包括高程最大值与最小值),然后将高程归一化到0~255范围内,最后采用matlab中的colormap颜色渲染函数进行赋色并保存渲染结果到点云。

点云侠的博客 3341

菜单基本操作

前言 本主要介绍菜单的基本使用,在MFC中用于指定菜单项位置有两种方式,它们是MF_BYCOMMAND和MF_BYPOSITION,在菜单操作中经常用到,具体含义如下: MF_BYCOMMAND 是指将相关参数解释为菜单项ID(缺省值)MF_BYPOSITION 是指将相关参数解释...

weixin_30596343的博客 1018

如何通过单步调试的方法,找到 SAP Gateway 到底把 Fiori 应用发送的 OData 请求,投递到哪一台 ABAP 后台服务器了?

这是一个 Count 请求,得到服务器响应的数据是 204,这个 204 会以数字的形式,显示在 Fiori Launchpad tile 上。那如果当前 Gateway 系统可以连接到多台 ABAP 后台服务器,比如下图所示,可以连接 SAP S/4HANA,ERP 或者 SAP CRM,我怎么知道 SAP UI5 应用上显示的数据,到底来自哪一台 ABAP 后台服务器呢?,就是上图 ABAP 调试器里断点停留的位置,即 SAP Frontend 服务器,通过 RFC 将 OData 请求投递给。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 640

基于STM32+华为云设计的智能鱼缸

本项目基于STM32单片机设计一款基于物联网的智能鱼缸系统,并通过应用侧接口开发上位机APP实现远程对鱼缸参数的检测和控制。该系统包括水温检测、水质检测、自动或手动换水、氛围灯灯光变换和自动或手动喂食等功能,可以帮助用户更好地管理鱼缸,提高鱼儿的生存率,同时增强用户对家庭装饰品的掌控感和科技感。

1万+

Qt下拉菜单

AI对话未来丨智能写作对话:`setMenu()`是`QWidget`类的一个成员函数,在`Qt`中用于将一个菜单作为一个控件的下拉菜单设置。具体来说,菜单对象以下是`setMenu()`函数的使用示例:```cpp// 创建一个QMenu对象// 为菜单添加一个操作// 为菜单添加另一个操作// 创建一个QPushButton对象// 设置按钮的文本// 设置按钮的下拉菜单为menu对象```

m0_60274660的博客 3423

【WRF-Urban数据集】中国60个城市的1 km分辨率城市冠层参数(UCPs)

中国60个城市的1 km分辨率城市冠层参数(UCPs)

WW、forever的博客 1063

LoadMenu 与 MAKEINTRESOURCE

LoadMenu:HMENU LoadMenu( HINSTANCE hInstance, // handle to module LPCTSTR lpMenuName // menu name or resource identifier);其中参数 lpMenuName是用MAKEINTRESOURCE产生的,而#define MAKEINTRESOURCEA(i) (

lingll's blog 2290

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Windows 编程[17] - 更换菜单: LoadMenu、DestroyMenu、SetMenu

本例效果图: 本例在资源文件中备有两组菜单, 程序实现运行时切换. 本例使用的资源文件(TestRes.rc): MyMenu1 MENUEX BEGIN MENUITEM "Open" ,101 MENUITEM "Edit" ,102 MENUITEM "Help" ,103 MENUITEM "Chinese" ,104 ,M...

weixin_33989058的博客 298

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Win32---->菜单和其他资源

如上图所示,用来设计快捷键。比如上面的图就是,设置 ID 为 ID_FILE_NEW 的菜单栏选项的快捷键为 Ctrl + N 当我点击 Ctrl + N 时就触发了 点击 ID_FILE_NEW 的效果。这些函数加载的资源通常不需要释放,程序退出时由系统释放,程序自己创建的对象在不需要的时候通常需要释放,而程序或系统中定义的资源通常不需要释放。在一个资源脚本中,可以定义多个主菜单或多个加速键表,也可以定义其他各种各样的资源,例如图标,光标,位图等。

m0_72753035的博客 218

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VC 对话框添加菜单条

<br />OnInitDialog中添加:<br />CMenu menu; menu.LoadMenu(IDR_MENU);//这里是你的菜单的ID SetMenu(&menu);

OYJJ的专栏 2986

MFC Dialog 添加菜单栏

/*加一个成员变量*/ CMenu m_menu;/*添加菜单 in OnInitDialog*/ m_menu.LoadMenu(IDR_MENU/*menu id here*/); SetMenu(&m_menu);

OYJJ的专栏 8267

菜单

1.      增加菜单资源 2.      CMenu类 3.      SetMenu函数 4.      LoadMenu函数(CMenu类的一个成员函数) 5.      COMMAND和UPDATE_COMMAND_UI 6.      关于添加菜单UPDAT

行者 801

SDK编程中菜单资源的加载?

在程序中引用菜单 大多数Windows应用程序在资源描述文件中只有一个菜单。您可以给菜单起一个与程序名称相同的文字的名称。程序写作者经常将程序名用于菜单名称,以便相同的字符串可以用于窗口类别、程序的图标名称和菜单名称。然后,程序在窗口的定义中为菜单引用该名称: wndclass.lpszMenuName = szAppName ; (实践中发现菜单的名字前面不能有IDR_MENU这样容易跳...

coolsooner 134

MFC中如何将Menu资源添加到主对话框中

还是写个博客备忘吧,自己这个脑子哦。 在主对话框**Dlg.cpp中,找到OnInitDialog()这个函数,在 “// TODO: 在此添加额外的初始化代码”下面,添加这样的三行代码。 // TODO: 在此添加额外的初始化代码 CMenu m_Menu; m_Menu.LoadMenu(IDR_MENU1); SetMenu(&amp;m_Menu); 前提是你...

Lunar_Queen的博客 1437

更换系统菜单

使用CMenu *pSystemMenu = GetSystemMenu(FALSE);CMenu hMenu = LoadMenu(ID_MENU1);pSystemMenu -&gt;SetMenu(&amp;hMenu); //更改菜单栏//如果使用NULL 参数SetMenu(NULL);则表示不用菜单栏 ...

weixin_34399060的博客 125

C++窗口编程:显示菜单

C++窗口编程实现菜单

larwar的博客 2386
上一篇: GetWindowLong函数学习
下一篇: Debug和Release区别
mxling
博客等级 码龄19年 37粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值