VC++中subclassdlgitem函数的功能、用法及注意事项

subclassdlgitem

该函数用来子类化一个控件.

Subclass(子类化)是MFC中最常用的窗体技术之一。子类化完成两个工作:一是把窗体类对象attach到一个windows窗体实体中(即把一个窗体的hwnd赋给该类)。另外就是把该类对象的消息加入到消息路由中,使得该类可以捕获消息。

SubclassDlgItem可以把对话框中已有的控件与某个窗口对象动态连接起来,该窗口对象将接管控件的消息处理,从而使控件具有新的特性.SubclassDlgItem函数的声明为

BOOL SubclassDlgItem( UINT nID, CWnd* pParent );

参数nID是控件的ID,pParent是指向父窗口的指针.若连接成功则函数返回TRUE,否则返回FALSE.

综上所述,要在程序中使用派生控件,应该按下面两步进行:

在对话框模板中放置好基类控件.

在对话框类中嵌入派生控件类的对象.

在OnInitDialog中调用SubclassDlgItem将派生类的控件对象与对话框中的基类控件相连接,则这个基类控件变成了派生控件

要在程序中创建新设计的控件,显然不能用自动创建的办法,因为对话框模板对新控件的特性一无所知.程序可以用手工方法创建控件,在调用派生类的Create函数时,派生类会调用基类的Create函数创建控件.用Create函数创建控件是一件比较麻烦的工作,程序需要为函数指定一大堆的控件风格以及控件的坐标和ID.特别是控件的坐标,没有经验的程序员很难确切地安排控件的位置和大小,往往需要反复调整.利用MFC的CWnd::SubclassDlgItem提供的动态连接功能,可以避免Create函数的许多麻烦,该函数大大简化了在对话框中创建派生控件的过程.

大家知道,在用手工方法创建控件时,先要构建一个控件对象,然后再用Create函数在屏幕上创建控件窗口,也就是说,控件的创建工作是由控件对象完成的.动态连接的思路则不同,SubclassDlgItem可以把对话框中已有的控件与某个窗口对象动态连接起来,该窗口对象将接管控件的消息处理,从而使控件具有新的特性.SubclassDlgItem函数的声明为

BOOL SubclassDlgItem( UINT nID, CWnd* pParent ); 

参数nID是控件的ID,pParent是指向父窗口的指针.若连接成功则函数返回TRUE,否则返回FALSE.

综上所述,要在程序中使用派生控件,应该按下面两步进行:

在对话框模板中放置好基类控件.

在对话框类中嵌入派生控件类的对象.

否则函数将会执行失败,一定要注意!

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/vc/

在OnInitDialog中调用SubclassDlgItem将派生类的控件对象与对话框中的基类控件相连接,则这个基类控件变成了派生控件.

例如,如果要在对话框中使用新设计的编辑框控件,应先在对话框模板中的合适位置放置一个普通的编辑框,然后,在OnInitDialog函数中按下面的方式调用SubclassDlgItem即可:

BOOL CMyDialog::OnInitDialog()

{

CDialog::OnInitDialog();

m_MyEdit.SubclassDlgItem(IDC_MYEDIT, this);

return TRUE;

}

下面的代码演示通过配置文件创建自定义按钮,使用“SubclassDlgItem”,

并解决没有在对话框模板中放置好基类控件的方法

CxSkinButton *pSkinBnt = NULL;
pSkinBnt = new CxSkinButton; // del at Clear();  

//子类化控件
BOOL ret = pSkinBnt->SubclassDlgItem(id,parent);  

//如果执行失败,则说明没有在对话框模板中放置好基类控件
if (!ret)
{
    //创建按钮
    UINT stype = WS_CHILD|WS_VISIBLE;
    pSkinBnt->Create(NULL, stype, rect, parent, id);
}

我调用“SubclassDlgItem”函数成功了,

为什么按钮却没有显示呢?

一共就两个参数,ID,Parent,检查一下参数传递的是否正确吧!

如果使用了重复的ID,就会出现这种情况。

另外,如果做了变量映射,调用此函数就会触发:Asert(m_hwnd== NULL);

