关于GetDlgItem的一个问题 急

zyboy032 2009-08-24 02:02:14
我在书上和一些贴子上看见类似这样的代码:
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(TEXT("上海"));

(GetDlgItem(IDC_BUTTON1))->SetWindowText(_T("123"));

我是在CDialog派生类的构造函数里面调用的
为什么在其他地方可以呢?

两种都出现这样的情况
可是为什么我这样用就不行呢?

错误代码如下:

For information on how your program can cause an assertion
failure, see the Visual C++ document on asserts .
...全文
219 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jittuo 2009-08-24
  • 打赏
  • 举报
回复
自己定义一个button k控件函数,将代码添加在里面就可以了!
bobo_2003 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zaodt 的回复:]
在类的构造函数中调用 GetDlgItem 出错,是正确的。


因为在类的构造函数时,你的对话框窗口还没有建立,其中的控件窗口也没有建立;


这时,你去操作窗口,当然要出错了,因为它们还不存在。

=======

你可以在对话框的 OnInitDialog 函数中做 GetDlgItem 调用和控制控件窗口。
[/Quote]

顶这个
TearyWang 2009-08-24
  • 打赏
  • 举报
回复
#1 楼,正解。

把它放到OnInitDialog()里去。
雪影 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zaodt 的回复:]
在类的构造函数中调用 GetDlgItem 出错,是正确的。


因为在类的构造函数时,你的对话框窗口还没有建立,其中的控件窗口也没有建立;


这时,你去操作窗口,当然要出错了,因为它们还不存在。

=======

你可以在对话框的 OnInitDialog 函数中做 GetDlgItem 调用和控制控件窗口。
[/Quote]
up
必须先使用DoModal或Create等函数创建了对话框之后,你才能通过GetDlgItem去获取对话框中的空间窗口句柄。
不然,对话框都不存在,你又如何去获取对话框中的子窗口句柄呢?
vagrantisme 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zaodt 的回复:]
在类的构造函数中调用 GetDlgItem 出错,是正确的。

因为在类的构造函数时,你的对话框窗口还没有建立,其中的控件窗口也没有建立;

这时,你去操作窗口,当然要出错了,因为它们还不存在。

=======

你可以在对话框的 OnInitDialog 函数中做 GetDlgItem 调用和控制控件窗口。
[/Quote]

同意,看看深入浅出MFC吧。很管用的。
shakeyou123 2009-08-24
  • 打赏
  • 举报
回复
你在构造函数了,这些控件都还没“出生”,找不到当然会出错了,解决方法楼上各位已经给出了
dengxuxing 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zaodt 的回复:]
在类的构造函数中调用 GetDlgItem 出错,是正确的。


因为在类的构造函数时,你的对话框窗口还没有建立,其中的控件窗口也没有建立;


这时,你去操作窗口,当然要出错了,因为它们还不存在。

=======

你可以在对话框的 OnInitDialog 函数中做 GetDlgItem 调用和控制控件窗口。
[/Quote]

非常正确.
MoXiaoRab 2009-08-24
  • 打赏
  • 举报
回复
此时对话框的实例还未创建,虽然你的ID是存在的没错,但是没有和创建之后的实例对象进行绑定
((CComboBox*)GetDlgItem(IDC_COMBO1))这样是取不到该类的实例指针的,自然也不能操作

你要记住一定要在控件类对象创建完毕之后才行
jyh_baoding 2009-08-24
  • 打赏
  • 举报
回复
OnInitDialog() 调用后才可以
副组长 2009-08-24
  • 打赏
  • 举报
回复

在构造函数里面肯定是不可以的,通常应该在OnInitDialog()对这些控件初始化,但是也不应该GetDlgItem,你在建立对话框时不是放置了控件吗?为其添加变量,用变量名在OnInitDialog()初始化。
NTooL 2009-08-24
  • 打赏
  • 举报
回复
楼上正解。
zaodt 2009-08-24
  • 打赏
  • 举报
回复
在类的构造函数中调用 GetDlgItem 出错,是正确的。


因为在类的构造函数时,你的对话框窗口还没有建立,其中的控件窗口也没有建立;


这时,你去操作窗口,当然要出错了,因为它们还不存在。

=======

你可以在对话框的 OnInitDialog 函数中做 GetDlgItem 调用和控制控件窗口。
heiheizh618 2009-08-24
  • 打赏
  • 举报
回复
学习~~
dqpi08 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zaodt 的回复:]
在类的构造函数中调用 GetDlgItem 出错,是正确的。


因为在类的构造函数时,你的对话框窗口还没有建立,其中的控件窗口也没有建立;


这时,你去操作窗口,当然要出错了,因为它们还不存在。

=======

你可以在对话框的 OnInitDialog 函数中做 GetDlgItem 调用和控制控件窗口。
[/Quote]
Up:注意应该在哪初始化
wanjingwei 2009-08-24
  • 打赏
  • 举报
回复
学习了

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