关于MFC中对话框的菜鸟问题

来源:百度知道 编辑:UC知道 时间:2024/09/21 12:29:27
我在一个工程里先添加了一个对话框 然后再RC编辑器里给对话框添加了些控件 然后添加一个对话框类 和该对话框的ID相关联 今后这个类的对象就表示一个实实在在的该对话框了

我想请问 那么当我构造一个这个对话框类的时候 我对话框上的控件有没有也被构造出相应的类的对象呢
比如 我对话框上有按钮 当我用“CDialog MyDialog;”的时候 对话框上的控件相关联的对象是不是也产生了(CButtion CEdit 这些类的对象)? 这个行为是什么时候发生的呢

很好学啊。
CDialog MyDialog;这个语句只是构建了一个CDialog的类对象,并没有生成对话框窗口句柄,当然子窗口更没有生成了。
MyDialog.DoModal(),或者MyDialog.Create(xxx,xxx);这2个语句才生成对话框窗口句柄,类似于WIN32程序里面的CreateWindow函数。
说明:
使用RC资源编辑器编辑的对话框、图标、菜单等等资源,在编译后都保存在PE文件的资源段里面;
在DoModal和Create函数内部,通过指定的对话框ID,从资源段中装入这个资源块,通过 CreateIndirect 生成一个DLGTEMPLATE的数据块描述对话框资源数据,传入CWnd::CreateDlgIndirect 然后再通过系统的API函数CreateDialogIndirect,来根据对话框资源描述生成一个对话框。

就是这个流程,在DLGTEMPLATE结构体中描述了对话框的外形属性,子控件等信息,CreateDialogIndirect能根据这些描述生成对应属性的对话框,以及子控件(按钮下拉框等控件)。生成的都是HWND窗口句柄,并没有生成相应的类对象(CButton,CListBox等)。

CWnd,CButton,CBitmap,CDC,CComboBox等类都是MFC对API的包装,每个类对象必须于一个相应的窗口句柄关联才能执行。
同样的,在对话框控件中,通过 ::GetDlgItem()得到的就是这个控件窗口的窗口句柄HWND,然后通过 CButton.FromHandle就能关联到这个句柄。就可以当成一个CButton*指针类使用了。(MFC内部生成了一个临时CButton*来给用户使用的,可以不考虑)。

当构造一个这个对话框类的时候,对话框上控件关联的类并没有被构造。

当用CDialog MyDialog;的时候,调用的对话框的构造函数。

当用MyDialog.DoModal();时,调用对话框的OnInitDialog,OnInitDialog里面调用CDialog::OnInitDialog();然后是调用对话框的DoDataExchange