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

简介: win32编程 -- 系统菜单及右键菜单

一、修改系统菜单项


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;
       }
}
目录
相关文章
|
Shell
shell中并发执行多个进程
shell中并发执行多个进程
1886 4
|
7月前
|
API Windows
GetTickCount() 函数的作用和用法
GetTickCount() 函数是 Windows API 中的一个重要函数,用于获取自系统启动以来经过的毫秒数。这个函数通常用于计算时间间隔、性能分析和定时等场景。
342 0
|
9月前
|
XML 搜索推荐 Android开发
Android改变进度条控件progressbar的样式(根据源码修改)
本文介绍了如何基于Android源码自定义ProgressBar样式。首先分析了系统源码中ProgressBar样式的定义,发现其依赖一张旋转图片实现动画效果。接着分两步指导开发者实现自定义:1) 模仿源码创建一个旋转动画XML文件(放置在drawable文件夹),修改图片为自定义样式;2) 在UI控件中通过`indeterminateDrawable`属性应用该动画。最终实现简单且个性化的ProgressBar效果,附带效果图展示。
599 2
|
算法 搜索推荐
解读双编码器和交叉编码器:信息检索中的向量表示与语义匹配
在信息检索领域(即从海量数据中查找相关信息),双编码器和交叉编码器是两种至关重要的工具。它们各自拥有独特的工作机制、优势和局限性。本文将深入探讨这两种核心技术。
663 3
解读双编码器和交叉编码器:信息检索中的向量表示与语义匹配
|
人工智能 C++
初步编译QT5.15.2+VS2019+VTK8.2.0
本文介绍了在VS2019中编译QT 5.15.2和VTK 8.2.0的过程,包括编译结果、cmake库编译配置和cmake应用配置脚本,以及推荐的参考链接。
777 4
|
监控 Unix Linux
|
存储 SQL 关系型数据库
深入MySQL锁机制:原理、死锁解决及Java防范技巧
深入MySQL锁机制:原理、死锁解决及Java防范技巧
|
移动开发 大数据 Windows
LabVIEW通过VISA读取或写入时出现超时错误-1073807339
LabVIEW通过VISA读取或写入时出现超时错误-1073807339
1625 0
Qt安装 qt-unified-windows-x64-online.exe下载慢
Qt安装 qt-unified-windows-x64-online.exe下载慢
|
程序员 API Windows
[笔记]Windows核心编程《番外篇》几种Hook类型
[笔记]Windows核心编程《番外篇》几种Hook类型
298 0