l ActiveX空件
ActiveX空件是一个软件组件,建立在COM技术上,在说明ActiveX原理之前不得不提提vtable.
MFC的消息与函数也是有类似的vtable.如:
WM_PAINT ---àOnPaint();
WM_QUIT-----àOnOK();
……….to be more……….
这个vtable里每一个消息就对应一个处理函数.ActiveX的vtable叫IDispatch vtable.这个vtable存了对应的接口id和处理函数。ActiveX伟大之处就在于这个接口连接工作是自动化的。
使用ActiveX空件最终就是为了实现“嵌入”。如:Excel 嵌入到 Word里面。媒介是COM技术。
l ActiveX容器与ActiveX服务器
这两个概念很容易搞乱,上例中Excel就是服务器,Word就是容器。ActiveX使用方法很简单,深入研究其原理,似乎没有必要。ActiveX空件最麻烦的一件事就是使用前要注册该ActiveX空件。
l ActiveX空件的注册
首先给WINDOWS注册:运行-àregsvr32 c:\windows\system32\msflxgrd.ocx
接着给VC++6.0注册:选择工程,再选增加到工程(工程已经存在的情况下),再选components and control,再选Registered ActiveX Controls目录,再选msflexgrid。点ok。
l ActiveX的自设成员变量
出于保护ActiveX空件,只能有一个对象型的,或者讲空件型的自设成员变量。
l MSFlexGrid控件使用摘要
SetRows及SetCols: 设置控件的行列数,如果你不往各行列中插入数据,表格将为指定行列数的空表.
大多数情况下,在往表格中插入数据时必须先确保表格的行列数能容纳你要插入的行列数,
不过当你用的是AddItem方法时,你可以不必手工增加行数(列数还是要先设置好的),因为
它会增加控件的行列数.
GetRows及GetCols:获取控件的行列数。
SetRow及SetCol:设置控件的当前格(由行号及列号指定)
SetText:设置控件的当前格的内容.
SetTextMatrix:设置指定格(由行号及列号指定)中的内容
SetTextArray:功能与SetTextMatrix相同,但指定格的位置的方式与SetTextMatrix不同, SetTextMatrix是
通过二维表中的行列索引来表示,而SetTextArray用一维索引来表示,其原理与C语言中访问
二维数组的方式相同,如:对于Table[N][M], Table[3][2]以一维方式表示为Table[3*M+2]. (我未实验:不完全可信)
AddItem:在控件中增加一行,行中各字段以tab字符相隔,不能用本方法来增加控件的第一行(固定行或表头),
它将导致控件的行数自动加一.
Clear:清除控件中的所有内容(不改变控件的原有行列数)
GetRowSel及GetColSel:获取控件的当前行、列,没有当前行(即表格为空)时,返回值为-1。
l 看了上边的东西包你不会用,哈哈,我们来看些实际点的东西.
Id
学生名字
性别
年龄
200501
老鼠
男
22
200502
美女
女
22
200503
小强
男
22
我们将会以这个表作为假设MSFlexGrid控件的使用方法,因为这个空件的使用太重要了,必须要掌握.这个表行数有0’,0,1,2 ; 列数有 0’,0,1,2 . 0’ 行是字段行,第一点我们要学会计算格子,这里有9个格子(字段行除外),每个格子都有它们自己的”ID”,比喻说”200502”是5号格子, 老鼠是2号格子.
我们自然会想到,这些格子与”行”标和”列”标有何关系呢.?看公式:
cell()=(行标x 4 +列标).
由于上面一大堆函数它们直接操作对象是格子(cell),比如说其中最重要的一个成员函数SetTextArray(格子,字符串或值)向表格填入数据.另外有些以Get字头的空参数函数,这使用起来的确很方便,不过还得知道它们是什么意思.
这里还介绍多两三个函数如:GetFixedRow()这个是获得字段行标,如这里的第0’ 行.
SetMergeCol(行标,值)这个函数则是用来合拼单元格的,同一列中邻近的格子具有相同的值的合拼.如上表,3个人的年龄都系22岁.那么我们可以这么做:
SetMergeCol(0,true);
SetMergeCol(1,true);
SetMergeCol(2,true);
l 随即函数
看这行代码:”Srand( (unsigned) time(NULL) )”这个语句会产生一些数值以参数形式传递给rand()函数.看msdn的一个例子:
/////////////////////////////////////////////////////////////////
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void main( void )
{
int i;
srand( (unsigned)time( NULL ) );
for( i = 0; i < 10;i++ )
printf( " %6d\n", rand() );
}//这里会输出10个随即数
///////////////////////////////////////////////////////////////////
l 今天的题设:
画一个对话框MyDlg,添加一个ActiveX控件msflexgrid,并为它设置如下属性:
ID标式符: IDC_MYGRID
Rows行数: 20
Cols列数:4
MergeCells:2-Restric Rows
Format:<Region|<Product|<Emploee|>Sales //这里是添加字段名,就好比为第0’ 行赋值。这4个英文单词的意思是地区、产品、销售员、卖出,假如你喜欢写成中文吧。
最后就是为控件添加成员变量m_ctlMygrid
l 我们首先为单元格计算公式,创建一个函数Mycell()
cell()=(行标x 4 +列标),不过我们改一改,改成cell()=(行标x 总列数 +列标),这样就更一般了。这条公式是我们先前讨论过的,View面版选MyDlg类,右击选插入函数,函数返回值填int , 函数声明Mycell(int m_iRow,int m_iCol)成了,,现在写代码:
///////////////////////////////////////
Int MyDlg:: Mycell(int m_iRow,int m_iCol)
{
int i;
i=m_ctlMygrid.GetCols(); //获得当前总列数。
return m_iRow*i+m_iCol ;
}
////////////////////////////////////////////////////////////////////////
l 接下来书上创建了一个函数,把随即数填入表格。
这里主要是一个SetTextArray(单元格,值)函数的运用。
如:
m_ctlMygrid.SetTextArray(7,”baby”),这样就向7号单元格填入了baby字样。
这里相信好理解。
l 获得当前单元格
打开精灵class winzard,选IDC_MYGRID,消息选Click.然后填加函数
代码如下:
////////////////////////////////////////////////////////////////////////
int i,j;
i=m_ctlMygrid.GetMouseRow ;
j=m_ctlMygrid_GetMouseCol;
Mycell(i,j );
///////////////////////////////////////////////////////////////////////
l 接着还有个排序的。这个还是控件属性那里直接设置好了。累了,假如人不用睡觉就好了。