转自: https://blog.csdn.net/u014162133/article/details/46573873

容器和服务器程序

容器应用程序时可以嵌入或链接对象的应用程序。Word就是容器应用程序。

服务器应用程序是创建对象并且当对象被双击时,可以被启动的应用程序。Excel就是服务器应用程序。

ActiveX控件不能独立运行,它必须被嵌入容器应用程序中,和容器应用程序一起运行。

Dispatch maps调度映射,主要是MFC提供让外部应用程序可以访问控件的属性和方法

Event maps事件映射,控件向包含它的容器发送事件通知

接口是外部程序和控件进行通信的协议,可以把接口看作是函数的集合,外部程序通过接口提供的方法,去访问控件的属性和方法。接口中所定义的所有函数都是纯虚函数

regsvr32 ...注册控件  regsvr32 /u....卸载控件

STDAPI DllRegisterServer(void)将控件信息写入注册表中

STDAPI DllUnregisterServer(void)卸载注册信息。

制作一个时间控件,在

void CClockCtrl::OnDraw(CDC* pdc, const CRect& rcBounds,

const CRect& rcInvalid)中添加以下代码:

CBrush brush(TranslateColor(GetBackColor()));

pdc->FillRect(rcBounds,&brush);

pdc->SetBkMode(TRANSPARENT);

pdc->SetTextColor(TranslateColor(GetForeColor()));

//为控件设置属性,必须在MFC ClassWizared中为控件添加属性,上面几行代码才有用

CTime time=CTime::GetCurrentTime();

CString str=time.Format("%H : %M : %S");

pdc->TextOut(0,0,str);

这样就能做出一个静态的时间控件,如果我们想使控件实时显示时间,需要添加两个消息响应函数  WM_CREATE,WM_TIMER.

代码:

int CClockCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (COleControl::OnCreate(lpCreateStruct) == -1)

return -1;

// TODO:  在此添加您专用的创建代码

SetTimer(1,1000,NULL);

return 0;

}

void CClockCtrl::OnTimer(UINT nIDEvent)

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

Invalidate();    //立即引起窗口重绘

//也可以使用InvalidateControl();  //强制窗口重绘,效果相同

COleControl::OnTimer(nIDEvent);

}

要修改控件的背景色前景色和字体颜色

在OnDraw中添加

CBrush brush(TranslateColor(GetBackColor()));

pdc->FillRect(rcBounds,&brush);

pdc->SetBkMode(TRANSPARENT);

pdc->SetTextColor(TranslateColor(GetForeColor()));

ActiveX控件的四种属性

Stock:为每个控件提供的标准属性,如字体或颜色。

Ambient:围绕控件的环境属性——已被置入容器的属性。这些属性不能被修改,但控件可以使用它们调整自己的属性。

Extended:这些是由容器处理的属性,一般包括大小和在屏幕上的位置。

Custom:由控件开发者添加的属性。

使控件具有多于一个属性页

首先在**ctl.cpp中找到Property Pages,代码如下:

BEGIN_PROPPAGEIDS(CClockCtrl, 2)

PROPPAGEID(CClockPropPage::guid)

PROPPAGEID(CLSID_CColorPropPage)

END_PROPPAGEIDS(CClockCtrl)

需要注意的是要显示几个属性页BEGIN_PROPPAGEIDS(CClockCtrl, 2)中的代码为几,如果没有修改或修改错误,会产生不可预料错误。

要增加标准属性,在_DClock上点击右键,选择增加属性,选中Stock,例如选择背景色和前景色

接下来会在Clock.odl下生成以下代码:

dispinterface _DClock

{

properties:

[id(DISPID_BACKCOLOR), helpstring("属性 BackColor")] OLE_COLOR BackColor;

[id(DISPID_FORECOLOR), helpstring("属性 ForeColor")] OLE_COLOR ForeColor;

methods:

[id(DISPID_ABOUTBOX)] void AboutBox();

};

接下来新增自定义属性,方法同上,只是需选中“成员变量”或“get/put”

会自动生成成员变量:m_Interval,和成员函数OnIntervalChanged。

接下来添加代码:

void CClockCtrl::OnIntervalChanged(void)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

// TODO: 在此添加属性处理程序代码

if(m_Interval<0 || m_Interval>6000)

{

m_Interval=2000;

}

KillTimer(1);

SetTimer(1,m_Interval/1000*1000,NULL);

SetModifiedFlag();

}

测试:运行ActiveX测试器,选择control---〉Invoke Methods对m_Interval进行修改。

为编辑框增加成员变量MFC ClassWizard-->Member Variables-->Add Member Variable-->

Optional  property  name:

选择自定义属性的外部名,这样我们不需要增加代码就能把控件和自定义属性相关联。

在void CClockPropPage::DoDataExchange(CDataExchange* pDX)中会生成下面代码:

DDP_Text(pDX, ID_EDIT_INTERVAL, m_updateInterval, _T("Interval") );

DDX_Text(pDX, ID_EDIT_INTERVAL, m_updateInterval);

在.NET2003下我始终找不到“Optional  property  name:”在哪,所以在我属性页上的编辑框无效,我只能选择control---〉Invoke Methods进行修改。

