MFC - 给系统菜单(About Dialog)发消息

文章目录

MFC - 给系统菜单(About Dialog)发消息

概述

做了一个对话框程序, 在系统菜单(在程序上面的标题栏右击)中有"关于"的菜单.

这个是程序框架自带的, 自己没写代码.

这个Dlg程序, 因为简单, 没加啥菜单. 将授权也放到"关于"对话框中一并处理.

怕用户看不到咋进入"关于"菜单, 在UI上加了一个"关于"的按钮.

在这个按钮实现中, 就是调用系统菜单中的"关于"菜单项.

是可以自己再照着框架模板生成的代码, 将About Dlg 的调用代码抄过来, 感觉不怎么好(已经有的代码写2遍?).

想想, 是否可以给About菜单项发个消息, 模拟手工点击菜单的效果. 这样好像优雅一点.

试了几次, 整出来了, 就一句话.

c 复制代码
void CxxDlg::OnBnClickedButtonLicense()
{
	// https://learn.microsoft.com/zh-cn/windows/win32/menurc/wm-syscommand
	this->PostMessageW(WM_SYSCOMMAND, IDM_ABOUTBOX, 0);
}

笔记

结合MSDN, 看看IDM_ABOUTBOX这个菜单项相关的东西.

resource.h

c 复制代码
#define IDM_ABOUTBOX                    0x0010

IDM_ABOUTBOX是一个很小的值.

菜单的建立

c 复制代码
BOOL CxxDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将"关于..."菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	// IDM_ABOUTBOX 值定义的范围有要求, 不过都是MFC模板来预先定义好, 我们不用管
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

这个添加系统菜单的实现, 如果我们要新增系统菜单项上的条目, 也可以这样加.

菜单项的处理

c 复制代码
void CxxDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	// 这里能看出来, 系统菜单项的值不能乱定义, 有范围的.
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

MSDN上关于系统菜单项值的说法

https://learn.microsoft.com/zh-cn/windows/win32/menurc/wm-syscommand

PostMessage的参数:

参数1 : message = WM_SYSCOMMAND

参数2 : wParam = IDM_ABOUTBOX // msdn上给的wParam范围, 都是SC_XX, 没有系统菜单项的例子

参数3 : lParam = 0, 按照msdn的说法, lParam是鼠标点击时所在的坐标, 看程序框架中的系统菜单项处理, 没有用lParam, 所以我们也不用填(给0).


  • 可以看出系统菜单项的ID范围 from 0x0010 ~ 0xFFF0
  • 如果自己定义了菜单项, 就必须自己处理, 不能传给框架.

END

相关推荐
虾球xz38 分钟前
游戏引擎学习第230天
c++·学习·游戏引擎
不知道叫什么呀3 小时前
【C语言基础】C++ 中的 `vector` 及其 C 语言实现详解
c语言·开发语言·c++
汇太浪3 小时前
第十六届蓝桥杯大赛软件赛省赛 C++ 大学 B 组 部分题解
c++·蓝桥杯
WW_千谷山4_sch3 小时前
MYOJ_11700(UVA10591)Happy Number(快乐数)(超快解法:图论思想解题)
c++·算法
郭涤生4 小时前
QML 信号与槽
c++·笔记·qt
Ethon_王4 小时前
C++ STL deque容器详解
c++
梦の4 小时前
C++Cherno 学习笔记day20 [81]-[85] 可视化基准测试、单例模式、小字符串优化sso、跟踪内存分配、左值与右值
c++·笔记·学习
硬匠的博客4 小时前
C/C++指针
c语言·开发语言·c++
向日葵.5 小时前
CMake学习
开发语言·c++·学习
wuqingshun3141595 小时前
蓝桥杯 1.路径之谜
c++·算法·职场和发展·蓝桥杯·深度优先