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

相关推荐
恒者走天下6 小时前
秋招落定,拿到满意的offer,怎么提高自己实际的开发能力,更好的融入团队
c++
天若有情6736 小时前
【c++】手撸C++ Promise:从零实现通用异步回调组件,支持链式调用+异常安全
开发语言·前端·javascript·c++·promise
学困昇7 小时前
C++中的异常
android·java·c++
合作小小程序员小小店7 小时前
桌面安全开发,桌面二进制%恶意行为拦截查杀%系统安全开发3.0,基于c/c++语言,mfc,win32,ring3,dll,hook,inject,无数据库
c语言·开发语言·c++·安全·系统安全
Codeking__7 小时前
C++ 11 atomic 原子性操作
开发语言·c++
crescent_悦7 小时前
PTA L1-020 帅到没朋友 C++
数据结构·c++·算法
卡提西亚8 小时前
C++笔记-34-map/multimap容器
开发语言·c++·笔记
2***B4498 小时前
C++在金融中的QuantLibXL
开发语言·c++·金融
A***07178 小时前
C++在游戏中的阴影渲染
开发语言·c++·游戏
Q***l68710 小时前
C++在计算机图形学中的渲染
开发语言·c++