首页 > 编程语言 >win32编程 -- 系统菜单及右键菜单

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

时间:2022-12-26 19:36:48浏览次数:48  
标签:菜单 -- 句柄 WM MF 右键 hWnd


她开玩笑地说了句:挺可惜的,我的青春平平淡淡,站在她身旁的男生红着眼眶:你惊艳了我至少三年。。。

----网易云热评

一、修改系统菜单项

1、在create消息中处理

case WM_CREATE:
获取系统菜单(hWnd);
break;

2、系统菜单的修改

AppendMenu添加

DeleteMenu删除

void 获取系统菜单(HWND hWnd)
{
//获取系统菜单句柄,false表示现在的句柄
HMENU 系统菜单句柄 = GetSystemMenu(hWnd, FALSE);
//删除或增加菜单项
for (int i = 0; i < 6; i++)
{
DeleteMenu(系统菜单句柄, 0, MF_BYPOSITION);//根据索引删除
}
AppendMenu(系统菜单句柄, MF_SEPARATOR, 0, L"");
AppendMenu(系统菜单句柄, MF_STRING, 1001, L"哎呦");
}

3、系统菜单命令响应

WM_SYSCOMMAND响应菜单命令
WPARAM的LOWORD是命令ID
case WM_SYSCOMMAND:
系统菜单消息处理(hWnd, wParam);
break;
void 系统菜单消息处理(HWND hWnd,WPARAM wParam)
{
switch (LOWORD(wParam))//获取被点击系统菜单项id
{
case 1001:
MessageBox(hWnd, L"哎呦", L"aiaiaiyoyo", MB_OK);
break;
}
}

二、右键弹出菜单

1、创建菜单右键菜单是一个弹出式菜单,使用CreatePopupMenu创建。 

HMENU 菜单句柄 = CreatePopupMenu();

2、增加菜单项

AppendMenu(菜单句柄,MF_STRING,1002,L"哎");
AppendMenu(菜单句柄, MF_SEPARATOR, 0, L"");
AppendMenu(菜单句柄, MF_STRING, 1003, L"呦");

3、显示弹出式菜单

TrackPopupMenu(菜单句柄, TPM_CENTERALIGN | TPM_VCENTERALIGN, LOWORD(lParam),  HIWORD(lParam), 0, hWnd, NULL);
BOOL TrackPopupMenu(
HMENU hMenu, //菜单句柄
UINT uFlags, //显示方式
int x, //水平位置,屏幕坐标系
int y, //垂直位置,屏幕坐标系
int nReserved, //保留,必须0
HWND hWnd, //处理菜单消息的窗口句柄
CONST RECT* prcRect //NULL,忽略
); TrackPopupMenu是阻塞函数

4、命令处理WM_COMMAND,与窗口菜单一致 如果TrackPopupMenu设置了TPM_RETURNCMD选项,那么点击的菜单项ID通过函数的返回值获取。 

不设置的情况

case WM_COMMAND:
右键消息处理(hWnd,wParam);
break;
void 右键消息处理(HWND hWnd,WPARAM wParam)
{
switch (LOWORD(wParam))
{
case 1002:
MessageBox(hWnd, L"aiaiaiaiia", L"youyouyou", MB_OK);
break;
}
}

设置情况

BOOL ret=TrackPopupMenu(菜单句柄, TPM_CENTERALIGN |  TPM_VCENTERALIGN|TPM_RETURNCMD, pt.x, pt.y, 0, hWnd, NULL);
switch (ret)
{
case 1002:
MessageBox(hWnd,L"没有command消息",L"aa",MB_OK);
break;
}

4、菜单项的状态 WM_INITMENUPOPUP,按照弹出菜单处理

三、菜单处理位置

1、鼠标右键抬起 

WM_RBUTTONUP 鼠标右键消息窗口坐标系坐标,要使用需要转换成屏幕坐标系
ClientToScreen 客户端坐标转屏幕坐标
ScreenToClient
POINT pt = {0};
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
ClientToScreen(hWnd, &pt);

