Win32的菜单编程

win32(5)--Windows菜单 Windows程序的菜单,分为三大类:系统菜单、弹出式菜单(右键菜单)、顶层菜单(下拉式菜单)。 系统菜单: 在windows程序左上角的图标点击鼠标左键、或者在标题栏点击鼠标右键,出现的就是系统菜单。主要内容有:还原、移动、大小、最小化、最大化、关闭。 1、获取系统菜单: HMENU WINAPI GetSystemMenu( _In_ HWND hWnd,   _I 阅读详情

 

 
WIN32用户界面设计基础之Menus篇
 
2003-3-29 13:05:28   YESKY   陈孝强   阅读次数: 4835
 
一个菜单条总是属于一个窗口,当用户选定一个菜单项后,系统向菜单的父窗口发出消息,如果是普通菜单发送WM_COMMAND消息,如果是系统菜单发送WM_SYSCOMMAND消息。当鼠标悬浮在一个有下级菜单的菜单项上时,系统首先向菜单的父窗口发送WM_INITMENUPOPUP消息,然后展开子菜单。每一个菜单条由一个唯一的句柄指向,类型为HMENU。获得一个菜单的句柄使用GetMenu()函数,获得子菜单用GetSubMenu()、GetMenuItemInfo()。获得窗口的系统菜单句柄应当使用GetSystemMenu()。菜单除了句柄,还有ID,类似于按钮的ID,当菜单触发事件时,菜单ID被包含在WM_COMMAND或WM_SYSCOMMAND中一同发送。可以通过GetMenuItemID()获取一个菜单项的ID。访问菜单项时如果使用ID的方式会比较麻烦,一种变通的方法就是按照菜单项的以0为基数的索引进行访问,最左边的为0,向右逐次递增,最上边的为0,向下逐次递增。
 
  一、 菜单的建立
 
  1、 使用菜单资源
 
  首先设计好菜单,然后用LoadMenu()加载,再用SetMenu()设置,例如,在窗口的WM_CREATE消息中:
 
HMENU hMenu;
hMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_MENU1));
SetMenu(hWNd,hMenu);
 
  2、 内存菜单模板建立菜单
 
  有的应用程序允许用户自定义菜单,这就要求使用内存菜单模板来定义菜单,然后用LoadMenuIndirect()函数加载这个内存菜单模板获得菜单句柄,内存菜单模板由两部分组成:一个MENUITEMTEMPLATEHEADER(或者MENUEX_TEMPLATE_HEADER)结构和若干个MENUITEMTEMPLATE(或者MENUEX_TEMPLATE_ITEM)结构
 
  3、 CreateMenu()函数
 
  CreateMenu()函数返回一个指向空菜单的HMENU指针,利用这个指针向其中添加菜单项InsertMenuItem()。 动态菜单创建后必须调用SetMenu()函数
 
  二、 菜单的显示
 
  1、 对于已经通过在WNDCLASSEX窗口类注册时指定hMenu成员或者调用SetMenu()函数为其设定了父窗口的菜单,窗口显示,菜单自动显示
 
  2、 显示弹出菜单应使用TrackPopmenuEx()函数,例如
 
HMENU hpMemu;
hpMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_POPMENU);
TrackePopmenuEx(
hpMenu,//菜单的句柄
TPM_LEFTALIGN,//菜单和弹出点坐标的对齐方式
x,//弹出点X坐标
y,//弹出点Y坐标
hWnd,//父窗口句柄
NULL);
 
  3、 菜单显示过程中的消息
 
  用户单击菜单栏上的一项,父窗口接收到WM_INITITEM消息(在这个消息中可以绘制菜单),然后弹出菜单。当鼠标指向一个可以弹出子菜单的菜单项时,父窗口接收到WM_INITMENUPOPUP(可捕获此消息绘制子菜单),然后弹出子菜单。当鼠标在菜单上移动时,父窗口接收到WM_MENUSELECT消息,该消息中包含有当前的菜单项的索引号,可以对其进行引用。单击一个菜单项,产生WM_COMMAND消息,单击一个风格为MNS_NOTIFYBYPOS的菜单项,产生WM_MENUCOMMAND消息,该消息除了提供WM_COMMAND消息提供的数据外还额外添加了一个MENUINFO结构。右键弹出菜单发送WM_CONTEXTMENU消息。用户在一个菜单项上右击鼠标将产生WM_MENURBUTTONUP消息(例如在IE的收藏菜单的菜单项上右击弹出菜单的效果就可以通过捕获该消息实现)