作者:csdn博客 微wx笑

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, 控件
, 对话框
, 函数
, mfc窗体
, 两控件
, 窗口
, 子类
, 基类对话框
, 控件对话框
, 控件对象
, 控件类
, 对话框基类
普通基类
subclassdlgitem、subclassdlgitem 出错、setdlgitemtext用法、setdlgitemtext、mfc setdlgitemtext,以便于您获取更多的相关知识。

时间: 2024-10-02 22:43:15

VC++中subclassdlgitem函数的功能、用法及注意事项的相关文章

VC++中subclassdlgitem函数的功能及用法

  该函数用来子类化一个控件. Subclass(子类化)是MFC中最常用的窗体技术之一.子类化完成两个工作:一是把窗体类对象attach到一个windows窗体实体中(即把一个窗体的hwnd赋给该类).另外就是把该类对象的消息加入到消息路由中,使得该类可以捕获消息. SubclassDlgItem可以把对话框中已有的控件与某个窗口对象动态连接起来,该窗口对象将接管控件的消息处理,从而使控件具有新的特性.SubclassDlgItem函数的声明为 BOOL SubclassDlgItem( UI

jquery中map函数遍历数组用法实例

  本文实例讲述了jquery中map函数遍历数组用法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "

jquery中map函数遍历数组用法实例_jquery

本文实例讲述了jquery中map函数遍历数组用法.分享给大家供大家参考.具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <

VC++中图像处理类CBitmap的用法_C 语言

VC++中图像处理类CBitmap的用法 class CBitmap : public CGdiObject { DECLARE_DYNAMIC(CBitmap) public: static CBitmap* PASCAL FromHandle(HBITMAP hBitmap); // Constructors CBitmap(); BOOL LoadBitmap(LPCTSTR lpszResourceName); BOOL LoadBitmap(UINT nIDResource); BOO

C++中回调函数(CallBack)的用法分析_C 语言

本文实例分析了C++中回调函数(CallBack)的用法.分享给大家供大家参考.具体分析如下: 如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过. 其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即"this"指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员.这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员.由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时

VC中TRACE()的用法

个人总结:最近看网络编程是碰到了TRACE语句,不知道在哪里输出,查了一晚上资料也没找出来,今天终于在CSDN上找到了,真是个高地方啊,方法如下: 1.在MFC中加入TRACE语句 2.在TOOLS->MFC TRACER中选择 "ENABLE TRACING"点击OK 3.进行调试运行,GO(F5)(特别注意:不是执行'!'以前之所以不能看到TRACE内容,是因为不是调试执行,而是'!'了,切记,切记) 4.然后就会在OUTPUT中的DEBUG窗口中看到TRACE内容了,调试执

VC中TRACE ASSERT VERIFY之用法

一.TRACE宏     当选择了Debug目标,并且afxTraceEnabled变量被置为TRUE时,TRACE宏也就随之被激活了.但在程序的Release版本中,它们是被完全禁止的.下面是一个典型的TRACE语句:     -         int nCount =9;         CString strDesc("total");         TRACE("Count =%d,Description =%s\n",nCount,strDesc);

深度探究C++中的函数重载的用法_C 语言

C++ 允许同一范围内具有相同名称的多个函数的规范.这些函数称为重载函数,"重载"中对其进行了详细介绍.利用重载函数,程序员可以根据参数的类型和数量为函数提供不同的语义. 例如,采用字符串(或 char *)参数的 print 函数执行的任务与采用"双精度"类型的参数的函数执行的任务截然不同.重载允许通用命名并使程序员无需创建名称,例如 print_sz 或 print_d.下表显示了 C++ 使用函数声明的哪些部分来区分同一范围内具有相同名称的函数组.重载注意事项

jQuery中animate的几种用法与注意事项_jquery

一.animate语法结构 animate(params,speed,callback) params:一个包含样式属性及值的映射,比如{key1:value1,key2:value2} speed:速度参数[可选] callback:在动画完成时执行的函数[可选] 二.自定义简单动画 用一个简单例子来说明,实现单击某div在页面上横向飘动的效果. <style> #cube{ position:relative;/* 不加这句元素不能动 */ width:30px; height:30px;