VC使用ActiveX控件常见问题

2023-11-17

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VC使用ActiveX控件常见问题 的相关文章

  • setTimeout 的最小毫秒值是多少?

    我想把 var minValue 0 if typeof callback function setTimeout callback minValue 当我用 JavaScript 实现回调函数时 这段代码 但我发现现代浏览器和一些旧浏览器
  • React Native 后台计时器永远不会停止

    我正在构建一个应用程序 它有一个计时器 可以在计时器处于活动状态时请求地理位置 对于我正在使用的计时器反应本机背景计时器 https github com ocetnik react native background timer 这是可行
  • JSP/Servlet 中的倒计时器

    我正在使用 servlet jsp 开发在线考试 我需要在问题页面添加一个倒计时 hh mm ss 计时器 该计时器将结束考试并重定向到结果页面 除了计时器功能之外 我已经完成了所有其他功能 有人可以为此提供一些帮助吗 Thanks 您是否
  • iOS 中屏幕关闭/设备锁定时定时器不运行

    应用程序位于后台 在与 BLE 设备断开连接时会收到回调 之后应用程序必须等待一段时间 1 分钟 然后执行一些代码 如果屏幕打开 即使在后台 应用程序也会按预期运行 但是 如果屏幕关闭 则计时器将无法工作 并且应用程序不会按预期执行 这是
  • 为什么 Asp.net 计时器/更新面板会在 Chrome 中泄漏内存?可以修复/解决吗?

    我为我们公司建立了一套内部网站来管理我们的一些流程 我注意到这些页面存在大量内存泄漏 导致页面使用超过 150mb 的内存 这对于由单个表单和 GridView 组成的网页来说是荒谬的 该 GridView 在同一时间显示 7 10 行数据
  • 如何创建批处理文件计时器来全天执行/调用另一个批处理

    如何创建一个批处理文件计时器来在一天中执行 调用另一个批处理 也许在给定的时间运行但不在周末运行 必须在系统上运行也可以 cmd在xp server 2003上运行 对于脚本的计时器部分 我强烈建议使用 echo echo Waiting
  • 定时器可以提早吗?

    显然 System Threading Timer 回调应该会延迟一点 然而 可以提前调用吗 例如 如果您启动秒表并安排计时器在 1000 毫秒内运行回调 那么秒表是否有可能在回调中显示 999 或者我们可以指望它必须显示 1000 或更多
  • 树视图 - 突出显示多个项目

    在 Powerbuilder 中 这里有人知道我如何在树视图上突出显示多个项目吗 Selecteditem 函数没有这样做 我正在寻找 Selectedrow id 正在做的行为 Thanks 我自己没有尝试过 但有一个例子代码交换 htt
  • Linux下如何用C实现定时器的回调函数

    我已经在许多论坛上搜索了几天可能的解决方案 但没有运气 我在这里发布我的问题 非常感谢您的回复 主意 使用脚本控制灯光 Linux下C语言 应用场景 我有三盏灯 红 蓝 绿 脚本有控制它们的时间表 例如 从现在起10秒后 亮红灯2秒 从现在
  • 部署Java EE应用程序后执行任务

    我有一个 Java EE 应用程序 它应该在部署后启动与外部系统的同步过程 我怎样才能实现这个要求呢 下面列出了在 JavaEE 应用程序中获取生命周期回调的几种流行方法 创建 javax servlet ServletContextLis
  • Silverlight 中的计时器

    除了System Threading Timer对象之外 还有其他可以在Silverlight中使用的Timer对象吗 查看 DispatcherTimer http msdn microsoft com en us library sys
  • Clock_nanosleep() 尚不支持 CLOCK_MONOTONIC_RAW。这该如何处理呢?

    现在clock nanosleepDebian Jessie 上的 CLOCK MONOTONIC RAW 返回 EOPNOTSUPP 如何解决该问题并补偿可能应用于计时器循环中的 CLOCK MONOTONIC 的 NTP 调整 Is c
  • 如何清除ID未知的Interval?

    假设有人 邪恶 给我们设置了一个计时器setInterval 但我们不知道它的 ID 我们没有 setInterval 返回的对象的引用 也没有它的值 function setInterval function console log pw
  • Android:即使调用了cancel(),CountDownTimer的finish()也会被调用

    我这样使用倒数计时器 new CountDownTimer 15000 15 public void onTick long millisUntilFinished long seconds millisUntilFinished 1000
  • WPF C# - 计时器倒计时

    如何在用 WPF C 编写的代码中实现以下内容 我有一个 ElementFlow 控件 在其中实现了 SelectionChanged 事件 该事件 根据定义 在控件的项目选择发生更改时触发特定事件 我想要它做的是 启动计时器 如果计时器达
  • 一段时间后 NSTimer 停止在后台触发

    嘿 我正在开发一个应用程序 其中我必须每 30 秒调用一次 API 所以我为它创建了 NSTimer 但是当我的应用程序进入后台时 计时器会在 3 4 分钟后停止触发 所以它只能在后台运行 3 4 分钟 但之后就不再运行了 我如何修改我的代
  • Python sched.scheduler 超过最大递归深度

    我最近开始学习 Python 我正在制作的简单应用程序的一部分包括一个在其自己的线程中运行的带有 hh mm ss 显示的计时器 环顾网络 我发现了两种实现此目的的方法 使用 sched scheduler 使用threading Time
  • 计时器、事件和垃圾收集:我错过了什么吗?

    考虑以下代码 class TestTimerGC Form public TestTimerGC Button btnGC new Button btnGC Text GC btnGC Click sender e gt GC Collec
  • Android 计时器/计时器任务导致我的应用程序崩溃?

    只是在我的 mainActivity 的 onCreate 中测试一个简单的代码块 Timer timer2 new Timer TimerTask testing new TimerTask public void run Toast m
  • Android:如何在触摸事件中手动实现长按?

    简短版本 我想要一种方法来在 onTouchEvent 上启动基于时间的计数器 并测试在响应之前是否已经过了一定的时间 作为手动 LongTouch 检测 解释 我有一个自定义 imageView 可以通过两根手指滑动滑入 滑出屏幕 我想向