三、 菜单的动态更改
 
  1、 插入新的菜单项InsertMenuItem()
 
  首先填写MENUINFO结构
 
typedef struct tagMENUITEMINFO {
UINT cbSize; 结构的大小,sizeof(MENUINFO)
NT fMask; 将要获得或者设置的项目,后面的哪些参数发挥作用受该参数的设置的影响。MIIM_BITMAP,hbmpItem将用来设置或返回按钮的位图,MIIM_ID,wID设置或返回菜单项的ID
UINT fType; 设置或返回菜单项的类型,MFT_BITMAP位图;MFT_STRING字符串;MFT_OWNERDRAW,发送WM_DRAWITEM和WM_MEASUREITEM消息用于绘制菜单项
UINT fState; 菜单项的状态:MFS_DEFAULT,默认;MFS_GRAYED,不可用;
UINT wID; 菜单项的ID,要求fMask中有MIIM_ID
HMENU hSubMenu; 下一级菜单的句柄,要求fMask中有MIIM_SUBMENU
HBITMAP hbmpChecked;
HBITMAP hbmpUnchecked;
ULONG_PTR dwItemData;
LPTSTR dwTypeData;
UINT cch;
HBITMAP hbmpItem;
} MENUITEMINFO, *LPMENUITEMINFO;
然后调用InsertMenu()函数
InsertMenu(
HMENU hMenu;
UINT nItems;
BOOL isPisition;//设为TRUE,nItems为菜单项的索引号,设为FALSE,nItems为菜单项的ID
LPCMENUITEMINFO lpmiinfo;
)
 
  2、 修改菜单项属性使用SetMenuItemInfo()函数
 
  3、 删除菜单项
 
    DeleteMenu()和RemoveMenu(),菜单项删除后用DrawMenuBar()重绘菜单显示更新
 
  四、 菜单特效
 
  1、 快捷菜单
 
  捕获父窗口的WM_CONTEXTMENU(用户在窗口中右击鼠标将激活该事件),调用函数
TrackPopupMenuEx();TrackPopupMenuEx(hm,
0,GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam),hWnd,NULL);hm为菜单句柄,GET_X_LPARAM(不知怎么不能用)宏获得事件发生时鼠标的X坐标,hWnd为父窗口句柄
 
  2、 位图菜单
 
    MENUITEMINFO结构的fMask中添加MIIM_BITMAP标志,为期hbmItem指定一个指向位图的指针
 
  五、 自绘制菜单
 
  1、 指定标志
 
  要实现自绘制必须使菜单项的风格符合要求,有两种方法可以做到,其一是用InsertMenuItem()函数插入,其二是用SetMenuItemInfo()函数修改,不论使用哪一个都必须填写一个MENUITEMINFO结构,为其fMask添加MIIM_FTYPE,为其fType添加MFT_OWNERDRAW。和列表框一样,对菜单项进行自绘制是设计到较多的数据传递,可以存放在MENUITEMINFO结构中,设置fMask为MIIM_DATA,然后给dwItemData成员赋值。WM_DRAWITEM(LPDRAWITEMSTRUCT)和WM_MEASUREITEM(LPMEASUREITEMSTRUCT)的参数中都含有itemData成语用于取出预先存放的数据。
 
  例如:
 
MENUITEMINFO mi;
HMENU hmn;
mi.fMask=MIIM_FTYPE;
milfType=MFT_OWNERDRAW;
hmn=GetMenu(hWnd);
SetMenuItemInfo(hmn,0,TRUE,&mi);
 
  2、 处理WM_MEASUREITEM消息
 
  用户单击,菜单即将显示时,菜单的父窗口接收到WM_MEASUREITEM消息,捕获此消息可以设置菜单项的尺寸,例如:
 
LPMEASUREITEMSTRUCT lpmis;
lpmis=(LPMEASUREITEMSTRUCT)lParam;
lpmis->itemHeight=48
lpmis->itemWidth=144;
 
  3、 处理WM_DRAWITEM消息
 
  WM_DRAWITEM消息的LPARAM参数为一个LPDRAWITEMSTRUCT指针,其中含有指向被绘制的菜单项的设备场景指针、菜单ID和状态等信息,根据这些信息进行绘制,例如:
 
