ActiveX控件的MFC设计之旅-第4步

    技术2022-05-11  120

    那么这回就来看一下网上说的挺多的传递自定义结构的问题吧,这个问题在早期不支持DCOM的操作系统中是没办法解决的,不过就目前的流行操作系统来说,应该是不成问题的。 其实网上讨论很多的,不过还是推荐一些网址: 第一个是微软的msdn,应该蛮正宗的吧,http://windowssdk.msdn.microsoft.com/library/default.asp?url=/library/en-us/Automat/htm/chap12_3rcj.asp 第二个是我偶尔看到的,在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,有待确定。 嘿嘿,咱不管了,懒得弄了,继续旅程了。

    最新回复(0)