WM_SYSCOMMAND消息是MFC预定义好的一组命令消息,框架有默认的处理方式,比如点击窗口右上方的关闭按钮,发送SC_CLOSE消息,用以关闭窗口。
系统命令消息包括以下几种:
The lParam parameter can have the following values:
1 - the display is going to low power
2 - the display is being shut off
下面应用SC_SIZE消息和SC_MOVE 消息在窗口上动态改变一个按钮控件,实践发现,这些消息值再加上一个值会
有不同的效果:
BOOL CSysCommandTestDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
CWnd *pWnd = GetDlgItem(IDC_BUTTON1);//得到此按钮窗口指针
if ((pMsg->message==WM_LBUTTONDOWN) && (pMsg->hwnd == pWnd->m_hWnd))
{
//
pWnd->SendMessage( WM_SYSCOMMAND,SC_MOVE+1,0);//按鼠标左键移动窗口
return TRUE;
}
else if ((pMsg->message==WM_RBUTTONDOWN) && (pMsg->hwnd == pWnd->m_hWnd))
{
//按鼠标右键改变窗口大小,加上不同的值代表按不同的方向改变
pWnd->SendMessage( WM_SYSCOMMAND,SC_SIZE+2,0
{
// TODO: 在此添加专用代码和/或调用基类
CWnd *pWnd = GetDlgItem(IDC_BUTTON1);//得到此按钮窗口指针
if ((pMsg->message==WM_LBUTTONDOWN) && (pMsg->hwnd == pWnd->m_hWnd))
{
//
pWnd->SendMessage( WM_SYSCOMMAND,SC_MOVE+1,0);//按鼠标左键移动窗口
return TRUE;
}
else if ((pMsg->message==WM_RBUTTONDOWN) && (pMsg->hwnd == pWnd->m_hWnd))
{
//按鼠标右键改变窗口大小,加上不同的值代表按不同的方向改变
pWnd->SendMessage( WM_SYSCOMMAND,SC_SIZE+2,0
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
}
return CDialog::PreTranslateMessage(pMsg);
}
以下代码将导致右上方的关闭按钮无效,OnClose函数也没有进入:
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if (nID == SC_CLOSE) { return; } CMDIFrameWnd::OnSysCommand(nID, lParam); }
由此可以说明点击右上方的关闭按钮后,先是发送系统消息SC_CLOSE,在OnSysCommand响应函数中,再发送
WM_CLOSE消息。