为控件增加函数,MFC ClassWizard-->Member Variables-->Add Method

Class Name要选择CClockCtrl

输入函数名,之后就可以在CClockCtrl类中找到了

我们选择MFC ClassWizard-->ActiveX Events--->Add Event

之后会在DClockEvents中增加一个事件,DClockEvents接口是源接口,控件将用这个接口发送通知事件,它不是控件本身实现的接口,这个接口是通过容器来实现的

如果要将自定义的控件属性保存下来,需要在

void CClockCtrl::DoPropExchange(CPropExchange* pPX)加入如下代码:

PX_Short(pPX,"Interval",m_interval,1000);

之后再在程序中修改代码:

PX_Short(pPX,"Interval",m_interval,1000);

如果想使自定义控件属性实时地显示在容器属性列表中,

在void CClockCtrl::OnIntervalChanged() 中加入如下代码:

BoundPropertyChanged(0x1);   //调度代码为1

如果希望用户在设计模式时时钟控件停止运行,而在用户模式下运行,可以

在void CClockCtrl::OnTimer(UINT nIDEvent)下修改代码如下:

if(AmbientUserMode())   //查询环境属性

InvalidateControl();

第18章 Active控件的更多相关文章

  1. ASP.NET自定义控件组件开发 第五章 模板控件开发

    原文:ASP.NET自定义控件组件开发 第五章 模板控件开发 第五章 模板控件开发 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接 ...

  2. ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl

    原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 第四章 组合控件开发CompositeControl 大家好,今天我们来实现一个自定义的控件,之前我们已经 ...

  3. ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡

    原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡 CompositeControl  后篇 --事件冒泡 系列文章链接: ASP.NET ...

  4. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...

  5. IE8下调用Active控件

    之前在IE6下运行正常的Active控件,浏览器升级到IE8后全部失效,并呈浏览器崩溃状. 网上搜了一圈得到如下解决方法: 1.设置信任站点 2.还需要在IE浏览器菜单 “工具>Internet ...

  6. Excel中的表单控件和active控件

    EXCEL中有两种控件:表单控件和active控件 表单控件是excel5和excel95开始使用的,从excel97开始,active控件开始出现 关于表单控件和active控件的区别和使用范围,网 ...

  7. 关于Active控件的电子签名 转

    关于Active控件的电子签名 两种方案:一是自己制作证书,客户端安装证书后就可以识别该控件:二就是买官方的喽,在国内找verisign的代理,负责各种电子签名,任何一台浏览器都可以识别该证书.该公司 ...

  8. 《Programming WPF》翻译 第5章 7.控件模板

    原文:<Programming WPF>翻译 第5章 7.控件模板 如果仔细的看我们当前的TTT游戏,会发现Button对象并没有完全为我们工作.哪些TTT面板有内圆角? 图5-14 这里 ...

  9. ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...

随机推荐

  1. [Bzoj2286]消耗战(虚树+DP)

    Description 题目链接 Solution 在虚树上跑DP即可 Code #include <cstdio> #include <algorithm> #include ...

  2. python正则表达式01--贪心算法和非贪心算法findall()

    import re st = 'asdfasxxixxdafqewxxlovexxsadawexxyouxxas' # . #点匹配除换行符外的任意字符 a0 = re.findall('xx.',s ...

  3. talent-aio源码阅读小记(一)

    近来在oschina上看到一个很火的java 即时通讯项目talent-aio,恰巧想了解一下这方面的东西,就阅读了一下项目的源码,这里对自己阅读源码后的一些心得体会做一下备忘,也希望能够对其他项目中 ...

  4. 6,Flask 中内置的 Session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 1. Flask 中 session 是需要 secret_key 的 from ...

  5. 最短路径(Floyd法)

    最短路径法: 算法的主要思想是:单独一条边的路径也不一定是最佳路径. 从任意一条单边路径开始.所有两点之间的距离是边的权的和,(如果两点之间没有边相连, 则为无穷大). 对于每一对顶点 u 和 v,看 ...

  6. Python学习-KindEditor-富文本编辑框

    1.进入官网 2.下载 官网下载:http://kindeditor.net/down.php 本地下载:http://files.cnblogs.com/files/wupeiqi/kindedit ...

  7. Python 第一周编程作业

    一.  编程题 1.  结合turtle库使用手册,读懂下列代码,并在jupyter编译器中运行观察结果: 依次分析下代码: 第一行 通过保留字import引用了Python中用于绘制图形的turtl ...

  8. HDU 3775 Chain Code pick定理

    pick定理:一个计算点阵中顶点在格点上的多边形面积公式:S=a+b÷2-1,其中a表示多边形内部的点数,b表示多边形边界上的点数,s表示多边形的面积. 思路:http://blog.csdn.net ...

  9. [译]在python中如何有效的比较两个无序的列表是否包含完全同样的元素(不是set)?

    原文来源: https://stackoverflow.com/questions/7828867/how-to-efficiently-compare-two-unordered-lists-not ...

  10. 创建虚拟机流程nova

    这篇博文借鉴于http://www.cnblogs.com/yjbjingcha/p/6977741.html,感谢博友提供. 本文试图具体地描写叙述openstack创建虚拟机的完整过程.从用户发起 ...