描述:
相同问题,在基础,线程,Com版
如题:
工程类型SDI:
当然,可以重载 OnOk() OnCancel(), 然后在它们里面向父窗体发个消息.
但,当前项目基本成形,如此大的改动,量大,易误.[因有众多的这种情形]
理想状态,我在CView中,或CMainFrame中进行捕获它们发来的销毁消息,
而不改动派生的Dialog类.
怎么处理呢? 请高手指点.
解决方案1:
一般的子窗口在关闭时会发给父窗口WM_PARENTNOTIFY消息。
其中wParam==WM_DESTROY, lParam=idChildWindow;
对话框好象需要在WM_DESTROY中自已发送该消息:
::SendMessage(hParent, WM_PARENTNOTIFY, WM_DESTROY, m_id);
父窗口接收到该消息后,可做相应处理。
LRESULT CALLBACK WndProc(HWND...)
{
switch(uMsg)
{
case WM_PARENTNOTIFY:
....
break;
}
}
如果用MFC,方法类似。
需要用到钩子么?
直接在dialog销毁的时候发送这个消息就可以了!
楼上的解释一下:“注意不要给主窗口发送子定义消息时发送句柄,这没有用的因为等主窗口处理消息时句柄已经没有用了”是什么意思?
我的邮箱是:
checky_1981@163.com
我刚刚帮你做了一个mfc例子你参考参考:
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;
}
您可能想查找下面的文章:
- 在控件中打开一个无模式对话框,为对话框上的Edit框关联控制型变量出错?!
- 请问在非MFC程序中怎么调用系统控件?
- OCX中使用DLL,在DLL弹出无模式对话框后,一按键盘就进死循环。
- 急急急!WTL获取WM_POWERBROADCAST,如何获取?要求模式对话框下!
- 非模式对话框无法进PreTranslateMessage,该怎么办?
- OCX控件中无模式对话框无法响应Tab按键
- 想做一个基于对话框的多线程程序,请问应该用模式对话框还是非模式对话框?
- 模式对话框与多线程一起使用,当弹出模式对话框时,会中断另一个线程?
- 请教:关于在辅线程中创建一个无模式对话框的问题MFC---似乎很难
- 如何显示在DLL中的非模式对话框?