关于系统响应函数OnSysCommand


void CMynetsendDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}就这段代码,到底什么意思? 
对话框的系统菜单命令,包括关闭对话框,最小化最大化,弹出关于对话框等等,实际上就是向这个对话框发送 WM_SYSCOMMAND消息,对话框响应 WM_SYSCOMMAND消息,然后根据不同的nID值判断到底是什么系统命令(关闭对话框,最大最小化还是其他什么),这个OnSysCommand
就是用来响应 WM_SYSCOMMAND消息,进行相应处理的。
上面的if ((nID & 0xFFF0) == IDM_ABOUTBOX),就是说在需要弹出关于对话框的时候,就进行特别处理(因为在MFC自动生成的基于对话框的工程里面,这个关于对话框也是用户自己可以控制的),所以这时候就自己处理,弹出自己的关于对话框,对于其他的消息,默认不需要用户定制,就直接调用父类的处理就好

追问
你看我的理解对不对,例如说我有一个关闭窗口的按钮,也有这个按钮的响应函数,当我按下这个按钮时,它就会发送命令给OnSysCommand函数,然后OnSysCommand函数响应之后,就会作出相应处理……是吗?
追答

关闭按钮和系统消息不一样,通常按钮点击后发出的是WM_COMMAND消息,与上面的WM_SYSCOMMAND不一样,比如我这幅图里面点击退出按钮,那么收到的就是WM_COMMAND消息,右键点击对话框标题出来的菜单里面的关闭,才是发出WM_SYSCOMMAND消息

追问
好吧,好像懂了点。那我问多一下,这些系统消息例如像你这幅图里的关闭,最大化最小化这些选项要怎样才能有啊?就是我的代码里面有OnSysCommand函数,但是运行之后再右击对话框的任何位置都没有反应啊
追答

看看你的对话框设置里面是否有设置包含system menu。不同版本的Visual Studio可能设置的位置略有不同,不过在编辑对话框资源的时候,在对话框属性里面应该可以找到:

另外也可以通过代码控制强制包含系统菜单,在对话框的OnInitDialog中添加如下代码:

DWORD dwStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);
 dwStyle |= WS_SYSMENU;
 ::SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);


猜你喜欢

转载自blog.csdn.net/diaozhou8998/article/details/80987050