重谈《Visual C++从入门到精通》
发表在C语言图书答疑 2012-12-23
是否精华
版块置顶:
老师,您好:
上一次的问题,老师给我回答如下:

我的问题:

《Visual C++从入门到精通》2008年第1版,第12章习题1,在光盘上是:
E:\TM\sl\12\9\DigitStatic ,其中文件 DigitStatic.cpp中第92行:

SubclassDlgitem(uID, pParent);

为了查看其操作,我自己重新编写了个程序,可不能执行。



老师的回答:

SubclassDlgitem这个函数主要用于子类化。子类化的意思就是本章所提到的使用已有的控件作为基类,使用子类继承它,使当前对话框与其相连接,并确实这个子类控件能够接受消息。
那么,使用此函数时,必须先创建一个子类控件继承对话框上已有的控件。在对话框内创建子类控件的实例成员(例如一个继承自CStatic的子类CStaticEx,在对话框类中创建一个此类型的成员变量),使用这个函数将它和当前对话框相联系起来。



我重新创建基本对话框的步骤如下:
(1) 创建一个基本对话框应用程序 MyStatic;
(2) 向对话框中添加一个静态文本控件;
(3) 改变此静态文本控件的 ID为:IDC_MYSTATIC;
(4) 在Class View视窗内右键选 MyStatic classes,在弹出的“新建类”窗口中,创建继承基类为 CStatic类的子类 CStaticEx;
(5) 在对话框的头文件 MyStaticDlg.h中,添加语句:#include "StaticEx.h";
(6) 打开类向导,为静态文本控件( IDC_MYSTATIC )添加变量 m_StaticEx; ( m_StaticEx 的 Type是:CStatic );
(7) 在对话框的头文件 MyStaticDlg.h中,找到语句:CStatic   m_StaticEx,将其改为:CStaticEx   m_StaticEx;
(8) 在对话框的源文件 MyStaticDlg.cpp的初始化函数 OnInitDialog()中,添加一个语句:

m_StaticEx.SubclassDlgitem(IDC_MYSTATIC, this);

程序编译通过了,可运行 MyStatic.exe 时,还是出现错误:Debug Assertion Failed ! 只能终止。
请老师帮我检查一下,以上步骤错在哪里了?  谢谢!
    
分享到:
精彩评论 1
过冬的松鼠
学分:0 LV1
TA的每日心情
Q
2021-01-03 22:18:14
2012-12-28
沙发
读者朋友你好。上述步骤有问题的一步是(6)。通过类向导所添加的控件变量已经将该ID的控件映射为窗体的变量,MFC会将某些代码生成到我们的对话框类中,当使用这个子类化函数时,会有一个“断言”来判断该ID是否已经在对话框中成为了成员变量,如果是,那么断言就会生生效,报错。正确的做法是通过类视图或者手动向对话框类中添加一个 CStaticEx类型的成员变量m_edit。使用这个新创建的m_edite的SubclassDlgitem函数将设计选项卡上的CEdit控件ID和对话框的指针传入进参数,就可以实现文本框的子类化。
首页上一页 1 下一页尾页 1 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照