如题:工程类型SDI:当然,可以重载 OnOk() OnCancel(), 然后在它们里面向父窗体发个消息.
但,当前项目基本成形,如此大的改动,量大,易误.[因有众多的这种情形]理想状态,我在CView中,或CMainFrame中进行捕获它们发来的销毁消息,
而不改动派生的Dialog类.怎么处理呢? 请高手指点.
但,当前项目基本成形,如此大的改动,量大,易误.[因有众多的这种情形]理想状态,我在CView中,或CMainFrame中进行捕获它们发来的销毁消息,
而不改动派生的Dialog类.怎么处理呢? 请高手指点.
自己做一个WH_CALLWNDPROC的钩子,监视本线程的所有窗口过程消息
如果发现WM_DESTROY消息的话检查
是否窗口的属性或者看看它的父窗口是不是MainFrame等等就可以了
而且可能也不会减轻多少工作量,
还是直接从dialog里去改吧,
容易.
那在dlg销毁时, 我猜想, CView会接受到类似的消息, OnNotify不成的.我用Spy++仔细查过了, 在非模式对话框Destroy时, 无WM_DESTROY,WM_CLOSE
之类的消息弹出. 想来,钩子怕也不成.唉,那位弟兄还有奇招, 这个问题,我散分400, 在COM,线程版都有相同问题.
app.h
#define WM_CHILDDESTROY WM_USER+0x100
{
public:
HHOOK m_hHook;
//钩子过程
static LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam);
}app.cpp:InitInstance:
m_hHook = SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,AfxGetInstanceHandle(),GetCurrentThreadId());ExitInstance:if(m_hHook != NULL)
UnhookWindowsHookEx(m_hHook);//////////////////////////////////////////////////////////////////////////
//Hook 回调函数LRESULT CALLBACK CTestListCtrlApp::CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode == HC_ACTION)
{
CWPSTRUCT * pCwp = (CWPSTRUCT*)lParam;
if(pCwp != NULL && ::IsWindow(pCwp->hwnd) )
{
if(pCwp->message == WM_DESTROY)
{
TRACE("句柄:%x\n",pCwp->hwnd); TCHAR szText[256];
TCHAR szClassName[256];
GetWindowText(pCwp->hwnd,szText,256);
TRACE("WindowText:%s\n",szText);
GetClassName(pCwp->hwnd,szClassName,256);
TRACE("ClassName:%s\n",szClassName);
//"#32770"
if(theApp.m_pMainWnd->GetSafeHwnd() != NULL && _tcsicmp(szClassName,_T("#32770")) == 0)
{
//下面是发送消息给主窗口#32770是mfc默认的dialog类名,你可以用不同的方式和不同的条件来判断,注意不要给主窗口发送子定义消息时发送句柄,这没有用的因为等主窗口处理消息时句柄已经没有用了
SendMessage(theApp.m_pMainWnd->GetSafeHwnd(),WM_CHILDDESTROY,0,(LPARAM)szText);
}
}
}
}
return CallNextHookEx(theApp.m_hHook,nCode,wParam,lParam);}主窗口中:
LRESULT CTestListCtrlDlg::OnChildDestroy(WPARAM wParam,LPARAM lParam)
{
CString strTemp;
strTemp.Format(_T("窗口名为%s的窗口正在被Destroy掉 "),lParam);
MessageBox(strTemp);
//在这里做你要做的东西
return 0;