第18章 Active控件
转自: 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控件的更多相关文章
- ASP.NET自定义控件组件开发 第五章 模板控件开发
原文:ASP.NET自定义控件组件开发 第五章 模板控件开发 第五章 模板控件开发 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接 ...
- ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl
原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 第四章 组合控件开发CompositeControl 大家好,今天我们来实现一个自定义的控件,之前我们已经 ...
- ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡
原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡 CompositeControl 后篇 --事件冒泡 系列文章链接: ASP.NET ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...
- IE8下调用Active控件
之前在IE6下运行正常的Active控件,浏览器升级到IE8后全部失效,并呈浏览器崩溃状. 网上搜了一圈得到如下解决方法: 1.设置信任站点 2.还需要在IE浏览器菜单 “工具>Internet ...
- Excel中的表单控件和active控件
EXCEL中有两种控件:表单控件和active控件 表单控件是excel5和excel95开始使用的,从excel97开始,active控件开始出现 关于表单控件和active控件的区别和使用范围,网 ...
- 关于Active控件的电子签名 转
关于Active控件的电子签名 两种方案:一是自己制作证书,客户端安装证书后就可以识别该控件:二就是买官方的喽,在国内找verisign的代理,负责各种电子签名,任何一台浏览器都可以识别该证书.该公司 ...
- 《Programming WPF》翻译 第5章 7.控件模板
原文:<Programming WPF>翻译 第5章 7.控件模板 如果仔细的看我们当前的TTT游戏,会发现Button对象并没有完全为我们工作.哪些TTT面板有内圆角? 图5-14 这里 ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...
随机推荐
- poj1182食物链
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- Poweroj:来自学长的善意:ZQ的杀龙之旅(状压BFS)
传送门:https://www.oj.swust.edu.cn/problem/show/2794 来自学长的善意:ZQ的杀龙之旅 Time Limit: 15000 MS Memory Limit: ...
- 机器学习笔记(一)—— 线性回归问题与Matlab求解
给你多组数据集,例如给你很多房子的面积.房子距离市中心的距离.房子的价格,然后再给你一组面积. 距离,让你预测房价.这类问题称为回归问题. 回归问题(Regression) 是给定多个自变量.一个因变 ...
- 通过aop添加日志管理
1.使用spring 的 aop 技术切到自定义注解上,所以先创建一个自定义注解类 import java.lang.annotation.*; @Target(ElementType.METHOD) ...
- Linux 安装github并配置ssh
首先,你得有个github帐号. 1.用apt-get install git的方式安装git test@er:/$ sudo add-apt-repository ppa:git-core/ppa ...
- android onLayout死循环
有时候,开发代码的时候,真的是因为你的无知,就导致了程序性能低下. 比如: @Override protected void onLayout(boolean changed, int l, int ...
- NetCore log4net 集成以及配置日志信息不重复显示或者记录
NetCore log4net 集成,这是一个很常见而且网上大批大批的博文了,我写这个博文主要是为了记录我在使用过程中的一点小收获,以前在使用的过程中一直没有注意但是其实网上说的不清不楚的问题. 官方 ...
- loj2100 「TJOI2015」线性代数
先推公式,推出个这,然后因为是 \(0/1\) 矩阵,选一个有损耗,两个一组有加成,就想到了最大权闭合子图,(飞行计划问题) #include <iostream> #include &l ...
- 《Cracking the Coding Interview》——第2章:链表——题目1
2014-03-18 02:16 题目:给定一个未排序的单链表,去除其中的重复元素. 解法1:不花额外空间,使用O(n^2)的比较方法来找出重复元素. 代码: // 2.1 Remove duplic ...
- jmeter学习(二),如何安装jmeter?
官网地址:http://jmeter.apache.org/download_jmeter.cgi 如下图数字3.2表示的是版本号,jmeter是基于java的压力测试工具.所以运行环境一定要满足最低 ...