当前位置: 首页 > 编程日记 > 正文

VC使用ActiveX控件常见问题

转自:http://lingchuangsong.blog.163.com/blog/static/126932322008631104133309/

一方面,它表示将你联系到Microsoft、Internet和业界的新技术的小型快速的可重用组件。它与开发语言无关,任何支持 ActiveX控件的软件开发平台(如VB、VC++、Access、VFP、Delphi、PowerBuilder等)上,都可以使用ActiveX控件,程序员可以像使用Windows标准控件一样使用不同厂商开发的ActiveX控件。这样就实现了软件开发的工业化,大大地提高了软件的生产效率。

另一方面,它代表Internet与应用程序的一种集成策略。用户可以从Internet上下载ActiveX控件,也可以通过网络在本地机上调用远程机上的ActiveX控件,还可以将ActiveX控件加入到Internet主页上。

既然ActiveX控件对程序员是如此地重要,那么如何用好ActiveX控件也就成为软件开发者所关心的问题。本文以VC++5.0为开发工具,以一个项目名为Test的应用程序为例,就笔者在控件使用中遇到的一些问题加以讨论。

要想在应用程序中使用ActiveX控件,必须使你的应用程序成为ActiveX控件包容器。ActiveX 控件包容器就是完全支持ActiveX控件,并能把控件组合进自己的窗口或对话框的父应用程序。利用MFC的AppWizard,你可以很方便地创建你的包容器程序。事实上,在用AppWizard创建新的应用程序时,你的应用程序就被缺省设置为控件包容器,即在第3步选中支持ActiveX Controls的复选框。如果你在创建过程中没有选择这项技术支持,以后也可以手动地加入这项支持。

步骤如下:

1. 在项目的应用类的.cpp文件(本例中为test.cpp)的Initinstance函数中加入对函数AfxEnableControlContainer()的调用,如下所示:

BOOL CTestApp::InitInstance()

{

AfxEnableControlContainer();

...

}

  在使用一个已注册的ActiveX控件之前,必须先用组件廊将该控件添加到应用程序中,步骤如下:

1.从Project菜单选择Add To Project下的Components and Controls。

2.在弹出的对话框中双击Registered ActiveX Control子目录,打开此目录。

3.选择你需要的控件,点击Insert按钮,弹出Confirm Classes对话框。

4.在列出的类名中选择需要的类(缺省为全选中,最好接受缺省设置),点击OK,关闭Confirm Classes对话框。

5.点击Close关闭组件廊,该控件的图标即加入到对话框编辑器的控件面板上。

这样,我们就可以在对话框中像使用Windows标准控件那样使用该控件了。但在某些应用中,你可能需要在非对话框容器(如应用程序的窗口)中嵌入ActiveX控件。这时没有对话框编辑器,我们应怎样在非对话框容器中使用ActiveX控件呢?

当组件廊将ActiveX控件添加到你的应用程序后,组件廊会创建一些包裹类(即在Confirm Classes对话框中列出的那些类)。其中有一个类的基类是CWnd,该类是控件的包裹类,它被用作控件与控件包容器之间的接口,有两个公有的Create成员函数:

virtual BOOL Create(LPCTSTR lpszClassName,

LPCTSTR lpszWindowName, DWORD dwStyle,

const RECT& rect, CWnd* pParentWnd, UINT nID,

CCreateContext* pContext = NULL)

和BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,

const RECT& rect, CWnd* pParentWnd, UINT nID,

CFile* pPersist = NULL, BOOL bStorage = FALSE,

BSTR bstrLicKey = NULL)

我们就可以使用该控件的包裹类的Create函数在非对话框容器中动态地创建此控件的实例。

步骤如下:(本例中欲加入的控件名为MSFlexGrid ,CMSFlexGrid是控件的包裹类,msflexgrid.h是包裹类的头文件)

1.在视类头文件(本例中为TestView.h)中的类定义前加上

