折腾了一早上,想在文档类中获得对话框用户交互的数据:
CTestDlg dlg;
if(IDOK==dlg.DoModal())
{
//get datas of the dialog
}
首先想到的是利用窗口类对象自身的句柄m_hWnd,错误有二:
1. 定义了对象而为进行任何操作,所以里面的句柄为空
2. 调用DoModal()后对话框窗口已经销毁了,再对该对话框操作,当然就会出现非法访问,具体是在:ASSERT(::IsWindow(m_hWnd))出错
关于GetDlgItem();
以前使用它基本上都是在窗口类中,直接调用从来也没思考,现在在文档类中调用,倒一下子不会用了,它有三种形式(不算CWindows中的):
1.SDK形式,返回对话框中控件的句柄
HWND GetDlgItem( HWND hDlg, int nIDDlgItem );
hDlg:对话框句柄
nIDDlgItem:控件ID
2.CWnd的成员函数:
virtual CWnd* GetDlgItem(
int nID
) const;
直接由对话框指针调用
3.CWnd的成员函数:
virtual void GetDlgItem(
int nID,
HWND* phWnd
) const;
phWnd:对话框的句柄
另:几个小知识
1.CWindow和CWnd的区别: CWindow封装了ATL得窗口类,CWnd封装了MFC的窗口类。
2.从窗口句柄到窗口指针的转换: CWnd * pWnd=CWnd::FromHandle(m_hWnd);
3.找到顶层活动窗口: ::FindWindow(类名,窗口title);
4.DoModal调用时,对话框成员函数的调用顺序
OnInitDialog->DoDataExchange->返回,销毁对话框窗口