做的项目,主窗口显示一个界面,然后再创建几个非模态窗口显示,如果用户按键盘的一个cancel键,系统会给主窗口发送一个消息,主窗口需要处理这个消息,关闭当前的非模态子窗口,然后显示上一个子窗口,在主窗口的PreTranslateMessage中捕获到了这个消息,然后调用下面的模块进行了处理
定义了一个 cdialog*pDlg指针来保存当前子窗口的句柄,但是子窗口有时候也会弹出模态子窗口,所以有时候不能直接用pDlg来处理。
/// 处理CANCEL键退出消息, 如果是主窗口或者模态窗口,不处理该消息,返回窗体进行处理,只能检查一层调用 pDlg是当前子窗口 BOOL COTP6100_EthernetDlg::OnDialogCancel() { int iButtonCount; CString csButtonText; HWND hActiveParent; /// 获取当前子窗口的句柄 hActiveParent= ::GetWindow( this->GetActiveWindow()->m_hWnd, GW_OWNER); if ( pDlg!=NULL) { /// 子窗口弹出的模态对话框,交由子窗口处理 if ( hActiveParent==pDlg->m_hWnd ) { return FALSE; } } /// 获取按钮菜单最右边的按钮值 iButtonCount = m_tyFunctionButton.m_ButtonInfo.size()-1; csButtonText= m_tyFunctionButton.m_ButtonInfo[iButtonCount]->szButtonName; /// 子窗口处理 if( csButtonText==_T("返回") ) { PerformProgram( iButtonCount-m_tyFunctionButton.bLeftButtonNum ); //(this->*m_tyFunctionButton.m_ButtonInfo[iButtonCount]->FunAddr)(); return TRUE; } /// “功能、系统信息、关于”三个窗口显示时处理 if ( hActiveParent!=NULL ) //主窗体 { if ( csButtonText==_T("关于")) { this->PostMessage( WM_KEYDOWN, VK_HOME, NULL); return TRUE; } } return FALSE; }