#include “msflexgrid.h”

2. 在TestView.h中CTestView类定义的protected部分加上控件包裹类类型的成员变量声明:

class CTestView : public CView

{

...

protected:

CMSFlexGrid m_fgrid;

...

};

3. 用ClassWizard为类CTestView 添加消息WM_CREATE的处理函数CTestView::OnCreate,在此函数中,调用控件类CMSFlexGrid的Create函数:

int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

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

return -1;

// ****** Add your code below this line ********** //

m_fgrid.Create(NULL, WS_VISIBLE,

CRect(50,50,100,100), this, 0); //用this指针作为指向父窗口的指针    m_fgrid.SetCols(2);

m_fgrid.SetRows(10);

m_fgrid.SetTextMatrix(0,0,"序号");

m_fgrid.SetTextMatrix(0,1,"姓名");

// ****** Add your code above this line ********** //

return 0;

}

4.重新链接工程,运行。可以看到当应用程序的视窗生成时,控件也动态地生成了。

5.如果你以后还想改变控件的位置和大小,可以继承CWnd::MoveWindow()函数。例如,若想使控件充满整个窗口,并在父窗口移动和缩放时也随之移动和缩放,可以添加消息WM_SIZE的处理函数OnSize,并加入如下代码:

void CTestView::OnSize(UINT nType, int cx, int cy)

{

CView::OnSize(nType, cx, cy);

// TODO: Add your message handler code here

m_fgrid.MoveWindow(0,0,cx,cy);

}

  通常情况下,我们可以用两种方法来存取对话框中的控件:1、将控件与对话框的成员变量相关联,通过对话框数据交换DDX来实现控件和对应的成员变量之间的数据交换(详情请参阅VC联机帮助ActiveX Control Containers: Connecting an ActiveX Control to a Member Variable);2、调用函数CWnd::GetDlgItem来取得指向控件的指针。

有些ActiveX控件没有用户界面,在运行时不可见。如果你在对话框中加入了运行时不可见的ActiveX控件,并想用CWnd::GetDlgItem来存取此控件,此控件将不能正常工作。要得到代表此控件的对象指针,可采取以下两种方法之一:

1. 在ClassWizard的成员变量标签中,选择此控件的ID,点击Add Variable,然后输入一个成员变量名,在Category中选择”Control”,在Variable type中选择控件类。

2. 声明一个此控件类型的局部变量,并将它作为一个对话框项。加入类似如下所列的代码(其中CmyCtrl是控件类,IDMYCTRL1是控件ID):

CMyCtrl myCtrl;

myCtrl.SubclassDlgItem(IDC_MYCTRL1, this);

// ... 使用控件myCtrl ...

myCtrl.UnsubclassWindow();

下面举一个例子加以说明。本例将在对话框中加入一个运行时不可见的计时控件Timer Object。该控件在一个的预定的时间间隔过去之后引发 Timer 事件,该时间间隔储存于该控件的 Interval 属性中,它以千分之一秒为单位指定时间的长度。本例用一个成员变量m_num来计数,每隔Interval时间递增1,当m_num计到10时,重置为0,并将时间间隔m_Interval增加200毫秒,并分别在两个静态框中显示当前的m_num和m_Interval。

步骤如下:

1.用组件廊将Timer控件加入到项目Test中。

2.在项目中插入一个新的对话框,类名为CTestDlg。

3.在对话框模板中加入控件Timer Object(包裹类为CIeTimer),如图2的右下角。打开属性对话框,设置ID为IDC_TIMER1。再切换至All属性页,设置Interval为200。

4.在对话框模板中添加静态控件,Caption为“The current interval is:”。

5.添加一个不带Caption的静态控件,打开属性对话框,设置ID为IDC_STATIC1。再切换至Extended Styles属性页,选中Static edge复选框。

