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

相关推荐
岁忧14 分钟前
(nice!!!)(LeetCode 每日一题) 679. 24 点游戏 (深度优先搜索)
java·c++·leetcode·游戏·go·深度优先
小欣加油14 分钟前
leetcode 3 无重复字符的最长子串
c++·算法·leetcode
zylyehuo3 小时前
C++基础编程
c++
tt5555555555554 小时前
C/C++嵌入式笔试核心考点精解
c语言·开发语言·c++
lg_cool_4 小时前
Qt 中最经典、最常用的多线程通信场景
c++·qt6.3
科大饭桶4 小时前
C++入门自学Day14-- Stack和Queue的自实现(适配器)
c语言·开发语言·数据结构·c++·容器
tt5555555555555 小时前
字符串与算法题详解:最长回文子串、IP 地址转换、字符串排序、蛇形矩阵与字符串加密
c++·算法·矩阵
rainFFrain6 小时前
Boost搜索引擎项目(详细思路版)
网络·c++·http·搜索引擎
long_run6 小时前
C++之模板函数
c++
NuyoahC6 小时前
笔试——Day43
c++·算法·笔试