那么这回就来看一下网上说的挺多的传递自定义结构的问题吧,这个问题在早期不支持DCOM的操作系统中是没办法解决的,不过就目前的流行操作系统来说,应该是不成问题的。
其实网上讨论很多的,不过还是推荐一些网址:
第一个是微软的msdn,应该蛮正宗的吧,
第二个是我偶尔看到的,在csdn上,感觉蛮不错的,中文的嘛,呵呵
http://dev.csdn.net/article/67/67955.shtm其它的稀奇古怪的就不说了,各位可以自己网上搜搜,一大把的
那咱就照着这些资料开始我们自己的自定义结构的传递了,我们要定义的结构是RECT,用来确定Cell的尺寸位置,在VC中已经有了结构RECT,但是VB中却没有,没关系,我们自己给它定义一个。
1.打开LiteGrid.odl文件,在ICell接口的定义前面(其它位置也没关系)加上
typedef [ uuid(6BF5EE0C-373A-4893-89EB-2C0208D3D4EB) ]
struct tagtRECT
{
long left;
long top;
long right;
long bottom;
}Rect;
UUID用GUID生成工具生成,就不多说了了,以后也不说了
这里本来用tagRECT的,结果居然提示说有重复定义,同样也没用RECT,而用Rect了。
2.为CCell添加成员变量CRect m_rect;在构造函数中初始化为{0,0,0,0}
3.为CCell添加Get/Set属性Rect,类型为VARIANT
4.在LiteGrid.odl中,将该属性的类型VARIANT改为Rect
5.Get/Set函数定义如下:
void CCell::SetRect(const VARIANT FAR& newValue)
{
// TODO: Add your property handler here
COleVariant ar(newValue);
if(ar.vt == VT_RECORD){
IRecordInfo* pri = ar.pRecInfo;
pri->RecordCopy(ar.pvRecord, (PVOID)&m_rect);
}
}
VARIANT CCell::GetRect()
{
VARIANT vaResult;
VariantInit(&vaResult);
// TODO: Add your property handler here
IRecordInfo* pRecInfo = NULL;
GetRecordInfoFromGuids(GUID_Lib, 1, 0, LOCALE_USER_DEFAULT, GUID_Rect, &pRecInfo);
vaResult.vt = VT_RECORD;
vaResult.pvRecord = (PVOID)&m_rect;
vaResult.pRecInfo = pRecInfo;
return vaResult;
}
6.编译通过
7.新建VB工程,添加LiteGrid控件,在Form_Load中添加代码如下:
Dim rc As Rect
Dim rc1 As Rect
Dim ce As Cell
Set ce = LiteGrid1.Cell(0, 0)
If Not ce Is Nothing Then
rc = ce.Rect
ce.Rect.Left = 100
rc = ce.Rect
rc.Left = 10
rc.Top = 29
rc.Right = 12
rc.bottom = 439
ce.Rect = rc
rc1 = ce.Rect
End If
运行观察一下几次rc和rc1的值,可以发现结果完全正确
OK,搞定
但是,不知道什么原因,从控件调试环境运行时,却发现以上代码调试出错,只保留rc = ce.Rect或只保留ce.Rect = rc代码时却不会出错,不知何原因,郁闷。
另外,对于GetRect中的pRecordInfo,不知是否需要Release,有待确定。
嘿嘿,咱不管了,懒得弄了,继续旅程了。
阅读(1275) | 评论(0) | 转发(0) |