VC++编写ActiveX控件详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC++编写ActiveX控件
VC++编写ActiveX控件
ActiveX这门技术是通过生成“*.ocx”文件来实现的。
先来了解下OCX文件,在百度百科上面对OCX是这样解释的:
“.ocx是ocx控件的扩展名,OCX 是对象类别扩充组件。
如果你用过Visual Basic或者Delphi一类的可视化编程工具,那么对控件这个概念一定不会陌生,就是那些工具条上的小按钮,如EditBox,Grid,ImageBox,Timer等等。
每个控件都有自己的事件、方法和属性。
使用了控件的编程非常容易。
首先,在程序的设计阶段可以设置一些属性,如大小,位置,标题(caption)等等;在程序运行阶段,可以更改这些属性,还可以针对不同的事件,调用不同的方法来实现对该控件的控制。
控件就好像一块块的积木,程序要做的事只是将这些积木搭起来。
控件的最大好处是可以重复使用,甚至可以在不同的编程语言之间使用,例如你可以在VB中嵌入用VC开发的控件。
”
里面最后一句话比较重要,就是用VC开发的OCX控件,你可以在其它语言里面都能调用,这样很好的实现了功能化组件的良好循环使用,而且还可以实现跨语言地调用(例如,你完全可以用C#调用C++开发的OCX控件)。
下面开始介绍,如何用VC++一步步生成你想要的“*.ocx”文件。
1. 建立最简单的ocx文件并进行调试
1.1 建立最简单的ocx文件
VC->新建项目->MFC ActiveX WinZard
一路点击“确定”,直到点击“完成”。
最后VC++会自动生成一些文件,这些文件就构成了ActiveX的基本模板,文件的主要结构如下:
直接编译一下,然后在Debug目录下面就会生成一个名为“ocxDemo.ocx”的控件注册文件,然后利用“regsvr32”命令就可以实现本机对此控件的注册,然后就可以使用本语言或者跨语言编写程序时引用此控件来实现相应的功能(后面将会讲到)。
1.2 ocx调试方法:
VC++自带有一个调试控件的工具“ActiveX控件测试容器”,通过三种方式可以打开:1.点击“调试”按钮,会出现如下对话框:
然后浏览"C:\Program Files\Microsoft Visual Studio\Common\Tools\TSTCO N32.EXE“
2. 系统的“开始“-》“程序”-》“Microsoft Visual C++ 6.0”-》“Microsoft Visual C++ 6.0 Tools”-》“Active Control Test Container”
3. VC++开发环境中的“工具”-》“ActiveX Control Test Container”
通过上面的任意一种方法,都可以调出下面的程序:
右击空白区域,插入控件,然后会弹出下面的对话框:
选中指定控件,然后点击确定,控件就被加载到此工具中了,然后可以通过这个工具来看此控件的相关事件响应等等。
2.自VC++生成的模板基础上自定义功能
所有的自定义功能基本上都来自于“MFC ClassWizard”类向导对话框。
(“快捷键Ctrl+W”或者“查看”->“建立类向导…”)
在“Automation”选项卡中为控件添加方法和属性。
在“ActiveX Events”选项卡中为控件添加事件。
2.1 添加控件属性
切换到“Automation”选项卡中,点击右边的“Add Property…”会弹出对话框:
External name:外部名称。
指此控件被使用时,外部程序看到的属性名称,仅在外部引用时被使用。
Type:属性类型。
除了基本的整形等数据类型外,还有很多复杂的高级数据类型。
Variable name:变量名称。
此属性在控件源文件中的变量名称,在编写控件源码时使用。
Notification function:提醒函数。
当此属性被改变时,会触发此提醒函数。
Implementation:实现方式。
指属性的三种类型:固有型,成员变量型,Get/Set方法型。
固有型是指系统赋予的固有属性,如背景色,标题;成员变量型是用户自定义的属性;Get/Set方法型,可能是指只能通过Get/Set方法才能获取和改变的变量吧(这个没研究)。
2.2 添加控件方法
在“Automation”选项卡中,点击右边的“Add Method…”会弹出对话框:
External name:方法外部名称。
Internal name:方法内部名称。
Return type:返回值类型。
除了基本的整形等数据类型外,还有很多复杂的高级数据类型。
Implementation:实现方式。
两种:固有方法,自定义方法。
Parameter list:参数列表。
参数名称和参数类型:参数类型包含很多高级数据类型。
2.3 添加控件事件
切换到“ActiveX Events”选项卡中,点击右边的“Add Event…”会弹出对话框:
External name:事件外部名称。
Internal name:事件内部名称。
比外部名称多了个前缀“Fire”。
Implementation:实现方式。
两种:固有事件,自定义事件。
固有事件一般是鼠标移动,双击等等事件,这些事件都由系统消息触发;自定义事件则是完全由用户定义的一个函数,但这个函数需要用户在源文件中调用(在内部调用,对于控件的使用方来说,就相当于在调用的地方此事件被触发,而内部传入的参数,则是此事件产生的消息附带信息)。
Parameter list:参数列表。
参数名称和参数类型:参数类型包含很多高级数据类型。
总述:通过“类向导”工具,为控件添加属性、方法和事件后,VC++会自动在相应的文件里面生成代码,比如内部方法属性和外部方法属性之间的映射,消息的建立,消息的声明,等等。
如果用户要对引进行深入研究,还需要对程序的结构比较熟悉,知道各部分代码的作用,知道哪些地方的代码是系统自动生成的,哪些代码需要用户手动加入的。
Visual C++开发环境虽然有很多优点,但有个缺点也很明显,就是代码结构比较乱,感觉没有VS200 5和后面的Visual Studio系列要好。
但是由于VC6.0作为一个比较经典的开发环境,而且网上的有关C++的程序设计基本上都是基于VC6.0的,所以,有必要对其进行学习,便于自己读懂网上的代码并进行消化吸收。
2.4 生成ocx文件并调试
直接编译用户加入了自定义代码的项目,然后在项目的Debug目录下面会生成一个o cx文件,这个就是此控件的注册文件了。
控件的调试工具仍然是“ActiveX Control Test Container”。
假设我们在控件中加入了一个事件:固有事件——“MouseMove”鼠标移动事件;用户自定义事件——ocxClick事件(此事件是通过“WM_MOUSEMOVE”消息来触发的,返回的是鼠标当前位置的x坐标)。
运行“ActiveX Control Test Container”并插入当前控件,当鼠标在上面移动的时候,可以看到MouseMove产生了事件了。
同时可以通过“Control”-》“Invoke Method”来对控件的方法进行测试,测试的方法就是你输入参数,它返回计算结果(下面以自定义的方法funHello为例)。
3.控件的使用方法
3.1 注册控件
ocx控件的安装方式有很多种,这里介绍最简单的一种。
步骤:
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 Controls文件目录下的你刚才注册的控件,比如“OcxDemo Control”,然后点击“Insert”按钮即可将此控件添加到控件工具条集合中。
3. 将控件工具条上新增加的OCX控件拖入到应用程序主窗口中。
完成上面的步骤后,就可以像使用普通控件一样在VC中使用此控件了(右击此控件,可以查看此控件的“事件”和“属性”,就是你在编写控件源码时的那些“外部名称External nam e”)。
3.2.2 通过C#调用
其实这个才是重点,因为跨语言调用ActiveX技术最被笔者看好的地方。
用Visual Studio 2005新建一个C#.NET的Windows窗口程序,然后在工具箱面板上,右击“选择项”,选择COM组件,找到你注册的ActiveX控件:
确定后,那个OcxDemo Control控件就加载到工具箱里面了。
可以直接拖动这个控件到C#.NET应用程序的主窗口上去了,然后就像使用普通控件那样使用此控件了。
比如,本文中的ActiveX控件的自定义事件中,是通过鼠标移动来触发,那么在应用程序中,只要鼠标移动到控件上,那么就会触发此自定义事件,并获取当前鼠标位置的橫坐标。
4. 最后一些Tip
1)在自定义控件时,可在控件源码的OnDraw()函数中设置控件的外观(也就是控件被拖入到应用程序中时呈现的样子,一般默认是一个白色的方框内切椭圆的样式)。
2)用C#来使用ActiveX的事件时,事件所产生的数据都包含在Event变量中,只需要用个点运算符就可以取出来了。
5.展望
控件函数的返回值类型那么多,那么复杂,如果要用得好,还需要对那些OLE数据类型进行好好学习,这个等今后需要时再慢慢学习吧。
演练VC中的COMMON一族(转贴)
2008-12-09 21:43:18| 分类:VC小知识阅读41 评论0 字号:大中小订阅
声明:由于在csdn论坛看到不少vc新手问及vc控件的使用。
本人手头正好有一份以前下载到的一份资料,讲述的比较详细。
所以发出来和大家共享。
但由于时间久远,已不及得下载的地址了。
所以只能以收藏方式发表。
下面有原作者的单位和姓名。
在此表示歉意!
演练vc中的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
其中,绝大部分通用控制在mfc类库中都存在两种封装形式,即控制类和视类,控制类主要是供直接使用控制而提供的,而视类则是通过间接使用控制而提供的,视类可以更好地把控制类集成到mfc结构中,并且使用视类可以利用引用直接对嵌套在其中的控制进行各种操作。
两者在使用方法上没有太大区别,就拿列表控制类和视类来说,当创建列表视后可通过clistctrl& ctrllist = getlistctrl()成员函数取得视类引用ctrllist之后,就可以利用列表视的视函数对视进行各项操作(ctrllist.add等)。
第1章演练cheadctrl
表头控制(cheaderctrl)通常应用在窗口中的文本或数据的列表之上。
一般为数据列的标题,可以包括多个部分,用户可以拖动每个部分并可以控制每列的宽度。
表头控制类提供了普通表头控制的基本方法,只有在windows95以后版本系统中才提供,其方法包含在afxcmn.h文件中,一般与标签控制(ctabctrl)和列表控制(clistctrl)组合使用。
1.1 表头控制的对象结构
1.1.1 表头控制对象的建立方法
cheaderctrl &cheaderctrl 建立表头控制对象
create 建立表头并绑定对象
cheaderctrl::create的格式如下:bool create( dword dwstyle, const rect&
rect, cwnd* pparentwnd, uint nid );
其返回值非零时初始化成功,否则失败。
参数dwstyle用来确定表头控制类型;rect用来确定表头控制的大小和位置;parentwnd 用来确定表头控制的父窗口;nid用来表示表头控制的标志。
表头控制风格包括:
hds_buttons 表示表头控制外观类似按钮;
hds_horz 表示表头控制为水平排列;
hds_vert 表示表头控制为垂直排列;
hds_hidden 表示表头控制为隐藏模式。
它也可以使用普通类控制风格,包括:
ccs_bottom 设置控制位置在父窗口的底部并与父窗口同样宽度;
ccs_nodivider 在控制顶部形成两个像素的高亮区;
ccs_nohilite 在控制顶部形成一个像素的高亮区;
ccs_nomovey 在响应wm_size消息时重置大小并水平排列;
ccs_noparentalign 使控制自动靠近父窗口的顶部或底部;
ccs_noresize 设置初始大小或新值时使控制使用默认宽度和高度;
ccs_top 设置在父窗口客户区域的顶部并与父窗口同样宽度;
同样表头控制也可以使用窗口控制风格,包括:
ws_child 建立一个子窗口,不能用于ws_popup窗口类型;
ws_visible 建立一个初始时不可见的窗口;
ws_disabled 建立一个初始时无效的窗口;
ws_group 确定可用光标移动的控制群组;
ws_tabstop 确定可用tab控制移动站点;
表头控制一般分为两个步骤,首先确定表头控制的数据结构,然后建立表头控制并绑定对象。
1.1.2 表头控制的属性
表头控制的属性包括取得表头控制中项目的数量getitemcount、取得表头控制中某一项目的内容getitem和设置表头控制中某一项目的内容setitem。
1.1.3 表头控制的操作方法
表头控制的操作方法包括向表头控制中插入一个新项目insertitem、从表头控制中删除一个项目deleteitem和绘制表头中给定的项目drawitem等。
1.2 表头控制的数据结构
在使用表头控制时,首先必须建立一个数据结构hd_item,其结构定义如下:
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_format 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 表头控制的应用技巧
由于表头控制无法单独使用,其主要是配合列表控制和标签控制,并多以文字表头应用多见,insertitem、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.insertcolumn(i++,&lvcol);//插入一个表列
......//其它代码
第2章演练cimagelist
图像列表控制(cimagelist)是相同大小图像的一个集合,每个集合中均以0为图像的索引序号基数,图像列表通常由大图标或位图构成,其中包含透明位图模式。
可以利用windows32位应用程序接口函数api来绘制、建立和删除图像,并能实现增加、删除、替换和拖动图像等操作。
图像列表控制提供了控制图像列表的基本方法,这些方法在windows95及以后版本才能实现。
2.1 图像控制的对象结构
2.1.1 图像控制的数据成员
m_himagelist 连接图像对象的控制句柄
2.1.2 图像控制的建立方法
cimagelist&imagelist建立图像控制对象结构
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& imagelist1, 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 用来确定图像列表联系的位图标志值;crmask表示颜色屏蔽位;
lpszbitmapid 用来确定包含位图资源的标识串;
imagelist1 指向图像列表控制对象的一个指针;nimage1图像列表1中包含的图像数量;imagelist2指向图像列表控制对象的一个指针;nimage2图像列表2中包含的图像数量;dx 表示以象素为单位的图像宽度;dy表示以象素为单位的图像高度。
同样,图像控制的建立也包括两个步骤,首先建立图像列表结构,然后建立图像列表控制。
2.1.3 图像控制的属性类
图像控制的属性类包括返回m_himagelist.控制句柄getsafehandle、取得图像列表中的图像数量getimagecount、设置图像列表的背景颜色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 取得图像控制clistctrl::getimagelist的调用格式如下:
cimagelist* getimagelist( int nimagelist ) const;
其返回值为指向图像列表控制的指针,其中nimagelist用来确定取得返回值的图像列表的值,其取值与设置图像列表函数相同。
③图像控制在列表控制中的应用示例
cimagelist cil1,cil2; file://定义大小图标像列表
cvclistapp *papp=(cvclistapp *)afxgetapp();//取得列表控制程序
cil1.create(32,32,true,2,2); file://建立32位图像控制
cil1.add(papp->loadicon(idi_gj));//增加选中状态图像
cil1.add(papp->loadicon(idi_xs));//增加非选中状态图像
cil2.create(16,16,true,2,2); file://建立16位图像控制
cil2.add(papp->loadicon(idi_gj));//增加选中状态图像
cil2.add(papp->loadicon(idi_xs));//增加非选中状态图像
m_listctrl.setimagelist(&cil1,lvsil_normal);//设置大图标控制
m_listctrl.setimagelist(&cil2,lvsil_small);//设置小图标控制
2.2.2 图像控制在树控制中的应用技巧
2.2.2.1 设置图像控制ctreectrl::setimagelist的调用格式如下:
cimagelist* setimagelist( cimagelist * pimagelist, int nimagelisttype );
其返回值为指向前前一个图像列表的指针,否则为null;参数pimagelist为指向图像列表的标识,如果pimagelist为null则所有的图像都将从树控制中被清除;nimagelisttype为图像列表设置的类型,可以是如下值之一:
tvsil_normal 设置正常图像列表,其中包括选中和非选中两种图标;
tvsil_state 设置图像列表状态,指用户自定义状态;
2.2.2.2 取得图像控制ctreectrl::getimagelist的调用格式如下:
cimagelist* getimagelist( uint nimage );
如果调用成功则返回图像列表控制指针,否则为null;nimage为取得返回值的图像列表
类型,其取值和取得图像列表控制完全相同。
2.2.2.3 图像控制在树控制中的应用示例
cimagelist cil1,cil2;//定义大小图标像列表
cvctreeapp *papp=(cvctreeapp *)afxgetapp();//获取应用程序指针
cil1.create(16,16,ilc_color,2,2);//建立图像控制
cil1.add(papp->loadicon(idi_pm));//增加选中状态图像
cil1.add(papp->loadicon(idi_cj));//增加非选中状态图像
m_treectrl.setimagelist(&cil1,tvsil_normal);//设置图像控制列表
然后在树控制的结构定义中进行如下设置:
tcitem.item.iimage=0; file://设置未选中图像索引号
tcitem.item.iselectedimage=1;//设置选中时图像引号
2.2.3 图像控制在标2.2.4 签控制中的应用技巧
2.2.4.1 设置图像控制ctabctrl::setimagelist的调用格式
cimagelist * setimagelist( cimagelist * pimagelist );
其返回值为指向前一个图像列表的指针,如果不存在前一个图像列表则为null;pimagelist 为标识tab控制的图像列表指针。
2.2.4.2 取得图像控制ctabctrl::getimagelist的调用格式
himagelist getimagelist() const;
其返回值为指向tab控制的图像列表指针,如果调用不成功则为null。
其应用技巧较前两种更加简单,这里不再赘述。
第3章演练clist
3.1 列表控制的主要功能
列表控制和视(list control&view)主要用来以各种方式显示一组数据记录供用户进行各种操作,windows98/95中资源管理器中的“查看”标签下的“大图标|小图标|列表|详细资源”就是一个非常好的典型应用。
列表中的记录可以包括多个数据项,也可以包括表示数据内容的大小图标,用来表示数据记录的各种属性。
列表控制提供了对windows列表功能操作的基本方法,而使用列表视的视函数可以对列表视进行各种操作,通过调用视成员getlistctrl获取嵌在列表视内列表控制的引用(getlistctrl& ctrllist = getlistctrl()),就可以和列表控制一样进行各种操作。
操作一个列表控制和视的基本方法为:创建列表控制;创建列表控制所需要的图像列表;向列表控制添加表列和表项;对列表进行各种控制,主要包括查找、排序、删除、显示方式、排列方式以及各种消息处理功能等;最后撤消列表控制。
对于一个列表控制,其最典型最常用的显示控制方式为:大图标方式(lvs_icon)、小图标方式(lvs_smallicon)、列表显示方式(lvs_list)和详细资料(即报告lvs_report)显示方式。
这可以通过设置其显示方式属性来实现。
要控制列表所在窗口的风格,可通过功能函数getwindowlong和setwindowlong来实现,要控制列表图标的对齐方式,可通过设置列表窗口的风格lvs_aligntop或lvs_alignleft来实现,
3.2 列表控制的对象结构
3.2.1 列表控制的建立方法
clistctrl&listctrl 定义列表对象的结构
create 建立列表控制并绑定对象
列表控制clistctrl::create的调用格式如下:
bool create( dword dwstyle, const rect& rect, cwnd* pparentwnd, uint nid );
其中参数dwstyle用来确定列表控制的风格;rect用来确定列表控制的大小和位置;pparentwnd用来确定列表控制的父窗口,通常是一个对话框;nid用来确定列表控制的标识。
其中列表控制的风格可以是下列值的组合:
lvs_alignleft 用来确定表项的大小图标以左对齐方式显示;
lvs_aligntop 用来确定表项的大小图标以顶对齐方式显示;
lvs_autoarrange 用来确定表项的大小图标以自动排列方式显示;
lvs_editlabels 设置表项文本可以编辑,父窗口必须设有lvn_endlabeledit风格;
lvs_icon 用来确定大图标的显示方式;
lvs_list 用来确定列表方式显示;
lvs_nocolumnheader 用来确定在详细资料方式时不显示列表头;
lvs_nolabelwrap 用来确定以单行方式显示图标的文本项;
lvs_noscroll 用来屏蔽滚动条;
lvs_nosortheader 用来确定列表头不能用作按钮功能;
lvs_ownerdrawfixed 在详细列表方式时允许自绘窗口;
lvs_report 用来确定以详细资料即报告方式显示;
lvs_shareimagelists用来确定共享图像列表方式;
lvs_showselalways 用来确定一直显示被选中表项方式;
lvs_singlesel 用来确定在某一时刻只能有一项被选中;
lvs_smallicon 用来确定小图标显示方式;
lvs_sortascending 用来确定表项排序时是基于表项文本的升序方式;
lvs_sortdescending 用来确定表项排序时是基于表项文本的降序方式;
3.2.2 列表控制的属性类
列表控制的属性类包括取得列表控制的背景色getbkcolor、设置列表控制的背景色setbkcolor、取得列表控制的图像列表getimagelist、设置列表控制的图像列表setimagelist、取得列表项数目getitemcount、取得列表控制的属性getitem、取得与表项相关的数据getitemdata、设置表项的属性setitem、设置与表项相关的数值setitemdata、取得相关联的下一个表项getnextitem、设置列表控制的文本颜色settextcolor、取得列表控制的文本背景颜色gettextbkcolor、设置表项的最大数目setitemcount和取得被选中表项的数目getselectedcount 等。
3.2.3 列表控制的操作方法
列表控制的操作方法包括插入一个新的表项insertitem、删除一个表项deleteitem、排序表项sortitems、测试列表的位置hittest、重绘表项redrawitems、插入一个表列insertcolumn、删除一个表列deletecolumn、编辑一个表项文本editlabel和重绘一个表项drawitem等。
3.3 列表控制的数据结构
列表控制中包含两个非常重要的数据结构lv_item和lv_column。
lv_item用于定义列表控制的一个表项,lv_column用于定义列表控制的一个表列,其定义格式分别为:
typedef struct _lv_item {
uint mask; file://结构成员屏蔽位
int iitem; file://表项索引号
int isubitem; file://子表项索引号
uint state; file://表项状态
uint statemask; file://状态有效性屏蔽位
lptstr psztext; file://表项名文本
int cchtextmax; file://表项名最大长度
int iimage; // 表项图标的索引号
lparam lparam; // 与表项相关的32位数
} lv_item;
typedef struct _lv_column {
uint mask; file://结构成员有效性屏蔽位
int fmt; file://表列对齐方式
int cx; file://表列的象素宽度
lptstr psztext; file://表列的表头名
int cchtextmax; file://表列名的文本长度
int isubitem; file://与表列关联的子表项索引号
} lv_column;
其中fmt可以取如下值:
lvcfmt_center 表列居中对齐
lvcfmt_left 表列左对齐
3.4 列表控制的应用技巧示例
本文给出具体实例演示列表控制及前面的表头控制和图像列表的应用技巧。
步骤如下:1、通过“file->new->projects->mfc appwizard(exe)”建立名为vclist的工程,在建立过程中选择基于对话框(dialog based)的应用;将对话框中的默认控件删除,并将所有对话框属性中的language域设置为chinese(p.r.c.),以使应用程序支持中文;
建立两个图标idi_gj和idi_xs,用来表示图标的选中和非选中状态,对于每个图标都应建立32x32和16x16两种大小,以保证程序的需要;
3、在对话框窗口中设计组合框(group box),组合框中设置四个无线按钮(radio)“大图标|小图标|列表|资料”,同时设置排序、删除和关闭三个控制按钮(button),并在对话框中设置大小合适的列表控制(list ctrl),其对应标识分别如下:
控制名称标题名称标识符号
列表控制idc_listctrl
组合框方式idc_static
无线按钮大图标idc_stdicon
小图标idc_smlicon
列表idc_list
资料idc_report
按钮排序idc_sort
删除idc_del
关闭idok
4、在设置无线按钮时,需要注意的是只有大图标的group属性为选中状态,而其它无线按钮的状态均为默认值。
5、选中列表控制控件,选择“view->classwizard->memory variables”,并利用idc_ listctrl 引入成员变量,其变量类型为:
变量名种类变量类型
m_listctrl control clistctrl
同时利用“messages map”为各无线按钮和命令按钮增加控制功能。
6、然后在包含文件和代码文件中分别加入如下代码:
(1)在vclistdlg.h中增加数据结构和定义
typedef struct tagsps { file://定义结构。