Chinaunix首页 | 论坛 | 博客
  • 博客访问: 185777
  • 博文数量: 90
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2017-08-23 16:48
文章分类

全部博文(90)

文章存档

2015年(1)

2011年(21)

2010年(59)

2009年(9)

我的朋友

分类: C/C++

2010-07-14 09:50:43

那么这回就来看一下网上说的挺多的传递自定义结构的问题吧,这个问题在早期不支持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,有待确定。
嘿嘿,咱不管了,懒得弄了,继续旅程了。

 
阅读(1242) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~