VC中如何让子对话框响应最大化、最小化、关闭等系统消息

我们知道实现捕获最大化、最小化、关闭、大小变化等系统消息主要有如下两种方法:

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刷新
    }
}
这里 m_MyPlatformDlgCSuperSpeedDlg对话框的一个子对话框的对象,如果他们同时满足 nType == SIZE_MAXIMIZED && m_MFCTab.GetActiveTab() ==  2这两个条件,我们就让子对话框对象 m_MyPlatformDlg来做一些操作,这里我们直接发送消息,让子对话框进行F5刷新,当然我们亦可以发送自定义消息给子对话框,然后在子对话框中操作响应这个消息。


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值