本文主要针对初学者在使用对话框赋值时的一些问题而写。如果你对对话框的使用已经很熟练,请跳过本文。
许多初学者,常常写出这样的程序来修改对话框中某个按钮的标题: 【相关文章:长命百岁和死而复生】 【扩展阅读:Eclipse插件开发系列(5):SWT】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函数中。 ... 下一页