6.按下Ctrl键的同时双击静态控件IDC_STATIC1,弹出Add Member Variable对话框,第一项中填写变量名m_text1,Category项中选择Control,Variable type项中选择CStatic。

7.添加静态控件“The current number is:”。

8.重复步骤5到步骤6,添加一个不带Caption的静态控件(ID为IDC_STATIC2),变量名为m_text2。

9.运行ClassWizard并选择Message Map属性页,在Class name 中选择CTestDlg,Object IDs中选择IDC_TIMER1,在Messages中选择Timer,点击Add Function…按钮,加入OnTimerTimer1()处理函数。

若采用第一种方法,则按前面所述方法用ClassWizard给此控件类添加一个成员变量m_timer,并在OnTimerTimer1函数中添加如下代码:

void CTestDlg::OnTimerTimer1()

{

// TODO: Add your control notification handler code here

char buf[10];

m_num++;

if(m_num>=10)

{

m_num=0;

m_interval+=200;

m_timer.SetInterval(m_interval);

}

_itoa(m_interval,buf,10);

m_text1.SetWindowText (buf);

_itoa(m_num,buf,10);

m_text2.SetWindowText (buf);

}

若采用第二种方法,不需要添加此控件类的成员变量,只需将加灰显示的语句用下列语句代替即可:

CIeTimer m_timer;

m_timer.SubclassDlgItem(IDC_TIMER1,this);

m_timer.SetInterval(m_interval);

m_timer.UnsubclassWindow();

运行之后可以看到计数的步调越来越慢了(时间间隔越来越大了)

ActiveX控件大大地简化了开发者的工作,灵活地使用控件能使开发者高效地开发出各种软件。以上是笔者在使用控件的过程中总结出的一些实践经验,希望对大家有所帮助。

相关文章:

你绝没用过的一款高级空间可视化工具

作者 | Shan He转载自高级农民工(ID: Mocun6)说起 Python 中的可视化,我们一般用的最多的是 Matplotlib,绘制一般的图效果都很好。有时候也会用风格比较好看的 Pyecharts 库,尤其是在展示空间地图上的数据时。不过它的…

揭秘vue——vue-cli3全面配置

★ vue-cli3 全面配置 ★ Nuxt.js 全面配置 创建项目 配置环境变量 通过在package.json里的scripts配置项中添加--mode xxx来选择不同环境 在项目根目录中新建.env, .env.production, .env.analyz等文件 只有以 VUE_APP_ 开头的变量会被 webpack.DefinePlugin 静态嵌入到客户端…

周礼栋:现在是计算机系统和网络研究“最好的时代”

编者按:随时随地使用各种系统和工具,对现代人来说早已是司空见惯的事,但这一切完美工作的技术和服务并不是凭空出现的。正是因为微软亚洲研究院副院长周礼栋博士和他带领的团队这样从事系统和网络研究工作的研发人员在幕后不断的努力和创新&a…

ChaLearn Gesture Challenge_2:examples体验

前言: 在上一篇博文ChaLearn Gesture Challenge_1:CGD数据库简单介绍中已经简单介绍过CGD2011数据库,了解到该数据库可以作为公开的数据库来测试在深度信息和RGB信息上的手势识别。当然了,也可以通过参加这个挑战赛来对比自己的手…

vs2008 外部调用ActiveX控件接口方法

转自:http://topic.csdn.net/u/20090605/16/018e26e9-06e2-4e0d-8099-bc8eb326afde.html sndaxdrs: 初学activeX ,我写的一个 activeX控件测试程序。 分别调用两个 自定义方法, 分别出现 “找不到成员”,和“非选择性的参数”的提…

设计模式之禅笔记

2019独角兽企业重金招聘Python工程师标准>>> 1.设计原则 1)单一职责原则 There should never be more than one reason for a class to change (就一个类而言,应该只有一个引起它变化的原因) 用于控制类的粒度大小,防止类过于复杂…

vs2008部署问题

转自:http://tangxingqt.blog.163.com/blog/static/2771087220098214755269/ 参考资料 1、VS2005解决"应用程序配置不正确,程序无法启动"问题 2、VS2005安装文件 "由于应用程序配置不正确,应用程序未能启动" 3、Micro…

expdp数据泵导出操作

数据泵需要在本地执行,不可以远程登录操作。 数据泵需要建立目录directory --sys下 create directory su as d:\xs 目录的数据字典是dba_directories SYSncbeta>select owner,directory_name,directory_path from dba_directories; 要求导出scott用户下的emp表…

slf4j 日志监控

问题描述 监控系统 新系统起步,旨在监控原有系统的各种问题。主要的一部分,就是监视原有系统的日志。 日志,是Java企业级应用开发必不可少的一部分,市场上有诸多日志框架。我们选用slf4j。 日志有以下级别: TRACE, DEB…

阿里90后科学家研发,达摩院开源新一代AI算法模型

整理 | 一一出品 | AI科技大本营(ID:rgznai100)AI科技大本营7月5日消息,阿里达摩院宣布开源新一代人机对话模型ESIM。该算法模型提出两年多,已被200多篇论文引用,更曾在国际顶级对话系统评测大赛(DSTC7&…

在vs2008中配置OpenCV2.2

1、下载OpenCV2.2:http://www.opencv.org.cn/index.php/Download 2、下载后解压缩OpenCV-2.2.0-win.zip; 3、下载CMake:http://www.cmake.org/cmake/resources/software.html 4、安装CMake; 5、运行cmake-gui,在wh…

开发者,什么是你真正关心的问题?| AI ProCon 2019

2018 年,上千名开发者与上百名技术专家齐聚一堂,在 CSDN 2018 AI开发者大会上以“AI技术与应用”为核心,深度聚焦人工智能的技术创新与行业应用,真正做到了“只讲技术,拒绝空谈”。今年,在产业智能化的浪潮…

C语言程序的结构

1.一个程序由一个或多个源程序文件组成。 a.预处理指令 b.全局声明 c.函数定义 2.函数是C程序的主要组成部分。 3.一个函数包括两个部分。 a.函数首部 int 函数类型 max 函数名 (int 函数参数类型 x, 函数参数名 int 函数参数类型 y…

flask 核心 之 应用上下文 及 请求上下文

Werkzeugs 是 Flask 的底层WSGI库。什么是WSGI? 一段简单的app: def dispath_request(self, request):return Response(Hello World!)def wsgi_app(self, environ, start_response):request Request(environ)response self.dispath_request(request)re…

vs2008中常见错误解决方法汇总

1、error C2859 vc90.idb is not the idb file that was used when this precompiled header was created。 解决方法:选中工程-->点击右键属性-->Configuration Properties-->C/C-->Output Files-->Program Database File Name中的$(IntDir)/vc90.p…

加速AI应用落地,英特尔AI 2.0的进阶之道

人工智能模型的复杂度不断增加,对内存的需求也越来越大。深度学习的进一步发展需要解决内存限制问题,而当前的解决方案无法利用所有可用计算,业内人士逐渐意识到需要专用芯片来支持深度学习训练和推理。英特尔则在人工智能方面提供优越的硬件…

MySQL基础之 恢复数据和数据库迁移

1、mysql命令或者source命令恢复数据 这两个命令在进行恢复数据的时候要检查是否创建数据库。如果数据库不存在,则恢复失败。 数据库迁移 1、相同版本的mysql数据库之间的迁移。 mysqldump -h host1 -uroot -ppwd --all-databases | mysql -h host2 -uroot -ppw…

.Net 文件流 System.IO之Stream

转自 :http://www.cnblogs.com/yukaizhao/archive/2011/07/28/stream.html Stream在msdn的定义:提供字节序列的一般性视图(provides a generic view of a sequence of bytes)。这个解释太抽象了,不容易理解&#xff1b…

Hinton等人最新研究:大幅提升模型准确率,标签平滑技术到底怎么用?

作者 | Rafael Mller , Simon Kornblith, Geoffrey Hinton译者 | Rachel责编 | Jane出品 | AI科技大本营(ID: rgznai100)【导读】损失函数对神经网络的训练有显著影响,也有很多学者人一直在探讨并寻找可以和损失函数一样使模型效果更好的函数…

WaitForSingleObject和WaitForMultipleObjects用法

转自:http://www.360doc.com/content/10/0512/09/1072296_27178529.shtml 等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止。这些等待函数中最常用的是WaitForSingleObject: DWORD WaitForSingleObject(HANDLE hObject, DW…

【面试必问】支撑百万并发的IO多路复用技术你了解吗?

多路复用其实并不是什么新技术,它的作用是在一个通讯连接的基础上可以同时进行多个请求响应处理。对于网络通讯来其实不存在这一说法,因为网络层面只负责数据传输;由于上层应用协议的制订问题,导致了很多传统服务并不能支持多路复…

DllMain already defined in dllmain.obj错误

错误 uafxcw.lib(dllmodul.obj) : error LNK2005: DllMain already defined in dllmain.obj 修改: 去掉宏定义 _USRDLL 转载于:https://blog.51cto.com/co63oc/1122378

典型的数字水印软件

转自:http://blog.csdn.net/pastora/archive/2005/04/15/348413.aspx ---- 目前,数字水印软件既有商品化产品,也有供研究用的免费软件。 商品化软件 ----提供商品化数字水印软件的公司主要有以下一些: ----1.Digimar…

AI、5G、小程序、AIoT纷纷迎来高峰,下一步开发者们要怎么办?

2018 年,上千名开发者与上百名技术专家齐聚一堂,在 CSDN 2018 AI开发者大会上以“AI技术与应用”为核心,深度聚焦人工智能的技术创新与行业应用,真正做到了“只讲技术,拒绝空谈”。今年,在产业智能化的浪潮…

linux第四课

一、配置软件仓库1.yum简介基于rpm软件包的安装部署机制自动解决软件包的依赖关系需要先配置软件仓库2.配置本地的软件仓库a.放入centos7.iso镜像文件到光驱中,确保电源开启b.命令操作# umount /dev/cdrom# ls /mnt# mount /dev/cdrom /mnt# ls /mnt# mkdir -p /rep…

图像处理和图像识别中常用的CxImage函数

1、Load:reads from disk the image in a specific format; 2、Save:saves to disk the image in a specific format; 3、Filter:2D linear filter(图像锐化,可提高图像清晰度); 4、Copy&…

大战三回合:XGBoost、LightGBM和Catboost一决高低 | 程序员硬核算法评测

作者 | LAVANYA译者 | 陆离责编 | Jane出品 | AI科技大本营(ID: rgznai100)【导读】XGBoost、LightGBM 和 Catboost 是三个基于 GBDT(Gradient Boosting Decision Tree)代表性的算法实现,今天,我们将在三轮…

云计算之Docker介绍

1. 百科简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙…

还在纠结垃圾分类问题?带你用Python感受ImageNet冠军模型SENet的强大

作者 | beyondma转载自CSDN博客本月1日起,上海正式开始了“史上最严“垃圾分类的规定,扔错垃圾最高可罚200元。全国其它46个城市也要陆续步入垃圾分类新时代。各种被垃圾分类逼疯的段子在社交媒体上层出不穷。其实从人工智能的角度看垃圾分类就是图像处理…

软件开发流程包含哪些内容

2019独角兽企业重金招聘Python工程师标准>>> 能否开发出一个好的软件,关键是看软件开发前期所做的工作,重点是这个软件有没有一个好的 软件开发流程,因为一个好的软件开发流程关系到到这个软件的成败和最后能达到一个什么的效果&a…