2、鼠标右键抬起后,不用坐标转换

WM_CONTEXTMENU     
WParam - 右键点击的窗口句柄
LPARAM - LOWORD X坐标,屏幕坐标系
HIWORD Y坐标,屏幕坐标系
WM_CONTEXTMENU消息是在WM_RBUTTONUP消息之后产生。
void 右键抬起后(HWND hWnd,LPARAM lParam)
{
//1、创建右键菜单
HMENU 菜单句柄 = CreatePopupMenu();
//2、增加菜单项
AppendMenu(菜单句柄, MF_STRING, 1002, L"哎");
AppendMenu(菜单句柄, MF_SEPARATOR, 0, L"");
AppendMenu(菜单句柄, MF_STRING, 1003, L"呦");
//3、显示右键菜单
//坐标出现在垂直水平中央
BOOL ret = TrackPopupMenu(菜单句柄, TPM_CENTERALIGN | TPM_VCENTERALIGN | TPM_RETURNCMD, LOWORD(lParam), HIWORD(lParam), 0, hWnd, NULL);
switch (ret)
{
case 1002:
MessageBox(hWnd, L"没有command消息", L"aa", MB_OK);
break;
}
}

欢迎关注公众号:顺便编点程


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

 

标签:菜单,--,句柄,WM,MF,右键,hWnd
From: https://blog.51cto.com/u_15288375/5970541

相关文章

  • 向量带来的高维思维
    何为向量?向量从何而来?为什么说向量是高维思维的体现?为什么说学习向量就是我们认识世界的新角度? 学习向量对于我们来说是突然的,感觉我一直在经历“降维打击”,经过十几节课的......
  • 三层
    最近进入了三层的学习,刚开始实在是不明白三层是什么?为什么要分层?三层有哪些?1.UI(View),表示层。接收显示数据(接受用户输入数据、显示处理后的数据);2.BLL(BusinessLogicLayer),......
  • SqlCommand.ExecuteNonQuery 方法
    一、ExecuteNonQuery方法是什么?SqlCommand的一个类,用于包含update、insert、delete、select的Transact-sql语句中来修改数据库中的数据,并返回结果。 二、返回的结果是什......
  • 2020年——成长、感恩、幸运
    春去秋来、秋收冬藏,成长在悄然之中偷偷的来临,我的2020年似乎是个幸运的年份。 一、学习上硕果累累本来兴高采烈地回家过年,疫情的原因,没想到回去就回不来了,自然被困在廊坊的......
  • 《吴军硅谷来信第三季第021封信:孙悟空的紧箍咒究竟有什么用?》
    ......
  • 给你的学习生活加把劲儿
    ♥♥其实所谓的勇气是你在认清生活的真相之后依然热爱它,所以就是在所有的这些让你焦虑的、纠结的、崩溃的事情背后你还是要明白你想要达到的目的是什么,你还是要明白,最终的彼......
  • 镜头光学基础
     目录​​1、reflection 反射​​​​2、refraction 折射​​​​3、牛顿公式在自动对焦中的一个应用:计算对焦马达(actuator)的冲程范围​​​​4、Zoom​​ ......
  • SQl Server——流程控制语句
     IF...ELSE语句:条件处理语句IFBoolean_expression{sql_statement|statement_block}ELSE{sql_statement|statement_block}需求:查询成绩表sc编号为801,学科为01这门课程所有......
  • 关于保险的基础知识总结
    目录​​1、学习目标​​​​2、关于保险的一些疑问​​​​2-1、保险要不要买​​​​2-2、有社保,为什么还要买保险​​​​3、关于保险的一些常识​​​​3-1、保险的分类......
  • MyBatis-Plus基础
    一、MyBatis-Plus1.1简介MyBatis-Plus(opensnewwindow)(简称MP)是一个MyBatis(opensnewwindow)的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高......