随机推荐

  • 深度学习中的优化算法之RMSProp

    之前在https blog csdn net fengbingchun article details 124766283 中介绍过深度学习中的优化算法AdaGrad 这里介绍下深度学习的另一种优化算法RMSProp RMSProp全称为R
  • 【从0学习Solidity】2. 值类型详解

    Solidity极简入门 2 值类型 博主简介 不写代码没饭吃 一名全栈领域的创作者 专注于研究互联网产品的解决方案和技术 熟悉云原生 微服务架构 分享一些项目实战经验以及前沿技术的见解 关注我们的主页 探索全栈开发 期待与您一起在移动开发
  • el-date-picker默认展示最近七天以及设置可选日期选择最大跨度

    el date picker组件内容
  • uniapp 自定义手机顶部状态栏不生效问题

    想要的效果想淘宝一样 底色覆盖到手机顶部 找了两天都没找到原因 过程很艰苦 直接上结果吧 项目是后来接手的 最终原因出在这 immersed false gt 设置为 true 就可以了 沉浸式样式
  • Linux 内核开发学习

    Linux 内核 Linux 内核官网 传送门 Linux 内核源码下载 传送门 1 内核空间 现在来说一下内核空间以及用户空间 这是学习linux内核最基本的两个概念了 如果连这都不懂 那就好好学吧 我们先从这张图入手 32位操作系统的最
  • 华为OD机试 - 增强的strstr(Python)

    题目描述 C 语言有一个库函数 char strstr const char haystack const char needle 实现在字符串 haystack 中查找第一次出现字符串 needle 的位置 如果未找到则返回 null 现
  • 锐星服务器怎么上传文件,协议转换器仪表远程配置方法专利_专利申请于2019-06-06_专利查询 - 天眼查...

    1 一种协议转换器仪表远程配置方法 其特征在于 包括以下步骤 步骤1 在平台端开发一个基于页面配置的配置程序 为指定的CAN仪表协议提供配置工具 输出配置文件 该配置文件是由版本信息 报文CAN ID配置语句 车载机使用数据项ID配置语句
  • 【干货】--手把手教你完成文本情感分类

    作者 刘顺祥 个人微信公众号 每天进步一点点2015 前言 2017年12月9日 参加了天善组织的线下沙龙活动 在沙龙中自己分享了如何借助于R语言完成情感分析的案例 考虑的其他网友没能够参与到活动现场 这里通过微信公众号作一个简单的分享 在
  • 【Angular中的HTTP请求】- JSONP 详解

    JSONP JSON with Padding 是JSON的一种 使用模式 可用于解决主流浏览器的跨域数据访问的问题 基于XMLHttpRequest的数据请求会受到同源策略限制 而 JSONP 以
  • 为什么离不开 Stackoverflow

    作为一名程序员 如果没有听过 Stackoverflow 那么你最好去面壁思过一下 程序员最需要阅读的一本编程书籍 其实编程书留下这本就够了 那些还没有读过这本书的程序员 是时候买一本了 如果还在犹豫 那么先看下这篇文章 看看为什么离不开
  • linux创建链接命令

    1 软链接 符号链接 1 软链接文件有类似于Windows的快捷方式 2 在符号连接中 文件实际上是一个文本文件 其中包含的有另一文件的位置信息 3 它只会在你选定的位置上生成一个文件的镜像 不会占用磁盘空间 linux创建链接软命令 具体
  • C语言调用C++函数

    前阵子被问及一个在C中如何调用C 函数的问题 当时简单回答是将函数用extern C 声明 当被问及如何将类内成员函数声明时 一时语塞 后来网上查了下 网上有一翻译C 之父的文章可以作为解答 遂拿来Mark一下 将 C 函数声明为 exte
  • JS 5种遍历对象的方式

    From https blog csdn net qq 53225741 article details 127073295 我根据阮老师的 ES6标准入门 学习并总结了七种遍历对象的方法 我会将分别介绍这七种方法并进行详细的区分 并将从属
  • Linux Ubuntu 能PING IP但不能PING主机域名的解决方法

    vi etc nsswitch conf hosts files dns networks files 改成 hosts files dns wins networks files 如果不一样的话 就在hosts 原来那行后面加个wins
  • Vue2转Vue3快速上手第一篇(共两篇)

    Vue3 v2 v3的学习成本不高 只要有v2基础 基本可以上手vue3 一 setup语法 setup中不能访问v2的配置比如data methods等 二 ref响应数据 使用ref可以创建一个对象 可以是基本类型 也可以是对象 例如
  • SpringBoot获取resources 目录下的文件的方式

    SpringBoot获取resources 目录下的文件的方式在Spring Boot项目中 读取resources目录下文件的方式是非常常见的操作 为了确保项目的稳定性和可靠性 我们需要采取一种高效的方法来获取这些文件 因此 在本文中 我
  • overloading与overriding的区别

    1 overloading 重载 1 方法重载是让类以一种统一的方式处理不同类型数据的手段 多个同名函数同时存在 具有不同参数个数 类型 重载是一个类中多态性的表现 2 java方法重载就是在同一个类中创建多个具有相同的方法名 但是参数类型
  • MAC M1安装VMware 安装windows11

    目录 前言 一 安装包列表 二 VMware安装Windows11过程 总结 前言 最近想着给自己的mac安装windows虚拟机 因为mac是m1芯片的 所以也是从网上找了很多资料 用PD安装了Windows11 在找资料的时候发现VM也
  • Hbuild X 下载以及插件安装

    1 下载 下载地址 https www dcloud io 2 进入Hbuilder 官方网站 3 下载HBuilder 点击下载按钮 Download for Windows 点击后会直接下载 也可以鼠标移动到 more 选择对应的版本点
  • VC使用ActiveX控件常见问题

    转自 http lingchuangsong blog 163 com blog static 126932322008631104133309 一方面 它表示将你联系到Microsoft Internet和业界的新技术的小型快速的可重用组