C++控件关联对象

1.C++控件关联对象

方法1:用向导关联变量

void DrawPoint::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_EDIT1, m_edit);
}

方法2:GetDlgItem(IDC_EDIT1)获取句柄赋值

CEdit× m_edit;
m_edit = (CEdit*)GetDlgItem(IDC_EDIT1);

// GetDlgItem只能获取子控件,可以在AboutDialog创建时,把句柄或窗口类的指针保存起来

// GetDlgItem返回CWIN*,这种方法关联的控件必须是CWIN类的派生类

方法3:在用Tab控件添加关联变量时发现控件变量那里是灰的, 为了关联控件变量,有一种方法:

1.首先为控件添加变量,如CTabCtrl m_TabCtrl.

2.在OnInitDialog函数中,添加 m_TabCtrl.SubclassDlgItem(IDC_TAB1,this); //IDC_TAB1是控件ID

3.这样m_TabCtrl就是控件IDC_TAB1的关联变量。

关于窗口子类化:SubclassDlgItem

子类化概念:
用一个窗口过程替换另一个过程的行为叫SUBCLASSING,这是WINDOWS意义上的派生子类,与面向对象语言的派生子类是完全不同的概念。
(向导添加关联变量)在VC 中,DoDataExchange函数中的DDX_Control之类的函数会调用SubClassDlgItem完成窗口子类化,这样控件自己就能处理消息了。

子类化步骤:
(1)窗体上放一个基类控件,如:CEdit—拖放
(2)有基类派生一个派生类,并生成该对象---如果这里用的是基类控件对象而不派生==就相当于变量关联
        CEdit->(继承)CMyEdit; // 派生类的定义
        CMyEdit  m_myEdit; // 创建派生类对象
(3)将窗体上控件子类化(subclass)为派生类的对象CMyEdit, 等价于将窗体上拖放的控件改变为派生类的对象—类型变了

 BOOL CMyDialog::OnInitDialog() //在窗体初始化函数OnInitDialog中进行子类化
{
    CDialog::OnInitDialog();
    m_MyEdit.SubclassDlgItem(ID,CWnd* pParent,this);
    return TRUE;
}

子类化后的效果以及相关函数:

简单来就是 对象转化和过程替换,拖放对象转化为派生对象,拖放对象的事件过程都有派生对象同名过程替换即由派生对象处理。
1.基类控件对象(拖放控件)变成了(自己派生的对象)派生控件对象 ;
2.该派生对象将接管控件对象的消息处理;
3.过程替换-对Dialog 上面的某个控件SubClass(子类化)后,其原控件对象的WindowProc(事件过程等)替换成你自己写的新派生控件CYourCWndClass
  的 WindowProc(同名过程),这样你就可以处理这个控件的所有消息了;用 ClassWizard 维护自己的 CYourCWndClass 就可以了

SubclassDlgItem把某个空间类派生对象与对窗体中已有的控件动态连接起来,该派生对象将接管控件对象的消息处理,从而使控件变为派生对象的类型,具有新的特性.

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

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

2.子窗口Create

m_drawPointDlg为子对话框(style)

m_drawPointDlg.Create(ID, ParentHandle);

3.ATL SubclassWindow

std::map<DWORD, boost::shared_ptr<CEdit2>> m_mapEdits;
m_mapEdits[textBox_IPUseID].reset( new CEdit2() );
m_mapEdits[textBox_IPUseID]->SubclassWindow( GetDlgItem(textBox_IPUseID) );

4.ATL控件IVSFlexGridPtr

IVSFlexGridPtr m_spGrid;
CAxWindow wndGrid = GetDlgItem(Grid_EigyoJikan);
wndGrid.QueryControl(&m_spGrid);

// http://helpcentral.componentone.com/docs/vsflexgrid8/vsflexgridpropertieseventsandmethods.htm

 

原文地址:https://www.cnblogs.com/zifeiye/p/8133921.html

时间: 2024-08-29 18:57:07

C++控件关联对象的相关文章

电子表格控件Spreadsheet 对象方法事件详细介绍

1.ActiveCell:返回代表活动单元格的Range只读对象.2.ActiveSheet:返回代表活动工作表的WorkSheet只读对象.3.ActiveWindow:返回表示当前窗口的Window对象.4.ActiveWorkbook:返回表示打开工作簿的Workbook对象.5.AllowPropertyToolbox:确定用户是否可以在运行时显示“命令和选项”对话框.boolean类型.6.Application:有两种情况,a)应用于OWCLanguageSettings对象时,返回