LPDRAWITEMSTRUCT lpdis;
HDC hMem;
HBITMAP hbm;
hMem=CreateCompatibleDC(lpdis->hDC);
hbm=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_MENUMAP));
SelectObject(hMem,hbm);
BitBlt(lpdis->hDC,0,0,lpids->rcItem.right,lpdis->rcItem.bottom,hMem,0,0,SRCCOPY); 
 
 
 
 
Win32 SDK Gui编程系列之--创建菜单 但是,在标准菜单的情况下,鼠标光标在菜单项目上方,该项目被矩形包围,背景颜色也变淡,成为好看的界面。“Menu 1”和“Menu 2”的父菜单的手柄是hMenu,而“Menu 1.2”的父菜单的手柄是hSubMenu1。下面的程序放在菜单栏的顶级是标准菜单,下面的子菜单是业主抽签。在程序中写成&X、&A等时,X、A被称为快捷键,按Alt键的话,菜单上的X、A会出现下划线(下划线)。因此,虽然不需要转换为ARGB格式,但总的来说程序会很笨重,所以只有在实现标准菜单无法实现的功能时才使用所有者抽签是明智的。 阅读详情

相关推荐

win32 windows编程实现菜单栏

因为做东西需要,所以才想方设法实现菜单栏。 首先在(resource.h)加入菜单项的选项(按钮) //"编辑菜单" #define IDM_EDITCOPY  211//复制 #define IDM_EDITPASTE 212//粘贴 //帮助菜单 #define IDM_ABOUT     221//关于 #define IDM_GAME1      222//小游戏 #def

lwk0552的专栏 1461

python pywin32 获取窗体edit内容_pywin32

# 获取所有活动窗口的标题 # ! /usr/bin/env python # -*- coding: utf-8 -*- import time import win32gui import win32api import win32con """ 该类实现了:查找(定位)句柄信息,菜单信息 """ class HandleMenu(object): def __init__(se...

weixin_39970064的博客 3694

跟我一起玩Win32开发(4):创建菜单

也不知道发生什么事情,优快云把我的文章弄到首页,结果有不少说我在误人子弟,是啊,我去年就说过了,如果你要成为砖家级人物,请远离我的博客,我这个人没什么特长,唯一厉害的一点就是不相信权威,鄙视砖家,所以,我一直以来都有属于俺自己的编程思想。 就好比当年咏春拳刚浮出江湖的时候,武学界骂声不停,有人说:“这哪像拳?分明是女人拳。”然后不知道什么时候,一位叫叶问的大侠突然牛B起来了,于是,咏春拳的传播

老周——“易之道” 2万+

GetMenuItemInfo & InsertMenuItem 枚举和追加菜单操作

GetMenuItemInfo & InsertMenuItem 枚举和追加菜单操作

zgl7903的专栏 3742

Win32 SDK Gui编程系列之--弹出式菜单

例如,点击鼠标右键显示弹出菜单,通过WM_RBUTTONDOWN信息处理获得鼠标光标的客户端窗口坐标,ClientToScree用n函数转换为屏幕坐标。在上面的程序中,数据库名称的识别号码是ID_RDB、ID_RDB+256、ID_RDB+512、... 正在做。在制作程序时,偶尔会想知道它的构造。另一方面,在上面提到的弹出菜单中,第一次点击“数据库(D)”时,会生成和注册菜单。例如,如果表名是终端菜单的话,点击表名的话,会发送WM_COMMAND信息,得到的是这个表菜单项目中附的识别号码(wp)。

weixin_55465758的博客 753

win32 菜单编程学习1

win32 LoadMenu() 函数载入菜单资源,返回菜单句柄;

bcbobo21cn的专栏 514

[窗口操作] - 获取窗口菜单信息

