`
testcs_dn
  • 浏览: 113819 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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.
综上所述,要在程序中使用派生控件,应该按下面两步进行:
在对话框模板中放置好基类控件.
在对话框类中嵌入派生控件类的对象.
否则函数将会执行失败,一定要注意!
在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);
分享到:
评论

相关推荐

    vc6.0 MFC 窗口类函数介绍

    - `BeginPaint()` 和 `EndPaint()`:这两个函数用于开始和结束窗口的绘画过程,通常在响应WM_PAINT消息时使用。 - `PrintClient()`:用于在打印机上绘制窗口的内容。 - `RedrawWindow()`:当需要更新窗口的特定...

    VC++ 在列表控件中插入行

    通过上述步骤,你可以在VC++中成功地在列表控件中插入行。如果你需要更深入地学习,建议查阅MFC和CListCtrl类的相关文档,以及Windows API中的ListView控制相关的函数。此外,还可以参考其他开发者的代码和教程,...

    VC++使用Picture控件播放图片

    在VC++编程环境中,Picture控件是一个非常有用的工具,它允许开发者在应用程序中显示静态图像。这个控件在MFC(Microsoft Foundation Classes)库中被广泛使用,为用户界面增添视觉元素,例如图标、照片或者任何其他...

    VC++6 MFC计算器设计过程文档

    * 使用 GetDlgItem()、SetDlgItemText()、GetDlgItemText()、UpdateData()、SubclassDlgItem() 等函数来操作窗体子控件 知识点七:消息相关的函数 * 使用 SendMessage()、PostMessage() 等函数来处理消息 知识...

    VC++2008树的实例开发

    `,并在OnCreate()函数中找到这个控件,并将它与成员变量关联起来,通过`m_treeCtrl.SubclassDlgItem(IDC_TREECTRL1, this);`。 树的节点分为根节点和子节点。添加根节点可以使用`HTREEITEM hRoot = m_treeCtrl....

    vc++6.0 MFC 窗口子类化

    在MFC中,我们可以使用`CWnd::SubclassDlgItem`或`CWnd::SubclassWindow`方法来实现窗口子类化。 对于多文档界面(MDI)应用程序,每个文档通常都有自己的视图(View)类,这些视图类继承自`CView`。在MDI程序中,...

    vc++tree树形控件,仿资源管理器_TreeCtrl.zip

    在提供的压缩包中,“vc++tree树形控件,仿资源管理器.txt”和“树控件的使用”很可能是包含详细步骤和示例代码的文档,它们将帮助你更深入地理解如何在VC++中实现这个功能。仔细阅读这些资料,结合上面的解释,你...

    走出MFC子类化的迷宫子类化,SUBCLASSWINDOW ,MFC消息机制

    在这篇文章中,我们将深入探讨 MFC 子类化机制的原理和实现方式,并提供一个实际的示例来演示如何使用子类化机制来实现一个只能输入 A、B、C 的 EDIT 控件。 什么是 Windows 子类化? -------------------- 在 ...

    vc++背景图象对话框的实现

    在VC++中,我们可以使用MFC(Microsoft Foundation Classes)库来创建和管理对话框。MFC提供了CDialog类,它是所有对话框类的基础,用于处理对话框的创建、显示和消息处理。 实现图像背景对话框的关键步骤如下: 1...

    VC 动态改变位图

    在VC++环境中,动态改变位图是指在程序运行过程中,根据需要实时更新显示的位图图像。这在很多应用程序中都是必要的,比如游戏中的动画、用户界面的动态图标或者数据可视化等。本示例提供了如何在MFC(Microsoft ...

    VC 中 对话框使用 CHtmlView

    以上就是在VC++中使用MFC的`CDialog`和`CHtmlView`的简单示例。通过这些步骤,你可以在对话框中展示HTML内容,甚至实现一些基本的浏览器功能。记住,为了获得更复杂的功能,如登录、表单提交等,你可能需要对`...

    用VC制作含复选框的应用程序

    在VC++中,我们可以使用MFC(Microsoft Foundation Classes)库来简化这个过程,MFC提供了一种面向对象的方式来处理这些Windows控件。 创建一个新项目: 1. 打开Visual C++,选择“文件”>“新建”>“项目”,然后...

    vc6.0中CButtonST类的使用方法总结

    ### vc6.0中CButtonST类的使用方法总结 #### 概述 CButtonST作为Visual C++中MFC框架的一部分,是一个功能强大的自定义按钮控件类,由Davide Calabro开发并公开分享。该类扩展了基础的`CButton`类,并增加了诸如...

    VC 重绘CBUTTON

    本文将详细讲解如何使用MFC框架在VC++中实现CButton控件的重绘,以及如何实现其他控件如CEdit、CComboBox的自定义绘制。 首先,重绘CButton控件的基本步骤如下: 1. **创建派生类**:创建一个以CButton为基类的...

    VC 界面编程-会变色的按钮

    同时,不要忘记在类的初始化函数中调用CWnd::subclassDlgItem将子类化操作应用到实际的按钮控件上。 在工程中,你可以通过资源编辑器添加一个新的对话框,并将新定义的CColorButton控件拖放到对话框上。在对话框类...

    FileCopy进度条

    - 在对话框类的初始化函数( OnInitDialog() )中,使用`FindWindowEx()`或`GetDlgItem()`获取控件句柄,并赋值给成员变量,例如`m_ProgressCopy.SubclassDlgItem(IDC_PROGRESS_COPY, this);` - 设置进度条的样式...

    VC编程实现创建可编辑节点的树形控件

    在VC++编程环境中,树形控件(Tree Control)是一种常用的数据展示组件,它能够以层级结构显示数据,常...在这个过程中,你将掌握VC++中树形控件的基本用法和自定义编辑功能,为进一步的Windows GUI编程打下坚实基础。

    CButtonST详解和接口函数.doc

    - 在 OnInitDialog 函数中,通过`SubclassDlgItem`方法将标准CButton控件替换为CButtonST,并使用`SetIcon`方法设置图标,如`m_btn.SetIcon(IDI_EOAPP);`。 - 使用`SetFlat`方法可以改变按钮的样式,`FALSE`表示非...

    CButtonST及其使用方法

    本文将深入探讨CButtonST的特性、使用方法以及如何在项目中集成和应用。 CButtonST的核心特点在于其强大的样式定制能力。它支持多种预设样式,如平滑边框、渐变色、图片按钮、文字阴影等,同时允许开发者自定义按钮...

    自定义Button类

    4. **子类化**:使用`SubclassDlgItem`函数将标准的Button控件转换为自定义的CMyButton对象,使得我们可以控制它的行为和外观。 5. **控件绘图**:使用`DrawText`函数绘制按钮上的文本,`FillRect`和`FrameRect`函数...

Global site tag (gtag.js) - Google Analytics