OnSysCommand()这个函数主要是截获控制命令的,msdn上的解释如下:
The framework calls this member function when the user selects a command from the Control menu, or when the user selects the Maximize or the Minimize button.
尤其是最大化和最小化窗口的时候,比如现在软件的流行的点关闭按钮,不是对出而是隐藏的情况,就可以在这里来实现,
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
if (nID == SC_CLOSE)
ShowWindow(SW_HIDE);
.....
}
就是这样来实现的,
注意和PreTranslateMessage的区别
PreTranslateMessage是用来截获消息的,msdn的解释如下
Used by class cwinapp to translate window messages before they are dispatched to the TranslateMessage and DispatchMessage Windows functions.
virtual BOOL PreTranslateMessage(
MSG* pMsg
);
nID
SC_CLOSE Close the CWnd object. //关闭
SC_MAXIMIZE (or SC_ZOOM) Maximize the CWnd object.//最大化
SC_MINIMIZE (or SC_ICON) Minimize the CWnd object.//最小化
SC_RESTORE Restore window to normal position and size.//还原
SC_SIZE Size the CWnd object. //大小
SC_MOVE Move the CWnd object.//移动
不是所有消息,只是系统命令,至于能不能顺利发出去,要看你的心情了(开个玩笑)。这个函数不是使用者调用,是使用者重写这个函数,当然使用者指的是使用MFC编程的人。在函数里写自己的逻辑,当然也有必要调用一下它的父类这个函数,以便让系统处理一些默认的功能,有如下伪代码表示这个意思:
void OnSysCommand(UINT nID, LPARAM lParam)
{
if("命令码" == 我要专门处理的命令码)
{
这个事儿我来做
}else
{
这些个事儿还是系统来处理
CMainFrame::OnSysCommand(nID, lParam) ;
}
}
至于这个函数谁来调用,那是MFC内核的事情,会调到你自己写的这个重载函数,所以你只要把逻辑写入到这里面就可以了.