ActiveX控制項的MFC設計之旅-第4步

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.