结构 typedef struct MENUITEMINFO { UINT cbSize; // 结构大小,必须设置为 sizeof(MENUITEMINFO) UINT fMask; // 获取信息的类型 UINT fType; // 菜单类型 UINT fState; // 菜单状态 UINT wID; // 应用程序自定义值 HMENU hSubMenu; // 子菜单或下拉菜单句柄

LYSM 1055

TWINCAT3保姆级教程:手把手教你给Ecat从站烧录EEPROM(含XML配置避坑指南)

本文提供TWINCAT3环境下Ecat从站EEPROM烧录的完整教程,涵盖XML配置避坑指南。详细讲解环境准备、设备扫描、XML文件配置、EEPROM烧录流程及故障排查,帮助工程师高效解决设备识别问题,提升产线调试效率。

weixin_30693683的博客 517

易语言调用API之菜单函数

API之菜单函数 AppendMenu 在指定的菜单里添加一个菜单项 CheckMenuItem 复选或撤消复选指定的菜单条目 CheckMenuRadioItem 指定一个菜单条目被复选成“单选”项目 CreateMenu 创建新菜单 CreatePopupMenu 创建一个空的弹出式菜单 DeleteMenu 删除指定的菜单条目 DestroyMenu 删除指定的菜单 DrawMenuBar 为指定的窗口重画菜单 EnableMenuItem 允许或禁止指定的菜单条目 GetMen

511遇见 3367

【MMDetection3.0实战】从零构建自定义数据集训练流程

本文详细介绍了使用MMDetection3.0框架从零开始构建自定义目标检测数据集的完整训练流程。内容涵盖环境配置、COCO格式数据准备、核心代码改造、模型配置与训练策略调优,以及最终的模型测试与验证,帮助开发者快速上手并训练自己的检测模型。

l6m7n8的博客 314

AI脸部替换Roop-Unleashed,一键整合包教程

Roop-Unleashed是一个无须训练模型的深度伪造工具,专为图像和视频的面部替换而设计。它通过简洁的浏览器界面提供用户友好且跨平台的使用体验,无论用户是业余爱好者还是专业人士,都能快速上手。它无需复杂的设置即可实现高效的处理和转换,使图像和视频的编辑变得更加轻松和便捷。

m0_72580657的博客 1万+

Win32 ASM 菜单编程Demo以及Win32 ASM 为什么需要等值定义

使用Win32 ASM制作一个窗口菜单; 资源文件; #define ICO_MAIN 0x1000 //图标 #define IDM_MAIN 0x2000 //菜单 #define IDM_HELP 0x4301 #define IDM_ABOUT 0x4302 #define IDM_ADDWZ 0x5001 #de...

bcbobo21cn的专栏 1493

system_stm32f10x.c文件分析

配置系统时钟(包括系统时钟源、锁相环(PLL)倍频系数、高级高性能总线(AHB)/ 高级外设总线(APBx)预分频器以及闪存相关设置)。该函数在系统复位后的启动阶段被调用,且调用时机早于跳转到主程序之前。

Jia shuheng的博客 603

[Win32]Win32 SDK编程系列文章——菜单

理论 菜单可以说是WINDOWS最重要的元素之一。有了它,用户可以方便地选择操作命令.用户只要细读一下所有的菜单项就可以明了应用程序所提供的大概功能,而且可以立即操作,无须去阅读手册了.正因为菜单给了用户一种方便的方式,所以您在应用程序中加入菜单时就要遵守一般的标准.譬如:一般头两个菜单项是"File"和"Edit",最后是"Help",您可以在这中间插入您要定义的菜单项.如果所运行的菜单命

超越 2203

YOLOv8剪枝 l1剪枝测试精度仅掉0.8个点,速度提高10.7fps!

文章摘要: 本文提出了一种基于组归一化的重要性评分方法GroupNormImportance,用于神经网络剪枝中的通道选择。该方法支持多种变体,包括标准L1范数、组L1范数和BN缩放因子等计算方式。核心实现包括三个关键部分:1)支持p范数计算(默认为L2);2)提供7种组重要性归约方法(如均值、最大值等);3)提供8种归一化方案(包括标准化、高斯化、LAMP等)。该方法输入一个剪枝组,输出各通道的重要性分数,通过依赖图可实现结构化剪枝。实验对比图展示了剪枝前后的效果差异,验证了该方法的有效性。

FJN110的博客 397

腾讯Android开发面试准备指南及参考答案

腾讯元宝高级Android开发职位面试准备指南 该职位要求扎实的Kotlin基础、架构设计能力和性能优化经验,重点关注Android客户端开发。面试流程约3轮,支持线上面试,流程较快。候选人需准备以下核心内容: 基础技术:Kotlin特性、Android开发生命周期、多线程编程 架构设计:MVVM/MVI模式应用、组件化解耦方案 性能优化:流畅度提升、内存管理、启动时间优化等实战案例 加分技能:Jetpack Compose开发、音视频处理、跨平台开发经验 建议结合项目经验准备具体案例,突出技术深度和问题解

