对话框控件属性的修改

原创 2004年06月07日 09:55:00

【作者按】本文主要针对初学者在使用对话框赋值时的一些问题而写。如果你对对话框的使用已经很熟练,请跳过本文。
针对现象许多初学者,常常写出这样的程序来修改对话框中某个按钮的标题:
CMyDialog dlg;
dlg.m_Btn.SetWindowText("MyButton");
其中m_Btn的定义为CButton m_Btn;
这段程序运行后会抱错,debug一下,错误会指向一个断言语句ASSERT(::IsWindow(m_hWnd));报告窗口指针为空。看一下m_hWnd,等于0x00000000.其实就是m_Btn这个CButton对象的句柄为空。
原因分析出现这种错误的原因,显然是m_Btn这个窗口对象还没有创建造成的。我们看一下CMyDialog dlg这个构造函数,看一看MSDN对CDialog构造函数的说明。其实它只是简单的创建了一个对话框实例。这里我这样理解,就是对话框是一个容器,而对话框上的各个控件是容器中包含的对象。对话框的构造函数只是构造了一个容器,而并没有创建容器中的各个对象。我想这里大家就应该明白为什么m_Btn的句柄为空了。那对话框中的控件在什么时候被创建的呢?我个人没有仔细的研究过,但从个人使用的经验看,应该在DoModal函数和对话框的Create函数中创建的。因为使用一个模式对话框时,m_Btn.SetWindowText("MyButton")语句在OnInitDialog函数中执行没有问题。所以应该在DoModal中创建的。至于DoModal中是如何创建的,欢迎各位高手给与讲解。而对于非模式对话框,以下的程序运行没有问题:
CMyDialog dlg;
dlg.Create(IDD_MYDIALOG,this);
dlg.m_Btn.SetWindowText("MyButton");
可见控件的创建应该在Create函数中。
[解决办法]那么,如果非要实现这样的功能怎么办呢?笔者的解决办法是在对话框类中增加成员变量,比如m_sBtnTitle。数据的传递有以下三种方法:
1。增加Set函数,比如SetBtnTitle(CString str);
CMyDialog::SetBtnTitle(CString str)
{
    m_sBtnTitle = str;
}
调用程序如下:
CMyDialog dlg;
dlg.SetBtnTitle("MyButton");

2。将m_sBtnTitle定义成公有类型。

那么dlg.m_sBtnTitle = "MyButton";就可以了。

3。修改或者重载一个新的构造函数,比如:
CMyDialog::CMyDialog(CString str)
{
    m_sBtnTitle = str;
}
最后,在对话框类的初始化函数增加m_Btn.SetWindowText(m_sBtnTitle);即可。
还有一些网友提供的方法是定义全局变量。当然,首先肯定全局变量是可以完成此功能的。不过笔者并不赞同用全局变量的方法。对于面向对象的编程和设计来说,全局变量应该尽量少使用,因为全局变量将增加模块之间的耦合度,与面向对象的思想是有违背的。正如goto语句,好用但尽量少用。在这里笔者并不是反对用全局变量,而是要看情况而用。笔者曾经开发过一个日本项目,粗略计算一下,全局变量不下于1000个,这样的程序的维护难度可想而知。
希望此文能够帮助初学者在VC之路上少走一些歪路,尽快融入VC开发大军。

VC 修改窗口属性

说明: 以下函数对于POPUP窗口有效,对于子窗口好像不行。 //最小化按钮有效 ::SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWn...
  • XiaoY_2012
  • XiaoY_2012
  • 2016年05月28日 15:19
  • 856

使用dialog插件弹出提示和确定信息对话框8-8

dialog参数说明:http://www.cnblogs.com/bestfc/archive/2009/06/08/1498742.html
  • kuangfengbuyi
  • kuangfengbuyi
  • 2014年09月03日 11:41
  • 2726

子对话框修改主对话框的属性和控件

假设主对话框叫MainDlg,子对话框叫AccountsDlg,按下列步骤来: 第一步:在主对话框程序创建子对话框函数中:     CAccountsDlg dlg(this);//一定要加thi...
  • hannibaychty
  • hannibaychty
  • 2015年03月30日 10:01
  • 510

VS2013MFC对话框工程学习笔记五 - 了解窗口和窗口控件的属性并修改

在VS中,对着窗口控件点击鼠标右键,单击属性弹出属性对话框 可以编辑控件的基本属性,比如:窗口标题,窗口大小,控件大小等等...
  • asaqlp
  • asaqlp
  • 2016年04月11日 19:08
  • 1682

对话框控件属性的修改

【作者按】本文主要针对初学者在使用对话框赋值时的一些问题而写。如果你对对话框的使用已经很熟练,请跳过本文。【针对现象】许多初学者,常常写出这样的程序来修改对话框中某个按钮的标题:CMyDialog...
  • hejishan
  • hejishan
  • 2008年03月11日 10:52
  • 135

MFC控件属性修改笔记

EDIT控件多行显示: Multiline=True Auto HScroll=False
  • cosmoslife
  • cosmoslife
  • 2016年10月25日 15:08
  • 735

VS2010/MFC编程入门之五(对话框:创建对话框模板和修改对话框属性)

鸡啄米在上一讲中介绍了MFC的消息映射机制,属于原理方面的知识。对于VC++编程入门学习者来说可能有些抽象,鸡啄米会把消息映射的知识渗透到后面的教程中。本节开始为大家讲解偏应用的知识-创建对话框。 ...
  • xiaoxiaomao410
  • xiaoxiaomao410
  • 2014年03月12日 17:35
  • 1824

动态设置控件属性的值

以下代码可以实现动态设置控件指定的属性的值。代码如下。 /// /// 设置控件的属性的值 /// /// 控件类型 /// 属性值...
  • wangzl1163
  • wangzl1163
  • 2017年06月01日 13:56
  • 590

新手看过来:VC对话框控件属性的修改

【作者按】本文主要针对初学者在使用对话框赋值时的一些问题而写。如果你对对话框的使用已经很熟练,请跳过本文。  【针对现象】许多初学者,常常写出这样的程序来修改对话框中某个按钮的标题: CMyDialo...
  • shu09721060
  • shu09721060
  • 2010年07月04日 18:51
  • 529

动态修改控件属性

mTumbImageview 是一个imageview,在不同情况下,我们需要动态修改它的位置。而他的位置是相对于林外一个stbgimageview。在xml中我们定义android:layout_a...
  • sanlei1616
  • sanlei1616
  • 2014年04月02日 17:38
  • 949
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对话框控件属性的修改
举报原因:
原因补充:

(最多只允许输入30个字)