1、VC+编写ActiveX控件详解VC+编写ActiveX控件 VC+编写ActiveX控件 ActiveX这门技术是通过生成“*.ocx”文件来实现的。先来了解下OCX文件,在XX百科上面对OCX是这样解释的: “.ocx是ocx控件的扩展名,OCX 是对象类别扩充组件。如果你用过Visual Basic或者Delphi一类的可视化编程工具,那么对控件这个概念一定不会陌生,就是那些工具条上的小按钮,如EditBox,Grid,ImageBox,Timer等等。每个控件都有自己的事件、方法和属性。使用了控件的编程非常容易。首先,在程序的设计阶段可以设置一些属性,如大小,位置,标题(caption
2、)等等;在程序运行阶段,可以更改这些属性,还可以针对不同的事件,调用不同的方法来实现对该控件的控制。控件就好像一块块的积木,程序要做的事只是将这些积木搭起来。控件的最大好处是可以重复使用,甚至可以在不同的编程语言之间使用,例如你可以在VB中嵌入用VC开发的控件。” 里面最后一句话比较重要,就是用VC开发的OCX控件,你可以在其它语言里面都能调用,这样很好的实现了功能化组件的良好循环使用,而且还可以实现跨语言地调用(例如,你完全可以用C#调用C+开发的OCX控件)。 下面开始介绍,如何用VC+一步步生成你想要的“*.ocx”文件。1. 建立最简单的ocx文件并进行调试1.1 建立最简单的ocx文
3、件 VC-新建项目-MFC ActiveX WinZard 一路点击“确定”,直到点击“完成”。最后VC+会自动生成一些文件,这些文件就构成了ActiveX的基本模板,文件的主要结构如下: 直接编译一下,然后在Debug目录下面就会生成一个名为“ocxDemo.ocx”的控件注册文件,然后利用“regsvr32”命令就可以实现本机对此控件的注册,然后就可以使用本语言或者跨语言编写程序时引用此控件来实现相应的功能(后面将会讲到)。1.2 ocx调试方法: VC+自带有一个调试控件的工具“ActiveX控件测试容器”,通过三种方式可以打开:1.点击“调试”按钮,会出现如下对话框: 然后浏览C:Pr
4、ogram FilesMicrosoft Visual StudioCommonToolsTSTCON32.EXE“2. 系统的“开始“程序”“Microsoft Visual C+ 6.0”“Microsoft Visual C+ 6.0 Tools”“Active Control Test Container”3. VC+开发环境中的“工具”“ActiveX Control Test Container” 通过上面的任意一种方法,都可以调出下面的程序: 右击空白区域,插入控件,然后会弹出下面的对话框: 选中指定控件,然后点击确定,控件就被加载到此工具中了,然后可以通过这个工具来看此控件的相
5、关事件响应等等。2.自VC+生成的模板基础上自定义功能 所有的自定义功能基本上都来自于“MFC ClassWizard”类向导对话框。 (“快捷键Ctrl+W”或者“查看”“建立类向导”) 在“Automation”选项卡中为控件添加方法和属性。 在“ActiveX Events”选项卡中为控件添加事件。2.1 添加控件属性 切换到“Automation”选项卡中,点击右边的“Add Property”会弹出对话框:External name:外部名称。指此控件被使用时,外部程序看到的属性名称,仅在外部引用时被使用。Type:属性类型。除了基本的整形等数据类型外,还有很多复杂的高级数据类型。V
6、ariable name:变量名称。此属性在控件源文件中的变量名称,在编写控件源码时使用。Notification function:提醒函数。当此属性被改变时,会触发此提醒函数。Implementation:实现方式。指属性的三种类型:固有型,成员变量型,Get/Set方法型。固有型是指系统赋予的固有属性,如背景色,标题;成员变量型是用户自定义的属性;Get/Set方法型,可能是指只能通过Get/Set方法才能获取和改变的变量吧(这个没研究)。2.2 添加控件方法 在“Automation”选项卡中,点击右边的“Add Method”会弹出对话框:External name:方法外部名称。I
7、nternal name:方法内部名称。Return type:返回值类型。除了基本的整形等数据类型外,还有很多复杂的高级数据类型。Implementation:实现方式。两种:固有方法,自定义方法。Parameter list:参数列表。参数名称和参数类型:参数类型包含很多高级数据类型。2.3 添加控件事件 切换到“ActiveX Events”选项卡中,点击右边的“Add Event”会弹出对话框:External name:事件外部名称。Internal name:事件内部名称。比外部名称多了个前缀“Fire”。Implementation:实现方式。两种:固有事件,自定义事件。固有事件
8、一般是鼠标移动,双击等等事件,这些事件都由系统消息触发;自定义事件则是完全由用户定义的一个函数,但这个函数需要用户在源文件中调用(在内部调用,对于控件的使用方来说,就相当于在调用的地方此事件被触发,而内部传入的参数,则是此事件产生的消息附带信息)。Parameter list:参数列表。参数名称和参数类型:参数类型包含很多高级数据类型。 总述:通过“类向导”工具,为控件添加属性、方法和事件后,VC+会自动在相应的文件里面生成代码,比如内部方法属性和外部方法属性之间的映射,消息的建立,消息的声明,等等。如果用户要对引进行深入研究,还需要对程序的结构比较熟悉,知道各部分代码的作用,知道哪些地方的代
9、码是系统自动生成的,哪些代码需要用户手动加入的。Visual C+开发环境虽然有很多优点,但有个缺点也很明显,就是代码结构比较乱,感觉没有VS2005和后面的Visual Studio系列要好。但是由于VC6.0作为一个比较经典的开发环境,而且网上的有关C+的程序设计基本上都是基于VC6.0的,所以,有必要对其进行学习,便于自己读懂网上的代码并进行消化吸收。2.4 生成ocx文件并调试 直接编译用户加入了自定义代码的项目,然后在项目的Debug目录下面会生成一个ocx文件,这个就是此控件的注册文件了。 控件的调试工具仍然是“ActiveX Control Test Container”。 假设
10、我们在控件中加入了一个事件:固有事件“MouseMove”鼠标移动事件;用户自定义事件ocxClick事件(此事件是通过“WM_MOUSEMOVE”消息来触发的,返回的是鼠标当前位置的x坐标)。 运行“ActiveX Control Test Container”并插入当前控件,当鼠标在上面移动的时候,可以看到MouseMove产生了事件了。 同时可以通过“Control”“Invoke Method”来对控件的方法进行测试,测试的方法就是你输入参数,它返回计算结果(下面以自定义的方法funHello为例)。3.控件的使用方法3.1 注册控件 ocx控件的安装方式有很多种,这里介绍最简单的一种
11、。步骤:1.将需要安装的OCX控件文件复制到某个目录,例如C盘根目录下。2.进入开始,点击运行。3.在出现的框中键入regsvr32 C:/xxxx.ocx 。(XXXX为控件名, C:/为目录)4.点击确认后等待出现提醒注册成功即可。3.2 ActiveX控件的调用 ActiveX作为一种通用的COM组件,可以被不同语言调用的。3.2.1 通过VC+调用 利用VC6.0建立一个MFC的基本对话框应用程序 在完成程序向导后。执行下面的步骤:1. 执行“工程”“添加到工程”“Components and Controls”。2. 在弹出的文件浏览对话框中,找到Registered ActiveX
12、 Controls文件目录下的你刚才注册的控件,比如“OcxDemo Control”,然后点击“Insert”按钮即可将此控件添加到控件工具条集合中。3. 将控件工具条上新增加的OCX控件拖入到应用程序主窗口中。完成上面的步骤后,就可以像使用普通控件一样在VC中使用此控件了(右击此控件,可以查看此控件的“事件”和“属性”,就是你在编写控件源码时的那些“外部名称External name”)。3.2.2 通过C#调用 其实这个才是重点,因为跨语言调用ActiveX技术最被笔者看好的地方。 用Visual Studio 2005新建一个C#.NET的Windows窗口程序,然后在工具箱面板上,右
13、击“选择项”,选择COM组件,找到你注册的ActiveX控件: 确定后,那个OcxDemo Control控件就加载到工具箱里面了。可以直接拖动这个控件到C#.NET应用程序的主窗口上去了,然后就像使用普通控件那样使用此控件了。 比如,本文中的ActiveX控件的自定义事件中,是通过鼠标移动来触发,那么在应用程序中,只要鼠标移动到控件上,那么就会触发此自定义事件,并获取当前鼠标位置的橫坐标。4. 最后一些Tip1) 在自定义控件时,可在控件源码的OnDraw()函数中设置控件的外观(也就是控件被拖入到应用程序中时呈现的样子,一般默认是一个白色的方框内切椭圆的样式)。2) 用C#来使用Activ
14、eX的事件时,事件所产生的数据都包含在Event变量中,只需要用个点运算符就可以取出来了。5.展望控件函数的返回值类型那么多,那么复杂,如果要用得好,还需要对那些OLE数据类型进行好好学习,这个等今后需要时再慢慢学习吧。演练VC中的COMMON一族(转贴)2008-12-09 21:43:18|分类: VC小知识 阅读41 评论0 字号:大中小订阅 声明:由于在csdn论坛看到不少vc新手问及vc控件的使用。本人手头正好有一份以前下载到的一份资料,讲述的比较详细。所以发出来和大家共享。但由于时间久远,已不及得下载的地址了。所以只能以收藏方式发表。下面有原作者的单位和姓名。在此表示歉意!演练vc
15、中的common一族辽宁省铁岭市委办公室(112000)宋立波 1.表头控制 header control 2.图像列表控制 image list 3.列表控制和视 list control&list view 4.树控制和视 tree control&tree view 5.标签控制和视 tab control&tab view 6.工具条控制 toolbar control 7.进度条控制 progress control 8.滑动条控制 slider control 9.旋转按钮控制 spin button control 10.状态条控制 status bar control其中,绝大
16、部分通用控制在mfc类库中都存在两种封装形式,即控制类和视类,控制类主要是供直接使用控制而提供的,而视类则是通过间接使用控制而提供的,视类可以更好地把控制类集成到mfc结构中,并且使用视类可以利用引用直接对嵌套在其中的控制进行各种操作。两者在使用方法上没有太大区别,就拿列表控制类和视类来说,当创建列表视后可通过clistctrl& ctrllist = getlistctrl()成员函数取得视类引用ctrllist之后,就可以利用列表视的视函数对视进行各项操作(ctrllist.add等)。第1章 演练cheadctrl 表头控制(cheaderctrl)通常应用在窗口中的文本或数据的列表之上
17、。一般为数据列的标题,可以包括多个部分,用户可以拖动每个部分并可以控制每列的宽度。表头控制类提供了普通表头控制的基本方法,只有在windows95以后版本系统中才提供,其方法包含在afxcmn.h文件中,一般与标签控制(ctabctrl)和列表控制(clistctrl)组合使用。1.1 表头控制的对象结构1.1.1 表头控制对象的建立方法 cheaderctrl &cheaderctrl 建立表头控制对象 create 建立表头并绑定对象 cheaderctrl:create的格式如下:bool create( dword dwstyle, const rect& rect, cwnd* pp
18、arentwnd, uint nid ); 其返回值非零时初始化成功,否则失败。 参数dwstyle用来确定表头控制类型;rect用来确定表头控制的大小和位置;parentwnd用来确定表头控制的父窗口;nid用来表示表头控制的标志。 表头控制风格包括:hds_buttons 表示表头控制外观类似按钮;hds_horz 表示表头控制为水平排列; hds_vert 表示表头控制为垂直排列; hds_hidden 表示表头控制为隐藏模式。它也可以使用普通类控制风格,包括: ccs_bottom 设置控制位置在父窗口的底部并与父窗口同样宽度; ccs_nodivider 在控制顶部形成两个像素的高亮
19、区; ccs_nohilite 在控制顶部形成一个像素的高亮区; ccs_nomovey 在响应wm_size消息时重置大小并水平排列; ccs_noparentalign 使控制自动靠近父窗口的顶部或底部; ccs_noresize 设置初始大小或新值时使控制使用默认宽度和高度; ccs_top 设置在父窗口客户区域的顶部并与父窗口同样宽度; 同样表头控制也可以使用窗口控制风格,包括: ws_child 建立一个子窗口,不能用于ws_popup窗口类型; ws_visible 建立一个初始时不可见的窗口; ws_disabled 建立一个初始时无效的窗口; ws_group 确定可用光标移动
20、的控制群组; ws_tabstop 确定可用tab控制移动站点; 表头控制一般分为两个步骤,首先确定表头控制的数据结构,然后建立表头控制并绑定对象。1.1.2 表头控制的属性 表头控制的属性包括取得表头控制中项目的数量getitemcount、取得表头控制中某一项目的内容getitem和设置表头控制中某一项目的内容setitem。1.1.3 表头控制的操作方法 表头控制的操作方法包括向表头控制中插入一个新项目insertitem、从表头控制中删除一个项目deleteitem和绘制表头中给定的项目drawitem等。1.2 表头控制的数据结构 在使用表头控制时,首先必须建立一个数据结构hd_it
21、em,其结构定义如下: typedef struct _hd_item uint mask; file:/结构成员有效控制位 int cxy; file:/表头项目的宽度 lpstr psztext; file:/表头项目内容 hbitmap hbm; file:/表头项目的位置句柄 int cchtextmax; file:/表头内容字符串长度 int fmt; file:/表头项目的格式 lparam lparam; file:/应用程序定义的32位数据 hd_item;屏蔽控制位说明了数据结构成员中包含的有效数据,可以是下面标志的组合: hdi_bitmap hbm成员有效 hdi_fo
22、rmat fmt 成员有效 hdi_lparam lparam成员有效 hdi_text psztext 和cchtextmax 成员有效 hdi_width cxy 成员有效并确定项目宽度值 格式标志位fmt可以是以下标志的组合: hdf_center 表头项目居中 hdf_left 表头项目左对齐 hdf_right 表头项目右对齐 hdf_bitmap 表头显示一个位图 hdf_ownerdraw 由主窗口自绘表头项目 hdf_string 表头项目为一个字符串1.3 表头控制的应用技巧 由于表头控制无法单独使用,其主要是配合列表控制和标签控制,并多以文字表头应用多见,insertite
23、m、setitem和getitem是常用的方法,如在列表控制时利用insertcolumn属性就可以增加一个表列的文本标题,具体用法和技巧见列表控制和标签控制。下面以在列表控制中的增加表列的方法来具体说明: lvcol.psztext=品 名;/设置第一列表头名 lvcol.isubitem=i; file:/表列序号 lvcol.cx=70; file:/表列宽度 m_listctrl.insertcolumn(i+,&lvcol);/插入一个表列 lvcol.psztext=数 量;/设置第二列表头名 lvcol.isubitem=i; lvcol.cx=70; m_listctrl.in
24、sertcolumn(i+,&lvcol);/插入一个表列 ./其它代码第2章 演练cimagelist 图像列表控制(cimagelist)是相同大小图像的一个集合,每个集合中均以0为图像的索引序号基数,图像列表通常由大图标或位图构成,其中包含透明位图模式。可以利用windows32位应用程序接口函数api来绘制、建立和删除图像,并能实现增加、删除、替换和拖动图像等操作。图像列表控制提供了控制图像列表的基本方法,这些方法在windows95及以后版本才能实现。2.1 图像控制的对象结构2.1.1 图像控制的数据成员 m_himagelist 连接图像对象的控制句柄2.1.2 图像控制的建立方
25、法 cimagelistimagelist建立图像控制对象结构 create 初始化图像列表并绑定对象 图像控制的建立方法如下: bool create( int cx, int cy, uint nflags, int ninitial, int ngrow ); bool create( uint nbitmapid, int cx, int ngrow, colorref crmask ); bool create( lpctstr lpszbitmapid, int cx, int ngrow, colorref crmask );bool create( cimagelist& im
26、agelist1, int nimage1, cimagelist& imagelist2 ,int nimage2,int dx, int dy ); 其中各项参数的含义为:cx定义图像的宽度,单位为象素;cy定义图象的高度,单位为象素;nflags确定建立图像列表的类型,可以是以下值的组合:ilc_color、ilc_color4、ilc_color8、ilc_color16、ilc_color24、ilc_color32、ilc_colorddb和ilc_mask;ninitial用来确定图像列表包含的图像数量;ngrow用来确定图像列表可控制的图像数量。 nbitmapid 用来确定图
27、像列表联系的位图标志值;crmask表示颜色屏蔽位; lpszbitmapid 用来确定包含位图资源的标识串;imagelist1 指向图像列表控制对象的一个指针;nimage1图像列表1中包含的图像数 量;imagelist2指向图像列表控制对象的一个指针;nimage2图像列表2中包含的图像数量;dx表示以象素为单位的图像宽度;dy表示以象素为单位的图像高度。同样,图像控制的建立也包括两个步骤,首先建立图像列表结构,然后建立图像列表控制。2.1.3 图像控制的属性类 图像控制的属性类包括返回m_himagelist.控制句柄getsafehandle、取得图像列表中的图像数量getimag
28、ecount、设置图像列表的背景颜色setbkcolor、取得图像列表的背景颜色setbkcolor和取得图像的有关信息setbkcolor。2.1.4 图像控制的操作方法 图像控制的操作方法包括将一个图像列表绑定到一个对象上attach、将对象上的图像列表解除绑定并返回句柄detach、删除一个图像列表deleteimagelist、将一个图像增加到图像列表中add和将一个图像从图像列表中删除remove等。2.2 图像控制的应用技巧 对于图像控制,同样不能单独使用,必须与列表控制、树控制和标签控制相互结合应用,下面分别介绍其具体应用技巧。2.2.1 图像控制在列表控制中的应用技巧2.2.1.1 设置图像控制clistctrl:setimagelist的调用格式如下: cimagelist* setimagelist( cimagelist* pimagelist, int nimagelist ); 其返回值是指向前一个图像列表控制的一个指针,如果不存在前一个图像列表则为null;其中参数pimagelist是指向图像列表的标识,nimagelist是图像列表的类型,可以是如下值: lvsil_normal 用大图标方式进行图像列表; lvsil_small 用小图标方式进行图像列表; lvsil_state 以图像状态进行图像列表;2.2.1.2 取得图像控制clis
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1