那麼這回就來看一下網上說的挺多的傳遞自訂結構的問題吧,這個問題在早期不支援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,有待確定。
嘿嘿,咱不管了,懶得弄了,繼續旅程了。