单文档视图结构ActiveX控件
ActiveX 控件概述
ActiveX 控件概述Visual FoxPro 包含一组 ActiveX 控件(.OCX 文件),您可以将这些控件添加到您的应用程序中,并一起发布。
使用 Visual FoxPro 的 OLE 容器控件,可以将 ActiveX 控件添加到应用程序的表单中。
如果您在安装 Visual FoxPro 时选择了“完全安装”选项,则默认安装 ActiveX 控件。
如果未选择此选项,您可以在任何时候运行Visual FoxPro 安装程序,并只安装 ActiveX 控件。
ActiveX 控件被安装在 Windows 95 的 SYSTEM 目录中,或者 Windows NT 的SYSTEM32 目录中。
附注:与 Visual FoxPro 一起发布的很多 ActiveX 控件是用来与其他应用程序一起使用的。
当把一个控件放在表单上,并按下 F1 键查看该控件的帮助信息时,所显示的帮助是原来应用程序的,而不是Visual FoxPro 的。
下列是与 Visual FoxPro 一起发布的 .OCX 文件,及其包含的ActiveX 控件。
文件 控件COMCTRL32.OCX ImageList 控件ListView 控件ProgressBar 控件Slider 控件StatusBar 控件TabStrip 控件Toolbar 控件TreeView控件COMDLG32.OCX Common Dialogs 控件DBLIST32.OCX MSDataCombo 控件MSDataList 控件FOXHWND.OCX Visual FoxPro HWND 控件FOXTLIB.OCX Visual FoxPro Foxtlib 控件GRID32.OCX Grid 控件MCI32.OCX Microsoft Multimedia 控件MSACAL70.OCX Calendar 控件MSCOMM32.OCX Microsoft Comm 控件MSMAPI32.OCX Microsoft MAPI Message 控件Microsoft MAPI Session 控件MSOUTL32.OCX Outline 控件PICCLP32.OCX PicClip 控件RICHTX32.OCX Rich Textbox 控件SINFO.OCX SysInfo 控件TABCTL32.OCX SSTab 控件THREED32.OCX Threed Checkbox 控件Threed Command Button 控件Threed Frame 控件Threed Group Push Button 控件Threed Option Button 控件Threed Panel 控件附注:如果安装了 Visual FoxPro 联机文档,则也安装了MediaView 1.41 ActiveX 控件 (MEDV141N.OCX)。
ExcelActiveX控件属性含义
Cycle(表单)
当用户离开结构或页面上的最后一个控件时要执行的操作(所有表单或当前表单)。
KeepScrollBarsVisible(表单)
在不需要时滚动条是否保持可见。
ScrollBars(表单)
控件是否具有垂直滚动条和/或水平滚动条。
ScrollHeight、ScrollWidth(表单)
Text(表单)
控件中的文本。
TextAlign(表单)
文本在控件中的对齐方式(左对齐、居中或右对齐)。
WordWrap(表单)
控件内容是否在行尾自动换行。
BorderStyle(表单)
边框的类型(无或单线)。
ForeColor(表单)
前景色。
Shadow (Excel)
控件是否有阴影。
SpecialEffect(表单)
边框的可视外观(平面、凸起、凹陷、蚀刻或凸块)。
键盘和鼠标
Accelerator(表单)
控件的快捷键。
MouseIcon(表单)
自定义鼠标图标。
Name(表单)
控件的名称。
Placement (Excel)
控件附加到其下方单元格的方式(自由浮动、移动但不调整大小,或者移动并调整大小)。
PrintObject (Excel)
控件是否可打印。
Visible(表单)控件源自可见还是隐藏。大小和位置AutoSize(表单)
控件的大小是否可以自动调整以显示所有内容。
通过移动滚动条可以查看的整个区域的高度或宽度(以磅为单位)。
ScrollLeft、ScrollTop(表单)
逻辑表单的左边缘或上边缘与结构的左边缘或上边缘之间的距离(以磅为单位)。
如何在Word文档中使用Active控件排版
如何在Word文档中使用Active控件排版
在用word输入文字中,有时需要使用Avtive控件来丰富word文档的排版效果。
这里可以用软件自带的Active控件。
以下是学习啦小编为您带来的关于Word文档使用Active控件排版,希望对您有所帮助。
Word文档使用Active控件排版
1、打开一个word的文件,选中一个单元格,然后鼠标左键单击菜单【开发工具】>>【Avtive控件】>>【控件列表】,如下图所示。
2、鼠标左键选择一个【Label控件】,在word中绘制出该控件,可拖动控件四周节点控制大小,也可移动位置,如下图所示。
3、鼠标左键选择一个【Image控件】,在word中绘制出该控件,可拖动控件四周节点控制大小,也可移动位置,如下图所示。
4、鼠标左键选择一个【Combo控件】,在word中绘制出该控件,可拖动控件四周节点控制大小,也可移动位置,如下图所示。
5、鼠标左键选择一个【Button控件】,在word中绘制出该控件,可拖动控件四周节点控制大小,也可移动位置,如下图所示。
6、鼠标左键选择一个【List控件】,在word中绘制出该控件,可拖动控件四周节点控制大小,也可移动位置,如下图所示。
猜你喜欢:
1.word怎么进行排版的两种方法
2.Word2007怎么使用书籍折页进行排版打印
3.word十大排版技巧
4.word必备的基本排版知识
5.Word中如何使用控件。
什么是Activex控件
什么是Activex控件什么是Activex控件?经常上网的伙伴们会发现在打开某些网页后,会出现Activex控件被阻止的提示,那么,Activex控件是什么?如何解决这一现象?对此,店铺就为大家介绍一下什么是Activex控件。
欢迎大家前来阅读!!Activex控件是什么ActiveX控件,简单的说,它就是IE浏览器的插件,例如IE的Flash播放器就是一个ActiveX控件。
ActiveX存在明显的安全问题,因为它其实也是一种程序,如果你安装了某个ActiveX控件,那这个控件就有权限在你电脑上做很多事情,例如偷偷的监控你的网页浏览记录,在后台安装恶意程序,时不时在你电脑上产生弹窗,甚至窃取你的帐号密码等,正因为这样,正因为这样,IE内核的浏览器有时候会提示你不要加载这些控件。
Activex控件被阻止怎么办第一步:打开浏览器,然后选择菜单栏上“工具”选项,选择“工具”选项之后,选择下拉菜单的“Internet选项”。
第二步:打开Internet选项之后,切换到安全选项卡,然后选择安全选项卡下的自定义级别。
第三步:单击自定义级别之后打开安全设置窗口,将重置为一栏的安全级别设置为安全级-中,然后勾选下载已签名的Activex控件一栏的启用,再勾选运行Activex控件和插件一栏的启用,把该控件和插件给启用上来,部分显示不安全的选项,可以勾选为提示,然后单击确定按钮。
第四步:设置完成之后单击确定按钮,关闭浏览器,然后重新启用浏览器,这样就不会再有提示了。
注意事项:如果把浏览器的安全级别设置为高,不管你是否勾选运行Activex控件,浏览器都会自动改其为禁用,所以需要将安全级设置为中。
以上就是Activex控件被阻止怎么办的解决办法。
总结以上就是店铺为大家带来的Activex控件被阻止现象的解决方法,希望可以帮助到大家。
什么是Activex控件将本文的Word文档下载到电脑,方便收藏和打印推荐度:点击下载文档文档为doc格式。
excel中activex 控件组合框控件的使用方法
excel中activex 控件组合框控件的使用方法在Excel 中,ActiveX 控件组合框(ComboBox)是一种常用的交互式工具,可用于创建下拉菜单或选择列表。
以下是ActiveX 控件组合框的基本使用方法:插入组合框:打开Excel 文档,切换到“开发者”选项卡(如果没有该选项卡,你需要启用它),然后选择“插入” -> “ActiveX 控件” -> “组合框”。
在工作表上绘制组合框。
设置属性:在设计模式下,右键单击组合框,选择“属性”以打开属性窗口。
在属性窗口中,你可以设置组合框的名称、字体、大小等属性。
添加选项:通过双击组合框,或者在设计模式下右键单击组合框选择“属性” -> “Items” 来添加选项。
在"Items" 属性框中,你可以输入组合框的各个选项,每个选项占一行。
编写VBA 代码:如果你想通过VBA 代码来动态控制组合框,可以在"开发者" 选项卡中选择"Visual Basic",然后编写相应的VBA 代码。
处理事件:组合框可以触发多个事件,比如Change、Click 等。
你可以通过VBA 代码处理这些事件。
在VBA 编辑器中,选择组合框,然后选择相应的事件,编写处理代码。
调整样式:你可以通过修改组合框的属性来调整其外观,比如设置背景颜色、字体颜色等。
运行模式:在设计模式下,你可以编辑和设置组合框的属性。
在运行模式下,你可以与组合框交互并查看效果。
删除组合框:如果不再需要组合框,可以在设计模式下右键单击组合框,选择“剪切”或“删除”来删除它。
通过这些步骤,你可以在Excel 中成功使用ActiveX 控件组合框,并实现相应的交互功能。
第八章 ActiveX控件简介
第八章 ActiveX控件简介 ActiveX控件简介
添加属性页” 图8-16 “添加属性页”对话框 添加属性页
介绍” 图8-17 “介绍”对话框 介绍
第八章 ActiveX控件简介 ActiveX控件简介
第八章 ActiveX控件简介 ActiveX控件简介
8.4 加载 加载ActiveX控件的方法 控件的方法
建立ActiveX控件的基本过程如下: 控件的基本过程如下: 建立 控件的基本过程如下 控件的功能。 (1)确定 )确定ActiveX控件的功能。 控件的功能 控件的外观。 (2)确定 )确定ActiveX控件的外观。 控件的外观 (3)确定控件应具有的属性、方法和事件。 )确定控件应具有的属性、方法和事件。 控件工程, (4)新建一个 )新建一个Visual Basic的ActiveX控件工程, 的 控件工程 设计出控件的外观。 设计出控件的外观。 • (5)编写代码。 )编写代码。 (6)建立一个测试工程,测试控件。 )建立一个测试工程,测试控件。 • (7)将控件编译成OCX文件。 )将控件编译成 文件。 文件 • • • • •
8.1 ActiveX控件的基本概述 控件的基本概述
ActiveX 控件是 控件是ActiveX新技术之一,是OLE的第 个 新技术之一, 的第3个 新技术之一 的第 版本,它充分利用OLE和ActiveX技术的自定义控件,是 技术的自定义控件, 版本,它充分利用 和 技术的自定义控件 基于与应用程序无关的思想而设计的。它对最初OLE控 基于与应用程序无关的思想而设计的。它对最初 控 件的最大扩展是增加了Internet功能,用户可以将 功能, 件的最大扩展是增加了 功能 用户可以将ActiveX 控件加入到Internet主页上 同时,由于引入了DCOM 主页上。 控件加入到Internet主页上。同时,由于引入了DCOM 分布式组件功能),使其成了分布式组件, ),使其成了分布式组件 (分布式组件功能),使其成了分布式组件,用户可以通 过网络在本机调用远程机器上的ActiveX控件。即ActiveX 控件。 过网络在本机调用远程机器上的 控件 控件合并了VBX(Visual Basic控件的一个初期版本,目 控件的一个初期版本, 控件合并了 ( 控件的一个初期版本 前已很少应用)技术和ActiveX标准。从本质上讲, 标准。 前已很少应用)技术和 标准 从本质上讲, ActiveX 控件是一个 控件是一个ActiveX服务器,它能提供所有的 服务器, 服务器 OLE功能和服务,可视化编辑、拖放和 功能和服务, 自动化。 功能和服务 可视化编辑、拖放和OLE自动化。 自动化 ActiveX 控件需要在系统注册表中进行注册。ActiveX 控 控件需要在系统注册表中进行注册。 件可以用许多语言来开发,包括Visual Basic、Visual C++、 件可以用许多语言来开发,包括 、 、 Delphi、Borland C ++ Builder等。 、 等
Excel中ActiveX控件的应用方法
Excel中ActiveX 控件的应用方法Excel在工作表或图表上可使用ActiveX控件,根据小编使用的体会,在工作上处理控件时,必须注意和了解如下事项:Excel中ActiveX 控件的应用方法(一)用Excel5.0/95工作簿文件格式保存Excel97工作簿时,将选择ActiveX控件信息。
当用户通过双击鼠标来编辑内嵌在其它应用程序文档中的Excel97工作簿时,该工作簿上的控件将不会正常工作。
如果用户是通过用右键单击工作簿,然后选中快捷菜单上的“打开”命令来编辑工作簿的话,工作簿上的控件就能正常工作了。
(二)当ActiveX控件处于激活状态时,将禁用某些MicrosoftExcelVisualBasic方法和属性。
例如,当某一控件激活时,就不能使用Sort方法,故下述按钮单击事件处理过程中的代码将失败(因为用户单击按钮后,该按钮就处于激活状态)。
PRivateSubCommandButton1 ClickRange(″a1:a10″) SortKey1:=Range(″a1″)EndSub解决办法是通过选激活工作表上其它元素的方法来绕过这种问题。
例如,可用下列代码对单元格区域排序:PrivateSubCommandButton1 ClickRange(″a1″) ActivateRange(″a1:a10″) SortKey1:=Range(″a1″)CommandButton1 ActivateEnd Sub(三)在MicrosoftExcel中,用OLEObjects集合中的OLEObject 对象代表ActiveX控件。
如果要用编程的方式向工作表添加ActiveX控件,可用OLEObjects集合的Add方法。
例如向第一张工作表添加命令按钮。
Worksheets(1) OLEObjects Add″Forms CommandButton 1″,_Left:=10,Top:=10,Height:=20,Width:=100因为ActiveX控件也可用OLEObjects集合中的OLEObject对象代表,所以也可用该集合中的对象来设置控件的属性。
excel表单控件和 ActiveX 控件概念
工作表中的表单、表单控件和ActiveX 控件概念是的,确实如此。
在Microsoft Excel 中,使用少量或者无需使用Microsoft Visual Basic for Applications (VBA) 代码即可创建出色的表单。
使用表单以及可以向其中添加的许多控件和对象,您可以显著地增强工作表中的数据项并改善工作表的显示方式。
∙什么是表单?∙Excel 表单的类型数据表单含有表单和ActiveX 控件的工作表表单控件ActiveX 控件绘图工具对象使用工作表表单中的控件和对象确定工作表中控件的类型VBA 用户表单什么是表单?无论是打印表单还是联机表单都是一种具有标准结构和格式的文档,这种文档可让用户更轻松地捕获、组织和编辑信息。
∙打印表单含有说明、格式、标签以及用于写入或键入数据的空格。
您可以使用Excel 和Excel 模板创建打印表单。
∙联机表单包含与打印表单相同的功能。
此外,联机表单还包含控件。
控件是用于显示数据或者更便于用户输入或编辑数据、执行操作或进行选择的对象。
通常,控件可使表单更便于使用。
例如,列表框、选项按钮和命令按钮都是常用控件。
通过运行Visual Basic for Applications (VBA) 代码,控件还可以运行指定的宏和响应事件,如鼠标点击。
您可以使用Excel 通过多种方式创建打印表单和联机表单。
Excel 表单的类型您可以在Excel 中创建多种类型的表单:数据表单、含有表单和ActiveX 控件的工作表以及VBA 用户表单。
可以单独使用每种类型的表单,也可以通过不同方式将它们结合在一起来创建适合您的解决方案。
数据表单数据表单为在无需水平滚动的情况下在单元格区域或表格中输入或显示一整行信息提供了一种便捷方式。
您可能会发现,当数据的列数超过可以在屏幕上查看的数据列数时,使用数据表单可以使数据输入变得更容易,而无需在列之间进行移动。
如果以标签的形式将列标题列出的文本框这一简单表单足以满足您的需求,而且您不需要使用复杂的或自定义的表单功能(例如列表框或调节钮),则可以使用数据表单。
WordVBA---ActiveX控件在Word文档中的使用方法
WordVBA---ActiveX控件在Word文档中的使用方法当您想要提供一种完善的方式让用户与宏直接进行交互、而不受对话框干扰的时候,可以向文档直接添加ActiveX控件,这如同可以向自定义对话框添加ActiveX控件一样。
使用以下过程可以将ActiveX控件添加到您的文档。
1、向文档中添加控件您可以向文档的图形层或文本图层添加ActiveX控件。
★向图形层添加控件:单击控件工具箱上的控件。
拖动控件的调整控点,直到控件的轮廓大小和形状符合要求。
★向文本层添加控件:请在按住SHIFT键的同时单击控件工具箱上的控件。
该控件将自动添加到文档中的插入点。
注释:将一个控件(或一组控件)从窗体拖回"控件工具箱",即可创建一个可重复使用的该控件的模板。
这是一个非常有用的功能,能为用户实现标准的应用程序界面。
2、设置控件属性在设计阶段(宏运行之前)可以设置一些ActiveX控件的属性。
在设计模式中,右键单击一个控件并单击右键菜单中的"属性"以显示"属性"窗口。
属性名称显示在窗口的左栏,而属性值显示在右栏。
可在属性名称的右边输入新值来设置该属性的值。
3、初始化控件属性您可以通过在宏中使用Visual Basic代码在运行时初始化ActiveX控件。
例如,您可在其中填充列表框中,设置文本值或设置选项按钮。
以下示例使用Visual Basic的AddItem方法将数据添至名为lstRegions的列表框,然后设置文本框的值并显示窗体。
Private Sub GetUserName()With UserForm1.lstRegions.AddItem"North".lstRegions.AddItem"South".lstRegions.AddItem"East".lstRegions.AddItem"West".txtSalesPersonID.Text="00000".Show'...End WithEnd Sub也可使用窗体的Visual Basic Initialize事件中的代码为窗体上的控件设置初始值。
Excel中的窗体控件和ActiveX控件
Excel中的窗体控件和ActiveX控件2009年1月21日评论发表评论Excel中有两种不同的控件。
一种是窗体工具条控件(Forms toolbar controls),通过点击菜单“视图”->“工具栏”,在弹出菜单上选择“窗体”,将出现“窗体”工具条控件窗口。
另外一种是ActiveX控件,通过点击菜单“视图”->“工具栏”,在弹出菜单上选择“控件工具箱”(也可以选择“Visual Basic”,然后再在工具栏上选择“控件工具箱”),将出现“控件工具箱”窗口。
窗口工具条控件是Excel5和Excel95留下来的东西(在Excel 97后的版本中,添加一个Dialog Sheet后,将可以看到这个窗体工具条窗口),从Excel 97开始,Dialog Sheet被UserForm代替,并且开始使用ActiveX控件。
从某些角度来讲,窗体控件甚至比ActiveX控件更有优势。
1. 如果你需要在Chart工作表中添加控件,只能使用窗体工具条控件。
2. 更加方便使用VBA代码创建窗体控件以及定义事件过程。
3. 窗体控件的事件过程可以放在标准模块,可以使用任何有效的VBA过程名称,可以在控件创建之前就创建事件过程。
4. 可以给多个控件赋于一个相同的过程。
5. 可以使用Application.Caller来获取窗体控件的名称。
窗体控件比ActiveX控件简单,基本上只有一个Click事件。
而ActiveX控件可以响应丰富的事件,ActiveX控件的事件只能放在控件所在的类模块(工作表模块)或窗体模块。
过程名称由控件名和事件名称组成。
如果你在控件不存在的时候就创建这个控件的事件过程,然后再在代码中引用这个控件,将会出现编译错误,所以必须使用代码创建事件过程。
在VBA中控制窗体控件的方法有点不同,可以使用对象名称,但这些对象名称在对象浏览器中被隐藏,这样输入代码时没有方法和属性提示(你可以在“对象浏览器”的“类”一栏中单击右键,然后选择“显示隐含成员”查看这些窗体控件)。
单文档视图结构ActiveX控件
单文档/视图结构的ActiveX控件单文档/视图模式是MFC编程里比较强大的一种编程模式,如果ActiveX控件能够用这种模式的话,将可以做出非常强大的Web在线应用。
下面我们就介绍一种把单文档/视图模式的程序改造成ActiveX控件的方法。
做起来很难,但是完成了会很有成就感,本方法来源于15Seconds。
在VC6.0和下都已证明可行。
我用这个方法做了一个Web上的在线服装设计软件,Client 端支持NT4.0,客户公司有上千台NT4.0。
据美国同事说在投标中击败了Altium公司(电路设计软件Protel的开发商)的方案,哈。
需要要两个文件:// ActivDoc.cpp : implementation file//#include "stdafx.h"#include "ActivDoc.h"CActiveXDocTemplate::CActiveXDocTemplate(CRuntimeClass* pDocClass,CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass): CSingleDocTemplate(IDR_NOTUSED, pDocClass, pFrameClass,pViewClass){ASSERT(pFrameClass);}CFrameWnd* CActiveXDocTemplate::CreateDocViewFrame(CWnd* pParen tWnd){CWaitCursor cursor;TRY{ASSERT(pParentWnd && IsWindow(*pParentWnd));ASSERT_KINDOF(CActiveXDocControl, pParentWnd);m_pParentWnd = pParentWnd;m_pFrameWnd = NULL;// OpenDocumentFile is a virtual method (implemented in// the CSingleDocTemplate base class) that creates// the document (either empty or loaded from the specified// file) and calls our CreateNewFrame function. Passing// NULL to the function creates a new document. Incidentally,// the view is created by the CFrameWnd's OnCreateClient()// method.if (!OpenDocumentFile(NULL))return NULL;// Since OpenDocumentFile sets m_pFrame, we can now use it.ASSERT(m_pFrameWnd);ASSERT_KINDOF(CFrameWnd, m_pFrameWnd);m_pFrameWnd->ShowWindow(SW_SHOWNORMAL);return m_pFrameWnd;}CATCH_ALL(e){AfxMessageBox("Read storyboard error.please retry!");//THROW_LAST();}END_CATCH_ALLreturn NULL;}CFrameWnd* CActiveXDocTemplate::CreateNewFrame(CDocument* pDoc,CFrameWnd* pOther){ASSERT(pOther == NULL);ASSERT(m_pFrameClass != NULL);if (pDoc != NULL)ASSERT_VALID(pDoc);// Create a frame wired to the specified documentCCreateContext context;context.m_pCurrentFrame = pOther;context.m_pCurrentDoc = pDoc;context.m_pNewViewClass = m_pViewClass;context.m_pNewDocTemplate = this;m_pFrameWnd = (CFrameWnd*)m_pFrameClass->CreateObject();if (m_pFrameWnd == NULL){TRACE1("Warning: Dynamic create of frame %hs failed. ",m_pFrameClass->m_lpszClassName);return NULL;}ASSERT_KINDOF(CFrameWnd, m_pFrameWnd);if (context.m_pNewViewClass == NULL)TRACE0("Warning: creating frame with no default view. ");// The frame is created as a menu-less child of the// CActiveXDocControl in which it will reside.ASSERT_KINDOF(CActiveXDocControl, m_pParentWnd);if (!m_pFrameWnd->Create(NULL, "", WS_CHILD|WS_VISIBLE,CFrameWnd::rectDefault, m_pParentWnd, NULL, 0, &context)){TRACE0("Warning: CDocTemplate couldn't create a frame. ");return NULL;}return m_pFrameWnd;}CDocument* CActiveXDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName, BOOL bVerifyExists){CWaitCursor cursor;SaveDocumentFile();m_docFile = lpszPathName;if (bVerifyExists){DWORD dwAttrib = GetFileAttributes(m_docFile);if (dwAttrib == 0xFFFFFFFF ||dwAttrib == FILE_ATTRIBUTE_DIRECTORY){lpszPathName = NULL;}}return CSingleDocTemplate::OpenDocumentFile(lpszPathName, TRUE);}void CActiveXDocTemplate::SaveDocumentFile(){if (m_pOnlyDoc != NULL){if (!m_docFile.IsEmpty())m_pOnlyDoc->OnSaveDocument(m_docFile);elsem_pOnlyDoc->SetModifiedFlag(FALSE);}}/////////////////////////////////////////////////////////////////////////////// CActiveXDocControlIMPLEMENT_DYNAMIC(CActiveXDocControl, COleControl)BEGIN_MESSAGE_MAP(CActiveXDocControl, COleControl)//{{AFX_MSG_MAP(CActiveXDocControl)ON_WM_CREATE()ON_WM_SIZE()ON_WM_TIMER()ON_WM_DESTROY()//}}AFX_MSG_MAPON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)END_MESSAGE_MAP()BEGIN_DISPATCH_MAP(CActiveXDocControl, COleControl)//{{AFX_DISPATCH_MAP(CActiveXDocControl)//}}AFX_DISPATCH_MAPEND_DISPATCH_MAP()BEGIN_EVENT_MAP(CActiveXDocControl, COleControl)//{{AFX_EVENT_MAP(COleFrameCtrl)//}}AFX_EVENT_MAPEND_EVENT_MAP()int CActiveXDocControl::m_bDocInitialized = FALSE;CActiveXDocControl::CActiveXDocControl(){CWaitCursor cursor;m_pDocTemplate = NULL;m_pFrameWnd = NULL;// Since we're in an OCX, CWinApp::InitApplication() is// not called by the framework. Unfortunately, that method// performs CDocManager initialization that is necessary// in order for our DocTemplate to clean up after itself.// We simulate the same initialization by calling the// following code the first time we create a control.if (!m_bDocInitialized){CDocManager docManager;docManager.AddDocTemplate(NULL);m_bDocInitialized = TRUE;}}CActiveXDocControl::~CActiveXDocControl(){// Note that the frame, the document, and the view are// all deleted automatically by the framework!KillTimer(m_Timer);delete m_pDocTemplate;m_bDocInitialized = FALSE;}void CActiveXDocControl::AddDocTemplate(CActiveXDocTemplate* pDocT emplate){// I've decided to call this function AddDocTemplate to// be consistent with naming of CWinApp::AddDocTemplate.// However, only one DocTemplate is allowed per control.CWaitCursor cursor;ASSERT(pDocTemplate);ASSERT(m_pDocTemplate == NULL);m_pDocTemplate = pDocTemplate;}int CActiveXDocControl::OnCreate(LPCREATESTRUCT lpCreateStruct) {CWaitCursor cursor;if (COleControl::OnCreate(lpCreateStruct) == -1)return -1;// The CActiveXDocTemplate object will create the// document, the view, and the frame inside the// control. The reason we need a handle to the frame// is so that we can resize it when the control is// resized.ASSERT(m_pDocTemplate); // Set in call to AddDocTemplatem_pFrameWnd = m_pDocTemplate->CreateDocViewFrame(this);ASSERT_KINDOF(CFrameWnd, m_pFrameWnd);// By default, we'll create the control with a border,// since it looks better for frames containing a toolbar.SetBorderStyle(TRUE);m_IsTimerEnd = "NO";m_Timer = SetTimer(WM_IDLEUPDATECMDUI, 300, NULL);return 0;}void CActiveXDocControl::OnSize(UINT nType, int cx, int cy){COleControl::OnSize(nType, cx, cy);// The CFrameWnd should always fill up the entire client// area of the control.if (m_pFrameWnd != NULL){ASSERT(IsWindow(*m_pFrameWnd));CRect area;GetClientRect(area);m_pFrameWnd->MoveWindow(area.left, area.top, area.right,area.bottom);}}void CActiveXDocControl::OnTimer(UINT nIDEvent){// Since we're in an OCX, we don't control the message loop,// so CWinThread::OnIdle is never called. That means we have// to periodically pump the ON_UPDATE_COMMAND_UI messages// by hand.SendMessageToDescendants(WM_IDLEUPDATECMDUI, TRUE);//COleControl::OnTimer(nIDEvent);/*if (m_IsTimerEnd=="NO") {m_IsTimerEnd = "YES";}*/}void CActiveXDocControl::OnDestroy(){AfxGetApp()->m_pMainWnd = NULL;m_pDocTemplate->SaveDocumentFile();COleControl::OnDestroy();}2. ActivDoc.hclass CActiveXDocTemplate : public CSingleDocTemplate{enum { IDR_NOTUSED = 0x7FFF };CWnd* m_pParentWnd;CFrameWnd* m_pFrameWnd;CString m_docFile;public:CActiveXDocTemplate(CRuntimeClass* pDocClass,CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass);CFrameWnd* CreateDocViewFrame(CWnd* pParentWnd);void SaveDocumentFile();virtual CFrameWnd* CreateNewFrame(CDocument* pDoc,CFrameWnd* pOther);virtual CDocument* OpenDocumentFile(LPCTSTR lpszPathName, BOOL bVerifyExists = TRUE);};/////////////////////////////////////////////////////////////////////////////class CActiveXDocControl : public COleControl{enum { WM_IDLEUPDATECMDUI = 0x0363 };CActiveXDocTemplate* m_pDocTemplate;UINT m_Timer;DECLARE_DYNAMIC(CActiveXDocControl)protected:void AddDocTemplate(CActiveXDocTemplate* pDocTemplate);CDocTemplate* GetDocTemplate() { return m_pDocTemplate; }CString m_IsTimerEnd;//{{AFX_MSG(CActiveXDocControl)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnSize(UINT nType, int cx, int cy);afx_msg void OnTimer(UINT nIDEvent);afx_msg void OnDestroy();//}}AFX_MSG//{{AFX_DISPATCH(CActiveXDocControl)//}}AFX_DISPATCH//{{AFX_EVENT(CActiveXDocControl)//}}AFX_EVENTDECLARE_MESSAGE_MAP()DECLARE_DISPATCH_MAP()DECLARE_EVENT_MAP()public:CActiveXDocControl();virtual ~CActiveXDocControl();CFrameWnd* m_pFrameWnd;static BOOL m_bDocInitialized;enum {//{{AFX_DISP_ID(CActiveXDocControl)//}}AFX_DISP_ID};};改造步骤:1.建立MFC ActiveX工程(例如:MyActiveX)2.用CActiveXDocControl替换COleControl3.把ActivDoc.h和ActivDoc.cpp加入工程中5.拷贝单文档视图的文件(框架文件(*frm.cpp,*frm.h),文档文件(*doc.cpp,*doc.h),视图文件(*view.cpp,*view.h),和其他.cpp和.h,注意,不包括App文件)到ActiveX工程。
第10章ActiveX 控件
Visual Basic的控件被分为两大类,分别是标准 控件和ActiveX控件.默认情况下,在Visual Basic工具箱内的控件都是标准控件.而后来通过 "部件"对话框添加进来的控件则都属于ActiveX 控件,例如前面所学到的工具栏控件,状态栏控 件,RichTextBox控件等等.本章主要介绍关于 ActiveX 控件的相关知识.
10.3.1 通过日历控件获得日期
(具体内容请参照本书)
10.3.2 日历控件独有的事件
Calendar控件有几个独有的事件,如NewYear, NewMonth等.NewYear事件当日历控件中的年份被 更改时触发;NewMonth事件当日历控件中的月份 被更改时触发.而更改日期时会先后触发两个事 件分别是BeforeUpdate和AfterUpdate.
10.4.3 使用【颜色】对话框
本例界面由两个对象组成,分别为窗体Form1和 CommonDialog控件cd1,
10.4.4 使用【字体】对话框
要显示字体对话框,首先应该设置Flag属性.
10.4.5 使用【打印】对话框
关于"打印"对话框的常用属性,(具体内容请 参照本书)
10.4.6 对单击"取消"按钮的处理
10.4.1 使用【打开】对话框
(具体内容请参照本书)
10.4.2 使用【保存】对话框
"保存"对话框和"打开"对话框实际上是一种 对话框,所以它们的属性设置和意义是一样的. 上一节,介绍了通过"属性页"对话框设置 CommonDialog控件属性的方法,下面介绍使用程 序设置这些属性的方法.(具体内容请参照本书)
activex控件祥解
ActiveX控件使用说明!小弟这几天心情很好,所以给大家添点儿料~~~(因为招生工作快完成了。
在教育行业也真是够累的了,一到1月和7月就忙的不可开交,招生…………真凡人!顺便问问,有没有北京的FOXER啊?来报个电大学习学习吧。
放心!我不讲课。
呵呵)闲话不说了!开始正题!大家是不是都需要知道ActiveX控件都有什么内容呢?他们都是用来干什么的呢?我也报着这样的疑问!现在开始顿悟了。
请看:ActiveX控件使用说明之一VFP附有的ActiveX控件 .ocx文件及其包含的ActiveX控件:)1。
COMCTRL32。
OCX包含如下控件:1。
ImageList控件2。
ListView控件3。
ProgressBar控件4。
Slider控件5。
StatusBar控件6。
TabStrip控件7。
Toolbar控件8。
TreeView控件2。
COMDLG32。
OCX包含如下控件:common Dialogs控件3。
DBLIST32。
OCX包含如下控件:1。
MSDataCombo控件2。
MSDataList控件4。
FOXHWND。
OCX包含如下控件:1。
Visual FoxPro HWND控件5。
FOXTLIB 。
OCX包含如下控件:Visual FoxPro Foxtlib控件6。
GRID32。
OCX包含如下控件:Grid控件7。
MCI32。
OCX包含如下控件:Microsoft Multimedia控件8。
MSACAL70。
OCX包含如下控件:Calendar控件9。
MSCOMM32。
OCX包含如下控件:Microsoft Comm控件10。
MSMAPI32。
OCX包含如下控件:1。
Microsoft MAPI Message控件2。
Microsoft MAPI Session控件11。
MSOUT32。
OCX包含如下控件:Outline控件12。
PICCLP32 。
OCX包含如下控件:PicClip控件13。
Excel中表单控件和ActiveX控件的区别!
Excel中表单控件和ActiveX控件的区别!
在Excel中用过控件的同学都知道,控件分为表单控件和ActiveX 控件两种。
经常有同学会问,这两类控件有何不同之处呢?
下面,我们在Excel表中插入表单控件中的组合框,同时也插入ActiveX控件中的组合框,点击右键,看看弹出的菜单有何区别?
可以看出,不论是表单控件还是ActiveX控件都可以给其绑定一段程序,让其成为一段程序的触发开关。
再点击下各自的设置控件格式看下:
表单控件的格式设置里有控制选项,ActiveX控件的格式设置里没有此选项。
综上,我们可以看出表单控件和Active X控件的区别:
表单控件只能在Excel工作表中添加和使用,可以设置控件格式或者给其指定宏。
Active X控件不仅可以在工作表中使用,还可以在VBE编辑器用户窗体中使用,同时具备了很多的属性和事件,这些都是表单控件所不具备的,也是表单控件和Active X控件最核心的区别所在。
ActiveX控件
Active控件是指具有宽松定义的,基于COM技 控件是指具有宽松定义的,基于 控件是指具有宽松定义的 技 组合对象模型技术)的集合. 术(组合对象模型技术)的集合. 使用时需要添加到工具箱中: 使用时需要添加到工具箱中:
[工程 工程]|[部件 部件] 工程 部件 在列表框中选择需要的部件后单击"确定"按钮. 在列表框中选择需要的部件后单击"确定"按钮. 如果删除不需要的部件, 如果删除不需要的部件,可将列表框中的相应部件前 面的对钩对掉,然后单击"确定"按钮. 面的对钩对掉,然后单击"确定"按钮.
[工程 工程]|[部件 部件] 工程 部件 在列表框中选择Microsoft Tabbed Dialog Control6.0 在列表框中选择 单击"确定"按钮. 单击"确定"按钮. 选项卡控件默认名称是SSTabX(X为序号 ,2,3……) 为序号1, , 选项卡控件默认名称是 ( 为序号 )
选项卡控件常用属性: 选项卡控件常用属性:
Value属性: Value属性: 属性
设置/ 设置/返回进度值 .
Байду номын сангаас
注意:Height,Width,BorderStyle属性 注意:Height,Width,BorderStyle属性 值影响着进度小方块的数量和大小. 值影响着进度小方块的数量和大小.
�
TickFrequency属性: TickFrequency属性: 属性
设置滑动器上标记的增量值 .
滑动器控件常用事件: 滑动器控件常用事件:
滑动器具有Scroll和Change两个事件 滑动器具有Scroll和Change两个事件.前 两个事件. 者是拖动滑块产生的事件, 者是拖动滑块产生的事件,后者是只要滑块 改变位置就会产生的事件. 改变位置就会产生的事件.
Excel表单控件和ActiveX控件使用详解
在VBA编程中Excel提供了两种控件,表单空控件和ActiveX控件,相信好多非开发的专业人员都搞不清楚两个的区别,本文就以Excel2016版本为例,和大家一起讨论下这两种控件的区别和用法,大家一起相互学习、交流沟通。
1两种控件获取的位置如果使用控件,需要将Excel VBA“开发工具”加载到菜单栏,具体操作如下:a)点击“文件菜单”b)在打开的界面中点击“选项”菜单c)在打开的Excel选项界面中点击“自定义功能区”,并按照下图勾选“开发工具”,点击“确定”按钮就可以,将开发工具显示在Excel的菜单栏d)在Excel主界面中点击“开发工具”,打开VBA开发相关菜单功能,OK,马上我们的正主就要到了。
e)OK,在VBA开发工具相关菜单中,点击“插入”按钮,就可以看到“表单控件”和“ActiveX控件”了,下面我们就来一探究竟,这两种差距的主要区别2两种控件的主要区别和优缺点MouseUp无属性可以修改可修改一系列相关属性,在VBA开发的过程中可以控制。
是,通过DrawingObjects或者通是,可以通过Name以对象Box 3").Value是,可以通过控件来控制图表通过以上比较,发现ActiveX控件更加适合熟悉VBA编程的专业人士使用,具有丰富的响应事件。
但是窗体控件也具有其先天的优势,可以在不编程的情况下和关联单元格,并可以在Chart图标中添加窗体控件。
所以,两种控件的使用,需要根据具体使用场景进行有效的选择。
3如何使用两种控件3.1使用ActiveX控件控制多条件组合动态筛选3.1.1准备样例数据3.1.1插入ActiveX控件3.1.2为checkbox添加单击事件,动态控制筛选Private Sub CheckBox1_Click()Dim criterial2 As StringDim myRange As RangeDim flag As Booleanflag = Sheet1.CheckBox1.ValueSet myRange = Range("D4:D11")'获取要筛选的值criterial2 = LTrim(RTrim(Range("D2").Value))If criterial2 <> "" And flag = True Then'myRange.AutoFilter field:=2, Criteria1:=criterial2, VisibleDropDown:=FalsemyRange.AutoFilter Field:=2, Criteria1:=criterial2ElsemyRange.AutoFilter Field:=2End IfEnd SubPrivate Sub CheckBox2_Click()Dim criterial3 As StringDim myRange As RangeDim flag As Booleanflag = Sheet1.CheckBox2.ValueSet myRange = Range("E4:E11")'获取要筛选的值criterial3 = LTrim(RTrim(Range("F2").Value))If criterial3 <> "" And flag = True Then' VisibleDropDown:=False 使用了这个参数,筛选就不出现下拉箭头'myRange.AutoFilter field:=3, Criteria1:=criterial3, VisibleDropDown:=FalsemyRange.AutoFilter Field:=3, Criteria1:=criterial3ElsemyRange.AutoFilter Field:=3End IfEnd Sub3.1.3AutoFilter函数使用说明AutoFilter:使用“自动筛选”筛选一个列表。
ActiveX控件
(图10.4)
返回章首
1.2.2 创建ActiveX控件
图10.3 新建ActiveX控件
图10.4 添加UserControl设计器 到工程中
(3)选择 “工程\工程1属性”命令,打开 “工程属性” 对话框。
(4)从“通用” 选项卡(图10.5)填写以下信息:
返回章首
1.1.1 在工程中加载ActiveX控件
要删除工具箱中某个ActiveX控件的操作步骤与上面所讲的类似,只 返回章首 要再次单击复选框,去掉框中的“√”。 如果“部件”对话框中找不到控件所在的部件名,请单击“浏览” 按钮,从“从添加ActiveX控件”对话框(1.2)中找到该控件所有的 扩展名为.ocx的文件,然后,单击 “打开” 按钮,这样该控件所在 的部件被添加到 “部件” 对话框的可用部件列表中并自动被选中。
返回章首
1.2.1 基本概念
1、控件类与控件实例
Visual Basic 中开发的 ActiveX 控件实际上是一个控件类,它是 控件创建的依据。当把一个控件放在窗体上的时候,就创建了该控 件类的一个实例。为了避免混淆,需要注意设计的控件类与放在窗 体上的控件实例是有区别的。
2、控件与控件部件
控件是由控件部件 (.ocx 文件 ) 提供的对象,一个控件部件可以 提供多种类型的控件。每个ActiveX 控件工程可以包括一个或多 个.ctl 文件,每个文件定义一个控件类。在创建这个工程时, Visual Basic 把控件部件的扩展名设为 .ocx
3、容器与定位
控件实例不能单独存在,它必须放在一个容器上( 如窗体 )。把控 件实例挂接到容器上的过程叫做定位,即赋予控件在容器上的一个 位置。当控件实例被定位之后,它的事件将以事件过程的形式出现 在容器的代码窗口中。控件能够访问容器提供的其他服务。
在文档中使用ActiveX控件
在文档中使用ActiveX控件
在文档中使用ActiveX 控件
就好像可向自定义对话框中增添ActiveX控件同样,也可向文档直接增添控件,进而能够为用户供给一种复杂的方法来直接与宏进行交互,而不用被对话框所扰乱。
可用以下过程向文档增添ActiveX控件。
相关更多的在MicrosoftExcel中使用ActiveX控件的特定信息,请参阅在工作表上使用ActiveX控件。
向文档中增添控件
显示“控件工具箱”,单击要增添的控件,再单击文档。
设置控件属性
在设计模式下,用鼠标右键单击控件,而后单击快捷菜单上的“属性”以显示“属性”窗口。
初始化控件
可在某一过程中初始化控件。
编写事件过程
全部的控件都有一组预约义事件。
比如,当用户单击命令按钮时,该命令按钮就引起一个Click事件。
能够编写事件发生时所运转的事件过程。
代码运转时使用控件值
有些属性可在运转时进行设置
1 / 11。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单文档/视图模式是MFC编程里比较强大的一种编程模式,如果ActiveX控件能够用这种模式的话,将可以做出非常强大的Web在线应用。
下面我们就介绍一种把单文档/视图模式的程序改造成ActiveX控件的方法。
做起来很难,但是完成了会很有成就感,本方法来源于15Seconds。
在VC6.0和下都已证明可行。
我用这个方法做了一个Web上的在线服装设计软件,Client 端支持NT4.0,客户公司有上千台NT4.0。
据美国同事说在投标中击败了Altium公司(电路设计软件Protel的开发商)的方案,哈。
需要要两个文件:// ActivDoc.cpp : implementation file//#include "stdafx.h"#include "ActivDoc.h"CActiveXDocTemplate::CActiveXDocTemplate(CRuntimeClass* pDocClass, CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass): CSingleDocTemplate(IDR_NOTUSED, pDocClass, pFrameClass,pViewClass){ASSERT(pFrameClass);}CFrameWnd* CActiveXDocTemplate::CreateDocViewFrame(CWnd* pParen tWnd){CWaitCursor cursor;TRY{ASSERT(pParentWnd && IsWindow(*pParentWnd));ASSERT_KINDOF(CActiveXDocControl, pParentWnd);m_pParentWnd = pParentWnd;m_pFrameWnd = NULL;// OpenDocumentFile is a virtual method (implemented in// the CSingleDocTemplate base class) that creates// the document (either empty or loaded from the specified// file) and calls our CreateNewFrame function. Passing// NULL to the function creates a new document. Incidentally,// the view is created by the CFrameWnd's OnCreateClient()// method.if (!OpenDocumentFile(NULL))return NULL;// Since OpenDocumentFile sets m_pFrame, we can now use it.ASSERT(m_pFrameWnd);ASSERT_KINDOF(CFrameWnd, m_pFrameWnd);m_pFrameWnd->ShowWindow(SW_SHOWNORMAL);return m_pFrameWnd;}CATCH_ALL(e){AfxMessageBox("Read storyboard error.please retry!");//THROW_LAST();}END_CATCH_ALLreturn NULL;}CFrameWnd* CActiveXDocTemplate::CreateNewFrame(CDocument* pDoc, CFrameWnd* pOther){ASSERT(pOther == NULL);ASSERT(m_pFrameClass != NULL);if (pDoc != NULL)ASSERT_VALID(pDoc);// Create a frame wired to the specified documentCCreateContext context;context.m_pCurrentFrame = pOther;context.m_pCurrentDoc = pDoc;context.m_pNewViewClass = m_pViewClass;context.m_pNewDocTemplate = this;m_pFrameWnd = (CFrameWnd*)m_pFrameClass->CreateObject();if (m_pFrameWnd == NULL){TRACE1("Warning: Dynamic create of frame %hs failed. ",m_pFrameClass->m_lpszClassName);return NULL;}ASSERT_KINDOF(CFrameWnd, m_pFrameWnd);if (context.m_pNewViewClass == NULL)TRACE0("Warning: creating frame with no default view. ");// The frame is created as a menu-less child of the// CActiveXDocControl in which it will reside.ASSERT_KINDOF(CActiveXDocControl, m_pParentWnd);if (!m_pFrameWnd->Create(NULL, "", WS_CHILD|WS_VISIBLE, CFrameWnd::rectDefault, m_pParentWnd, NULL, 0, &context)) {TRACE0("Warning: CDocTemplate couldn't create a frame. ");return NULL;}return m_pFrameWnd;}CDocument* CActiveXDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName, BOOL bVerifyExists){CWaitCursor cursor;SaveDocumentFile();m_docFile = lpszPathName;if (bVerifyExists){DWORD dwAttrib = GetFileAttributes(m_docFile);if (dwAttrib == 0xFFFFFFFF ||dwAttrib == FILE_ATTRIBUTE_DIRECTORY){lpszPathName = NULL;}}return CSingleDocTemplate::OpenDocumentFile(lpszPathName, TRUE);}void CActiveXDocTemplate::SaveDocumentFile(){if (m_pOnlyDoc != NULL){if (!m_docFile.IsEmpty())m_pOnlyDoc->OnSaveDocument(m_docFile);elsem_pOnlyDoc->SetModifiedFlag(FALSE);}}///////////////////////////////////////////////////////////////////////////// // CActiveXDocControlIMPLEMENT_DYNAMIC(CActiveXDocControl, COleControl)BEGIN_MESSAGE_MAP(CActiveXDocControl, COleControl) //{{AFX_MSG_MAP(CActiveXDocControl)ON_WM_CREATE()ON_WM_SIZE()ON_WM_TIMER()ON_WM_DESTROY()//}}AFX_MSG_MAPON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)END_MESSAGE_MAP()BEGIN_DISPATCH_MAP(CActiveXDocControl, COleControl) //{{AFX_DISPATCH_MAP(CActiveXDocControl)//}}AFX_DISPATCH_MAPEND_DISPATCH_MAP()BEGIN_EVENT_MAP(CActiveXDocControl, COleControl)//{{AFX_EVENT_MAP(COleFrameCtrl)//}}AFX_EVENT_MAPEND_EVENT_MAP()int CActiveXDocControl::m_bDocInitialized = FALSE; CActiveXDocControl::CActiveXDocControl(){CWaitCursor cursor;m_pDocTemplate = NULL;m_pFrameWnd = NULL;// Since we're in an OCX, CWinApp::InitApplication() is// not called by the framework. Unfortunately, that method// performs CDocManager initialization that is necessary// in order for our DocTemplate to clean up after itself.// We simulate the same initialization by calling the// following code the first time we create a control.if (!m_bDocInitialized){CDocManager docManager;docManager.AddDocTemplate(NULL);m_bDocInitialized = TRUE;}}CActiveXDocControl::~CActiveXDocControl(){// Note that the frame, the document, and the view are// all deleted automatically by the framework!KillTimer(m_Timer);delete m_pDocTemplate;m_bDocInitialized = FALSE;}void CActiveXDocControl::AddDocTemplate(CActiveXDocTemplate* pDocT emplate){// I've decided to call this function AddDocTemplate to// be consistent with naming of CWinApp::AddDocTemplate.// However, only one DocTemplate is allowed per control.CWaitCursor cursor;ASSERT(pDocTemplate);ASSERT(m_pDocTemplate == NULL);m_pDocTemplate = pDocTemplate;}int CActiveXDocControl::OnCreate(LPCREATESTRUCT lpCreateStruct) {CWaitCursor cursor;if (COleControl::OnCreate(lpCreateStruct) == -1)return -1;// The CActiveXDocTemplate object will create the// document, the view, and the frame inside the// control. The reason we need a handle to the frame// is so that we can resize it when the control is// resized.ASSERT(m_pDocTemplate); // Set in call to AddDocTemplate m_pFrameWnd = m_pDocTemplate->CreateDocViewFrame(this); ASSERT_KINDOF(CFrameWnd, m_pFrameWnd);// By default, we'll create the control with a border,// since it looks better for frames containing a toolbar.SetBorderStyle(TRUE);m_IsTimerEnd = "NO";m_Timer = SetTimer(WM_IDLEUPDATECMDUI, 300, NULL);return 0;}void CActiveXDocControl::OnSize(UINT nType, int cx, int cy){COleControl::OnSize(nType, cx, cy);// The CFrameWnd should always fill up the entire client// area of the control.if (m_pFrameWnd != NULL){ASSERT(IsWindow(*m_pFrameWnd));CRect area;GetClientRect(area);m_pFrameWnd->MoveWindow(area.left, area.top, area.right, area.bottom);}}void CActiveXDocControl::OnTimer(UINT nIDEvent){// Since we're in an OCX, we don't control the message loop,// so CWinThread::OnIdle is never called. That means we have // to periodically pump the ON_UPDATE_COMMAND_UI messages // by hand.SendMessageToDescendants(WM_IDLEUPDATECMDUI, TRUE);//COleControl::OnTimer(nIDEvent);/*if (m_IsTimerEnd=="NO") {m_IsTimerEnd = "YES";}*/}void CActiveXDocControl::OnDestroy(){AfxGetApp()->m_pMainWnd = NULL;m_pDocTemplate->SaveDocumentFile();COleControl::OnDestroy();}2. ActivDoc.hclass CActiveXDocTemplate : public CSingleDocTemplate{enum { IDR_NOTUSED = 0x7FFF };CWnd* m_pParentWnd;CFrameWnd* m_pFrameWnd;CString m_docFile;public:CActiveXDocTemplate(CRuntimeClass* pDocClass,CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass);CFrameWnd* CreateDocViewFrame(CWnd* pParentWnd);void SaveDocumentFile();virtual CFrameWnd* CreateNewFrame(CDocument* pDoc,CFrameWnd* pOther);virtual CDocument* OpenDocumentFile(LPCTSTR lpszPathName, BOOL bVerifyExists = TRUE);};///////////////////////////////////////////////////////////////////////////// class CActiveXDocControl : public COleControl{enum { WM_IDLEUPDATECMDUI = 0x0363 };CActiveXDocTemplate* m_pDocTemplate;UINT m_Timer;DECLARE_DYNAMIC(CActiveXDocControl)protected:void AddDocTemplate(CActiveXDocTemplate* pDocTemplate);CDocTemplate* GetDocTemplate() { return m_pDocTemplate; } CString m_IsTimerEnd;//{{AFX_MSG(CActiveXDocControl)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnSize(UINT nType, int cx, int cy);afx_msg void OnTimer(UINT nIDEvent);afx_msg void OnDestroy();//}}AFX_MSG//{{AFX_DISPATCH(CActiveXDocControl)//}}AFX_DISPATCH//{{AFX_EVENT(CActiveXDocControl)//}}AFX_EVENTDECLARE_MESSAGE_MAP()DECLARE_DISPATCH_MAP()DECLARE_EVENT_MAP()public:CActiveXDocControl();virtual ~CActiveXDocControl();CFrameWnd* m_pFrameWnd;static BOOL m_bDocInitialized;enum {//{{AFX_DISP_ID(CActiveXDocControl)//}}AFX_DISP_ID};};改造步骤:1.建立MFC ActiveX工程(例如:MyActiveX)2.用CActiveXDocControl替换COleControl3.把ActivDoc.h和ActivDoc.cpp加入工程中5.拷贝单文档视图的文件(框架文件(*frm.cpp,*frm.h),文档文件(*doc.cpp,*doc.h),视图文件(*view.cpp,*view.h),和其他.cpp和.h,注意,不包括App文件)到ActiveX工程。