`
mybwu_com
  • 浏览: 177673 次
  • 性别: 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);
分享到:
评论

相关推荐

    不规则形状、不规则热区按钮

    /* ...* 使用方法:需要使用MySubclassDlgItem来设定使用图片形状按钮,如果是矩形用SubclassDlgItem也可以无区别 * 待完善:create按钮时的任意形状,实际上,可以在重载create时传入rgn参数即可 */

    任意形状按钮的实现

    * 使用方法:需要使用SubclassDlgItemEX来设定使用图片形状按钮,如果是矩形用SubclassDlgItem也可以无区别 * 修改:优化原来不清晰的按钮状态逻辑,代码更清晰,取出不必要的操作和属性 * 待优化:背景图片的加载 *...

    MyHoverButtonDemo不规则形状、不规则热区按钮

    使用方法:需要使用MySubclassDlgItem来设定使用图片形状按钮 如果是矩形用SubclassDlgItem也可以无区别 待完善:create按钮时的任意形状 实际上 可以在重载create时传入rgn参数即可 ">0 上一个上传版本只有...

    不规则形状按钮(包括不规则响应区域),支持任意图片格式

    本人编写,欢迎提出问题 ...* 使用方法:需要使用MySubclassDlgItem来设定使用图片形状按钮,如果是矩形用SubclassDlgItem也可以无区别 * 待完善:create按钮时的任意形状,实际上,可以在重载create时传入rgn参数即可

    bmp button control

    在MFC中,要使用图形按钮,一般会选择CBitmapButton类,使用CBitmapButton类可以设置按钮的Normal、Selected、Focused和Disabled四种状态的bmp图像,这四副状态图像要求同尺寸大小,其中normal状态图片是必需提供的。...

    DP系列开发板、实验仪选型指南

    m_bmpBtn.SubclassDlgItem(IDC_BUTTON1,this);//关联控件 //CBitmapButton对象m_bmpBtn的LoadBitmaps函数加载程序内bmp资源。 m_bmpBtn.LoadBitmaps(IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP4); m_bmpBtn....

Global site tag (gtag.js) - Google Analytics