Andriod ADT v22.6.2版本中在Mainactivity.java中使用fragment_main.xml中TextView控件对象的问题

众所周知,我们既可以在 activity_main.xml文件中控制activity中的view,也可以使用java代码的set..()方法控制它.在学习过程中,发现在ADT新版本中,和以前版本有区别: 新建Andriod工程后,MainActivity 不再继承Activity,而继承的是ActionBarActivity:在layout文件夹下会自动生成两个.xml文件,activity_main.xml文件和fragement_main.xml文件,和以前的版本只有一个activity_m

【转】MFC对话框和控件

原文网址:http://www.cnblogs.com/tiwlin/archive/2013/05/08/3067966.html 对话框和控件 对话框是Windows应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据.控件是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入.输出功能.对话框与控件关系密切,在每个对话框上一般都有一些控件,对话框依靠这些控件与用户进行信息的交互. 在MFC中,对话框的功能被封装在CDialog类中,而CDialog类是CWnd

基于jQuery 常用WEB控件收集

Horizontal accordion: jQuery 基于jQuery开发,非常简单的水平方向折叠控件. Horizontal accordion: jQuery jQuery-Horizontal Accordion 具有XBOX360 blade界面风格的水平方向Accordion. jQuery-Horizontal Accordion AutoComplete-JQuery jQuery插件易于集成到现在的表单中(Form). AutoComplete-JQuery Facebook

关于VCL的编写 (一) 如何编写自己的VCL控件

如何编写自己的VCL控件 用过Delphi的朋友们,大概对Delphi的最喜欢Delphi的不是他的强类型的pascal语法,而是强大的VCL控件,本人就是一位VCL控件的爱好者. VCL控件的开源,给我们带来了享之不尽的优点.不像曾经的ole控件以及ActiveX,你全然能够重写Delphhi标准控件,并且网上这方面的资源非常多. 关于怎样编写VCL控件,和多Delphi的书籍里都有介绍,在此简单的说明一下. 在Delphi中,TComponent是全部VCL构件的基础.编写非可视构件以便从T

Android 自定义组合控件小结

引言 接触Android UI开发的这段时间以来,对自定义组合控件有了一定的了解,为此小结一下,本文小结内容主要讨论的是如何使用Android SDK提供的布局和控件组成一个功能完整组合控件并将其封装为面向对象的类,而并非讨论如何继承自SDK提供的控件类(比如TextView),对其进行自定义扩展的问题. 进入正题前,我们先来看一组功能需求 假设在手机需求上,那么如上三个界面我们可以使用三个Activity,每个Activity一个布局文件,实现起来比较独立,但是假设在Android pad上要

MFC标签页控件的使用

MFC标签页控件的使用 1.在对话框中添加一个标签页控件,并为此控件关联一个CTabCtrl类变量m_tabctrl. 2.创建若干个对话框资源作为标签页控件的标签. 修改两个属性: Border:    none   // 边界为空,这样它就没了标题栏 Style:      Child   // 这个模板就可以当作另一个窗口的子窗口了在对话框的初始化函数 3,在对话框的初始化函数OnInitDialog中, 添加初始化标签页控件的代码 3.1)  // 添加标签页,并设定标签名     m_

VC控件DateTimePicker使用方法

出自http://www.cnblogs.com/52yixin/articles/2111299.html 使用DateTimePicker控件一般是获 取其时间替代手工输入带来的不便,而DateTimePicker控件既可以获取日期(2010-03-05)也可以获取时间(16:27:33),要获 取日期只需要更改控件属性的格式为长日期或短日期,要获取时间则将格式更改为时间即可! 在添加控件变量时,选择其变量类型为CDateTimeCtrl(类如m_DateCtrl):在程序中定义CTime对

[WP8.1UI控件编程]Windows Phone XAML页面的编译

1.1.2 XAML页面的编译 Windows Phone的应用程序项目会通过Visual Studio完成XAML页面的编译,在程序运行时会通过直接链接操作加载和解析XAML,将XAML和过程式代码自动连接起来.如果你不在乎将XAML文件和过程式代码融合,那么只需要把它添加到Visual Studio的Windows Phone项目中来,并用界面中的Build动作来完成编译即可,一般公共的样式资源的XAML文件都是采用这种方式.但是如果要编译一个XAML文件并将它与过程式代码混合,第一步要做的