关于MFC中对话框的菜鸟问题
我在一个工程里先添加了一个对话框然后再RC编辑器里给对话框添加了些控件然后添加一个对话框类和该对话框的ID相关联今后这个类的对象就表示一个实实在在的该对话框了我想请问那么...
我在一个工程里先添加了一个对话框 然后再RC编辑器里给对话框添加了些控件 然后添加一个对话框类 和该对话框的ID相关联 今后这个类的对象就表示一个实实在在的该对话框了
我想请问 那么当我构造一个这个对话框类的时候 我对话框上的控件有没有也被构造出相应的类的对象呢
比如 我对话框上有按钮 当我用“CDialog MyDialog;”的时候 对话框上的控件相关联的对象是不是也产生了(CButtion CEdit 这些类的对象)? 这个行为是什么时候发生的呢 展开
我想请问 那么当我构造一个这个对话框类的时候 我对话框上的控件有没有也被构造出相应的类的对象呢
比如 我对话框上有按钮 当我用“CDialog MyDialog;”的时候 对话框上的控件相关联的对象是不是也产生了(CButtion CEdit 这些类的对象)? 这个行为是什么时候发生的呢 展开
4个回答
展开全部
很好学啊。
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;这个语句只是构建了一个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,DoDataExchange中调用DDX_Control关联控件对象,此时执行控件对象的构造函数。
当用CDialog MyDialog;的时候,调用的对话框的构造函数。
当用MyDialog.DoModal();时,调用对话框的OnInitDialog,OnInitDialog里面调用CDialog::OnInitDialog();然后是调用对话框的DoDataExchange,DoDataExchange中调用DDX_Control关联控件对象,此时执行控件对象的构造函数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
控件也是窗口,只是他的父窗口是对话框本身。
如果脱离了父窗框,那控件值就无效。假设你只是要想显示第二个新增的DLG。你在初始化函数里调用
CDialog MyDialog;
MyDialog.DoModal();
这样,这个对话框就显示了。
如果脱离了父窗框,那控件值就无效。假设你只是要想显示第二个新增的DLG。你在初始化函数里调用
CDialog MyDialog;
MyDialog.DoModal();
这样,这个对话框就显示了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
对话框上的类是没有产生的,你使用CDialog MyDialog;语句时产生的只是对话框对象,至于其中的控件是是在类内部定义的相应的类的实例来产生的。
不过,现在你已经关联了的对话框中是有对象的,可以直接使用。
不过,现在你已经关联了的对话框中是有对象的,可以直接使用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询