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

2004-06-08 09:52 出处:CSDN 作者:happyparrot 责任编辑:linjixiong

 【作者按】本文主要针对初学者在使用对话框赋值时的一些问题而写。如果你对对话框的使用已经很熟练,请跳过本文。

  【针对现象】许多初学者,常常写出这样的程序来修改对话框中某个按钮的标题:






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;
}



  希望看到更多更经典的开发技巧,请随时刷新《开发特区》栏目。


察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品