`
helpbs
  • 浏览: 1165079 次
文章分类
社区版块
存档分类
最新评论

对话框控件属性的修改

 
阅读更多

【作者按】本文主要针对初学者在使用对话框赋值时的一些问题而写。如果你对对话框的使用已经很熟练,请跳过本文。
针对现象】许多初学者,常常写出这样的程序来修改对话框中某个按钮的标题:
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++改变对话框中控件颜色

     VC++改变对话框中控件的颜色,并设置窗口属性为不可拖动改变大小,鼠标放在右下角窗体的边缘,也不会显示出可以拖动的标志,窗体固定显示为源代码中设置的大小,这都是一些VC++编程的小技巧,希望对学习VC的新手...

    MFC 窗口中控件随窗口放大相应改变大小

    对话框中控件随窗口放大(缩小)进行相应的改变。本例中的对话框只能最大化或还原,你可在对话框的属性中修改Border为Resizing,即可用鼠标拖动改变对话框大小。

    常用VC控件大小及颜色修改

    六、设置对话框里的STATIC控件颜色属性: 3 七、使窗口的最大化和最小化按钮消失: 3 八、设置控件字体颜色:(例如STATIC控件) 3 九、修改单文档程序的标题: 4 十、自绘菜单宽度不对,高度是对的,解决办法: 4 ...

    仿中关村在线参数修改弹出对话框源码

    3.CSS实现的对话框控件必须在当前页面上最好不要在ascx控件页面上实现因为不能从一个button事件中调用另一个button事件, 如果在ascx控件页面上实现则对话框控件中执行的操作太多并且可能在ascx控件页面实例化多个...

    MFC 窗口中控件

    对话框中控件随窗口放大(缩小)进行相应的改变。本例中的对话框只能最大化或还原,你可在对话框的属性中修改Border为Resizing,即可用鼠标拖动改变对话框大小。

    仿中关村在线参数修改弹出对话框 v1.1源码

    3.CSS实现的对话框控件必须在当前页面上最好不要在ascx控件页面上实现因为不能从一个button事件中调用另一个button事件, 如果在ascx控件页面上实现则对话框控件中执行的操作太多并且可能在ascx控件页面实例化多个...

    为对话框程序添加工具条和状态栏

    虽然在对话框程序上可以通过修改其属性来添加系统菜单,但对比SDI和MDI程序的工具条和状态栏未免使界面显得简单、单调。虽然在Visual Basic 中提供有独立的工具条和状态栏标准控件可以直接在对话框上使用,但Visual ...

    VS2010-MFC编程入门

    VS2010-MFC编程入门之十(对话框:设置对话框控件的Tab顺序)-软件开发-鸡啄米 VS2010-MFC编程入门之十一(对话框:模态对话框及其弹出过程)-软件开发-鸡啄米 VS2010-MFC编程入门之十二(对话框:非模态对话框的...

    皮肤控件DELPHI

    BusinessSkinForm 皮肤控件源码版 一,安装 1、双击BSFD7.dpk文件,在delphi 7.0中打开 2、单击compile按钮,你会发现原来不可用的install按钮可以...4、修改bsCompressedStoredSkin1的filename属性,指向一个皮肤文件

    Visual Basic 6 Resizer VB6控件动态位置大小调整

    有了这个控件就方便多了,Resize事件中一行代码不用写,只需将这个控件拖动到窗体上,然后设置被调整控件的Tag属性,在运行时刻就可以进行调整了.VB6ResizerLib 2.0 版本新增分隔条控件,运行时可动态调整.同时修改了1.x...

    unodit:unodit使用对话框自动执行一些繁琐的任务,以帮助您使用Python(PyUNO)编写自己的LibreOffice扩展

    它使用对话框和对话框控件属性定义了一个名为MyAppName_UI的类。 对话框中的每个按钮都与动作侦听器连接。 新增:在侧边栏中添加了窗口侦听器。 如果再次生成该文件,则对该文件所做的所有更改都将被覆盖允许您根据...

    MFC中动态创建控件以及事件响应实现方法

     放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的...

    鸡啄米:VS2010-MFC编程入门教程(1-55).docx

    VS2010/MFC编程入门之十(对话框:设置对话框控件的Tab顺序) VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程) VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示) VS2010/MFC编程入门...

    创建一个多边形Active控件

    (MFC) 提供的其他控件类(以前称为 OLE 控件),可以在 Windows 应用程序的对话框中使用,或在万维网的 HTML 页中使用,本次创建的Active控件主要是在其上显示一个圆其内部有多边形,并通过一系列操作更改其边数和...

    MFC 编程入门教程55篇完整版.pdf

    VS2010/MFC 编程入门之十(对话框:设置对话框控件的Tab 顺序) VS2010/MFC 编程入门之十一(对话框:模态对话框及其弹出过程) VS2010/MFC 编程入门之十二(对话框:非模态对话框的创建及显示) VS2010/MFC 编程...

    VB程序设计及应用

    8.2.1 通用对话框控件 8.2.2 通用对话框的属性与方 8.3 通用对话框的使用 8.3.1 打开(Open)对话框 8.3.2 另存为(SaveAs)对话框 8.3.3 颜色(Color)对话框 8.3.4 字体(Font)对话框 ...

    VC学习大纲 VC学习讲义

    对话框用户界面程序的编写,如何向对话框控件联接数据成员及其实现机理,如何向对话框控关联控件类,如何利用对话框类的成员函数向控件发送消息和获取对话框控件的类指针,如何直接利用对话框控件类操纵对话框控件...

    Visual C++2010开发权威指南.part02

    5.12.1 选项卡和选项卡控件属性 235 5.12.2 选项卡控件的使用方法 235 5.12.3 创建选项卡控件的方法 235 5.12.4 处理选项卡控件通知消息 236 5.12.5 CTabCtrl类简介 236 5.13 Visual C++ 2010 IP控件简介与 5.13 ...

Global site tag (gtag.js) - Google Analytics