郑伟强dev的专栏 1194

Windows编程(2)|Win32建立菜单

在Win32编程下建立菜单有两种,一种是直接加载资源里的菜单,另一种是动态创建   一.直接加载资源资源菜单,有两种方法,要包含头文件resource.h     在"资源文件"处右键"添加"中选择"资源",在弹出的资源框中选择"Menu",然后对菜单编辑,我这里的菜单的I

bizhu的专栏 8102

Google Earth Engine ——在 GEE 中计算面积含各类要素计算(土地分类为例)

在遥感应用中工作时,许多操作需要计算面积。例如,需要在监督分类后计算每个类所覆盖的面积,或者找出灾害后区域内受影响的面积。计算栅格和矢量的面积在大多数软件包中是一个简单的操作,但在 Google Earth Engine 中以稍微不同的方式完成 - 这可能会让初学者感到困惑。在这篇文章中,我将概述计算矢量和图像面积的方法。我们将涵盖以下主题,从简单到复杂。 特征的面积计算,即矢量数据 图像的面积计算(单类) 按类别计算图像的面积 按区域按类别计算图像的面积 按年按地区按类别计算图像的面积 准备数据

此星光明博客 4024

通用GUI编程技术——Win32 原生编程实战(十二)——菜单资源实战

本文介绍了Win32原生编程中菜单资源的定义和使用方法。通过资源文件定义菜单相比代码创建更简洁、易维护。主要内容包括:1) 菜单资源的基本语法,使用MENU、POPUP和MENUITEM关键字构建菜单结构;2) 如何在代码中加载菜单资源并关联到窗口;3) 子菜单的创建方法,通过嵌套POPUP实现多级菜单。文章还提供了完整的代码示例,演示了从资源加载菜单到处理菜单命令的全过程。使用资源文件定义菜单能有效分离UI与逻辑代码,提高程序的可维护性和本地化能力。

charlie114514191的博客 592

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

[Win32]Win32 SDK编程系列文章——菜单(快捷菜单)——动态加载

理论 创建普通菜单步骤如下: 1)创建菜单 如:CreateMenu2)   添加菜单项 如:AppendMenu3)加载菜单         LoadMenu4)设置菜单到窗口 SetMenu5)处理菜单响应6)消除菜单 DestroyMenu 创建右键菜单的步骤如下: 1)创建菜单 如:CreateMenu2)   添加菜单项 如:AppendMenu3)使用T

超越 3125

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

win32编程 -- 菜单使用

不知道少了什么,总觉得没有以前快乐,不后悔遇见谁,只后悔变成现在的模样。。。 ---- 网易云热评 一、窗口的顶层菜单 1、创建菜单HMENU CreateMenu(VOID); //创建成功返回菜单句柄 2、增加菜单项 BOOL AppendMenu( HMENU hMenu, //菜单句柄 UINT uFlags, //菜单项风格 UINT_PTR uIDNewItem, //菜单项ID或下拉菜单的句柄 LPCTSTR lpNewItem...

Web安全工具库 441

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

win32编程 -- 菜单资源

相亲的男生普遍自卑,而女生却比较挑剔,因为大部分男生已经意识到自己的普遍,而女生往往却还活在梦里。。。 ---- 网易云热评 一、资源介绍 accelerator:快捷键 bitmap:位图 cursor:光标 dialog:对话框 html:网页 icon:图标 Menu:菜单 Ribbon:功能区 string table:字符串表 toolbar:工具栏 version:版本 二、通过资源添加菜单项 1、新建空项目 2、添加源文件(空窗口代码) 3、右击资..

Web安全工具库 257

win32编程 -- 系统菜单及右键菜单

她开玩笑地说了句:挺可惜的,我的青春平平淡淡,站在她身旁的男生红着眼眶:你惊艳了我至少三年。。。 ----网易云热评 一、修改系统菜单项 1、在create消息中处理 case WM_CREATE: 获取系统菜单(hWnd); break; 2、系统菜单的修改 AppendMenu添加 DeleteMenu删除 void 获取系统菜单(HWND hWnd){ //获取系统菜单句柄,false表示现在的句柄 HM

Web安全工具库 963
上一篇: 上海公交线路一览表
下一篇: 一个winhttp的服务程序
MikeFeng
博客等级 码龄23年 27粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值