在MDI中,工具栏一般在主框架CMainFrame中,工具栏是主框架CMainFrame的子窗口,所以可以在主框架CMainFrame中处理子窗口(工具栏)的事件:
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg->message == WM_NCLBUTTONDBLCLK) // 非client区域的双击消息
{
if(pMsg->wParam == HTCAPTION) // 光标所在区域为标题栏
{
if ( pMsg->hwnd == hwndToolBarDlg)//hwndToolBarDlg解释在下面
{
AfxMessageBox( _T("donow"));
return TRUE;
}
}
}
return CWinApp::PreTranslateMessage(pMsg);
}
---------------
其中hwndToolBarDlg是浮动工具栏所在对话框的窗口句柄HWND,它应在前面(创建对话框CMainFrame::OnCreate()时)就赋值了:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
......
CWnd* pToolBarDlg;//工具栏的父窗口(对话框)
pToolBarDlg= ( CWnd* ) (m_wndToolBar.m_pDockBar);
pToolBarDlg= pToolBarDlg->GetParent();
if( pToolBarDlg->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)))
{
hwndToolBarDlg= pToolBarDlg->GetSafeHwnd();//对话框的句柄
}
......
}
---------------------------------------------
注意:也可在CMFC_frameApp的PreTranslateMessage()里响应.而且CMFC_frameApp的PreTranslateMessage()比CMainFrame::PreTranslateMessage()先捕捉到该双击消息.
由上可知,即使是子窗口(像用户动态创建的CButton等控件),也可以拦截其事件.