我们知道实现捕获最大化、最小化、关闭、大小变化等系统消息主要有如下两种方法:
1、重写PreTranslateMessage函数
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
BOOL
CSuperSpeedDlg::PreTranslateMessage(MSG* pMsg)
{ // TODO: Add your specialized code here and/or call the base class if ( pMsg->message == WM_SYSCOMMAND ) { if ( ( pMsg->wParam & 0xFFF0) == SC_MINIMIZE ) { AfxMessageBox(_T( "捕获到窗口最小化消息")); } else if ( ( pMsg->wParam & 0xFFF0) == SC_MAXIMIZE ) { AfxMessageBox(_T( "捕获到窗口最大化消息")); } else if ( ( pMsg->wParam & 0xFFF0) == SC_CLOSE ) { AfxMessageBox(_T( "捕获到窗口关闭消息")); } } return CDialog::PreTranslateMessage(pMsg); } |
注:此方法无法捕获对话框程序程序中的系统按钮消息
2、响应WM_SIZE消息(OnSize函数)
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void CSuperSpeedDlg::OnSize(UINT nType,
int cx,
int cy)
{ CDialogEx::OnSize(nType, cx, cy); switch( nType) { case SIZE_RESTORED: AfxMessageBox( L "捕获到窗口还原消息" ); break; case SIZE_MINIMIZED: AfxMessageBox( L "捕获到窗口最小化消息" ); break; case SIZE_MAXIMIZED: AfxMessageBox( L "捕获到窗口最大化消息" ); break; } } |
注:此方法不但可以捕获对话框程序程序中的系统按钮消息,同时还可以获取客户区高度与宽度。
附加说明:
你也可以用IsZoomed函数来判断窗口是否最大化了。
3、如何让子对话框响应这些系统消息
如上所述:
对于最大化、最小化等系统消息的捕获,通常可以由WM_SIZE来完成,但如果一个对话框是一个子对话框时,通常它的父对话框会拥有这些消息,而子对话框并不会,所以上面的SIZE_RESTORED、SIZE_MINIMIZED、SIZE_MAXIMIZED等消息是子对话框是接收不到的。
那么子对话框怎样来处理这些系统消息呢?我是这样想的:我们可以通过父对话框的OnSize函数来捕获这些消息,之后我们可以给相应的子对话框发送我们自定义的消息,在这些自定义的消息中处理我们进行操作,。这样操作就是变相的让子对话框来响应这些接收不到的消息!
下面是一个让子对话框 变相响应系统消息的例子:
1
2 3 4 5 6 7 8 9 10 11 |
void CSuperSpeedDlg::OnSize(UINT nType,
int cx,
int cy)
{ CDialogEx::OnSize(nType, cx, cy); if (nType == SIZE_MAXIMIZED && m_MFCTab.GetActiveTab() == 2) { //AfxMessageBox( L"捕获到窗口最大化消息" ); HWND hwnd = m_MyPlatformDlg.GetSafeHwnd(); ::PostMessage(hwnd, WM_KEYDOWN, VK_F5, 1); // F5刷新 } } |