程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> vc++技術內幕(第四版)筆記(第8章)

vc++技術內幕(第四版)筆記(第8章)

編輯:vc教程

第八章:使用ActiveX控件

1,ActiveX控件是一個直接插入到C++程序中的軟件模塊,以前常稱OLE控件(OCX),是基於MS-COM技術。

2,ActiveX控件與普通Windows控件比較:

相同點:ActiveX控件也可看成是一個子窗口(可以看成這樣的)。

如果想在對話框上加入ActiveX控件,則只要在對話框編輯器中,把ActiveX控件放在適當的位置上,並在資源模板中標識該控件。如果要在運行的過程中建立ActiveX控件,則可以調用響應控件類的Create成員函數,而且通常在父窗口的WM_CREATE消息控制函數中調用。

不同點:屬性和方法。

ActiveX控件不像普通控件那樣發送以WM_打頭的通知消息給它的包容器窗口,而是激發事件。事件實際上是由控件調用包容器函數。像普通的控件通知消息一樣,事件並沒有返回值傳給ActiveX控件。事件如lick,KeyDown。但對於客戶來說時間與控件的通知消息是一樣的。

3,在MFC庫中,ActiveX控件就像子窗口一樣,但在控件窗口和包容器窗口之間有一層重要代碼。實際上,ActiveX控件可能沒有窗口。當調用Create函數時,並不是直接建立控件窗口,而是把控件代碼載入進來,並激發一個“實地激活”(in-place activation)命令。然後ActiveX控件再建立它自己的窗口,通過MFC的CWnd類指針我們可以訪問該窗口。不過客戶程序最好不要使用ActiveX控件的hWnd句柄。

4,通常ActiveX控件會保存在擴展名為OCX的動態連接庫中。包容器程序回根據Windows注冊表利用COM技術在需要的時候裝入動態連接庫。

說明:

1)暫時可以這樣認為,如果使用了ActiveX控件,那麼在運行時候要裝入該ActiveX控件代碼。顯然在發布含有ActiveX控件的程序時候,必須要包含相應的OCX文件,而且還得提供一個合適的安裝程序。

5,安裝ActiveX控件:

1)把找到的ActiveX控件動態連接庫拷到硬盤上。

2)在Windows注冊表中登記注冊。(可使用Regsvr32命令行命令)

3)在使用該控件的項目中安裝該控件。(選擇Project菜單,再選擇Add To Project,再選擇Components And Controls,再選擇Registered ActiveX Controls,這時列表框列出系統已經注冊所有的ActiveX控件,選擇需要的控件INSERT即可。)

6,ActiveX控件包容器編程:

1)不管ActiveX控件是作為對話框控件,還是做為“子窗口”,MFC和ClassWizard都支持。

2)ActiveX控件編寫者設計了ActiveX控件屬性供使用者在設計時訪問。所有的ActiveX控件屬性(包括設計時屬性),在運行時都是可以訪問的,不過有些屬性可能被設計成只讀的。

3)當在項目中插入ActiveX控件時,ClassWizard就會產生相應的CWnd的派生類C++類,來滿足對空間的方法和屬性進行訪問要求。控件的屬性和方法都有相應的成員函數,同時生成的類還有一個構造函數可用以動態創建ActiveX控件的事例。

4)當在項目中插入ActiveX控件ClassWizard生成的CWnd的派生類C++類中,可以看到其成員函數的代碼中都有對InvokeHelper函數的調用,InvokeHelper函數的第一個參數都和對應的屬性或方法在ActiveX控件中的分發(dispatch)ID(標識ActiveX控件的方法或屬性的)相對應。通過查看ActiveX控件hlp文件可以發現,ActiveX控件的方法在生存的C++類中都有同名的成員函數與之對應,ActiveX控件的屬性都有一組Get和Set函數對其操作,其中ActiveX控件的方法和屬性操作與生成的C++類成員函數相關聯都是通過InvokeHelper函數的調用來完成的,InvokeHelper函數的第一個參數是由Component Gallery(控件提供者)提供的。因為經過這樣的處理,所以我們如果要調用ActiveX控件的方法或對其屬性進行取和設置操作,只需調用生成的C++類對應的成員函數便可。
下面對InvokeHelper單獨說明:

CWnd::InvokeHelper
void InvokeHelper( DISPID dwDispID, Word wFlags, VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, ... );

說明:

Call this member function to invoke the OLE control method or property specified by dwDispID, in the context specifIEd by wFlags.
其中參數:
dwDispID:
//Identifies the method or property to be invoked. This value is usually supplIEd by Component Gallery.

wFlags:可以為下面些值,指明調用InvokeHelper的目的。

//[ DISPATCH_METHOD ]   The member is invoked as a method. If a property has the same name, both this and the DISPATCH_PROPERTYGET flag may be set.
[ DISPATCH_PROPERTYGET ] The member is retrIEved as a property or data member.
[ DISPATCH_PROPERTYPUT ] The member is changed as a property or data member.
[ DISPATCH_PROPERTYPUTREF ] The member is changed by a reference assignment, rather than a value assignment. This flag is valid only when the property accepts a reference to an object.

vtRet:
//SpecifIEs the type of the return value.
VT_EMPTY  void
VT_I2  short
VT_I4  long
VT_R4  float
VT_R8  double
VT_CY  CY
VT_DATE  DATE
VT_BSTR  BSTR
VT_DISPATCH  LPDI

[1] [2] [3] [4] 下一頁

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved