共用方式為


MFC ActiveX 控制項:進階主題

本文涵蓋與開發 ActiveX 控制項相關的進階主題。 包括:

重要

ActiveX 是不應該用於新開發的舊版技術。 如需取代 ActiveX 的新式技術詳細資訊,請參閱 ActiveX 控制項

在 ActiveX 控制項中使用資料庫類別

因為 ActiveX 控制項類別是類別庫的一部分,因此您可以在標準 MFC 應用程式中套用相同的程式和規則,以開發使用 MFC 資料庫類別的 ActiveX 控制項。

如需 MFC 資料庫類別的一般概觀,請參閱 MFC 資料庫類別(DAO 和 ODBC)。 本文同時介紹 MFC ODBC 類別和 MFC DAO 類別,並引導您進一步瞭解這兩者的詳細資料。

注意

DAO 可透過 Office 2013 支援。 DAO 3.6 是最終版本,而且被視為過時。 Visual C++ 環境和精靈不支援 DAO(雖然包含 DAO 類別,但您仍然可以使用這些類別)。 Microsoft 建議您針對新專案使用 OLE DB 範本 ODBC 和 MFC 。 您應該只使用 DAO 來維護現有的應用程式。

實作參數化屬性

參數化屬性(有時稱為屬性陣列)是一種方法,可將值的同質集合公開為控制項的單一屬性。 例如,您可以使用參數化屬性來公開陣列或字典做為屬性。 在 Visual Basic 中,這類屬性是使用陣列標記法來存取:

x = o.Array(2, 3) ' gets element of 2D array
o.Array(2, 3) = 7 ' sets element of 2D array

使用 [新增屬性精靈] 來實作參數化屬性。 [新增屬性精靈] 會藉由新增一組 Get/Set 函式來實作 屬性,以允許控制項使用者使用上述標記法或標準方式存取屬性。

與方法和屬性類似,參數化屬性也有允許的參數數目限制。 在參數化屬性的情況下,限制為 15 個參數(保留一個參數來儲存屬性值)。

下列程式會新增稱為 Array 的參數化屬性,這個屬性可以存取為整數的二維陣列。

使用 [新增屬性精靈] 新增參數化屬性

  1. 載入控制項專案。

  2. 在 [類別檢視] 中,展開控制項的程式庫節點。

  3. 在控制項的介面節點 (程式庫節點的第二個節點) 上按一下滑鼠右鍵,開啟捷徑功能表。

  4. 從快捷方式功能表中,按一下 [新增 ],然後按一下 [ 新增屬性 ]。

  5. 在 [ 屬性名稱] 方塊中,輸入 Array

  6. 在 [ 屬性類型] 方塊中,選取 short

  7. 在 [實作類型] 中,按一下 [Get/Set 方法]

  8. 在 [ 取得函式和設定函 式] 方塊中,輸入 Get 和 Set Functions 的唯一名稱,或接受預設名稱。

  9. 使用 [參數名稱 ] 和 [ 參數類型 ] 控制項,新增名為 row 的參數(類型 short )。

  10. 新增名為 column 的第二個參數 (type short )。

  11. 按一下完成

新增屬性精靈所做的變更

當您新增自訂屬性時,[新增屬性精靈] 會變更控制項類別標頭 (。H) 和實作 (.CPP) 檔案。

下列幾行會新增至控制項類別 。H 檔案:

SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);

此程式碼會宣告兩個呼叫 GetArray 的函式,並 SetArray 允許使用者在存取 屬性時要求特定資料列和資料行。

此外,[新增屬性精靈] 會將下列幾行新增至控制項分派對應,其位於控制項類別實作中(。CPP) 檔案:

DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)

最後,和 SetArray 函式的 GetArray 實作會新增至 的結尾。CPP 檔案。 在大部分情況下,您將修改 Get 函式以傳回 屬性的值。 Set 函式通常會包含應該在屬性變更之前或之後執行的程式碼。

若要讓這個屬性很有用,您可以在 類型的 short 控制項類別中宣告二維陣列成員變數,以儲存參數化屬性的值。 然後,您可以修改 Get 函式以傳回儲存在適當資料列和資料行的值,如參數所指示,並修改 Set 函式以更新資料列和資料行參數所參考的值。

處理 ActiveX 控制項中的錯誤

如果控制項發生錯誤狀況,您可能需要向控制項容器報告錯誤。 報告錯誤的方法有兩種,視發生錯誤的情況而定。 如果錯誤發生在屬性的 Get 或 Set 函式內,或在 OLE Automation 方法的實作內,控制項應該呼叫 COleControl::ThrowError ,這會向控制項使用者發出錯誤訊號。 如果錯誤發生在任何其他時間,控制項應該呼叫 COleControl::FireError ,這會引發庫存錯誤事件。

若要指出發生的錯誤種類,控制項必須將錯誤碼傳遞至 ThrowErrorFireError 。 錯誤碼是 OLE 狀態碼,其值為 32 位。 可能的話,請從 OLECTL 中定義的一組標準程式碼中選擇錯誤碼。H 標頭檔。 下表摘要說明這些程式碼。

ActiveX 控制項錯誤碼

錯誤 描述
CTL_E_ILLEGALFUNCTIONCALL 不合法的函式呼叫
CTL_E_OVERFLOW Overflow
CTL_E_OUTOFMEMORY 記憶體不足
CTL_E_DIVISIONBYZERO 除以零
CTL_E_OUTOFSTRINGSPACE 字串空間用盡
CTL_E_OUTOFSTACKSPACE 堆疊空間用盡
CTL_E_BADFILENAMEORNUMBER 不正確的檔名或數目
CTL_E_FILENOTFOUND 找不到檔案
CTL_E_BADFILEMODE 不正確的檔案模式
CTL_E_FILEALREADYOPEN 檔案已經開啟
CTL_E_DEVICEIOERROR 裝置 I/O 錯誤
CTL_E_FILEALREADYEXISTS 檔案已經存在
CTL_E_BADRECORDLENGTH 不正確的資料錄長度
CTL_E_DISKFULL 磁碟已滿
CTL_E_BADRECORDNUMBER 不正確的資料錄數目
CTL_E_BADFILENAME 不正確的檔案名
CTL_E_TOOMANYFILES 檔案太多
CTL_E_DEVICEUNAVAILABLE 裝置無法使用
CTL_E_PERMISSIONDENIED 權限遭拒
CTL_E_DISKNOTREADY 磁碟未就緒
CTL_E_PATHFILEACCESSERROR 路徑/檔案存取錯誤
CTL_E_PATHNOTFOUND 找不到路徑
CTL_E_INVALIDPATTERNSTRING 無效的模式字串
CTL_E_INVALIDUSEOFNull Null 的使用無效
CTL_E_INVALIDFILEFORMAT 不正確檔案格式
CTL_E_INVALIDPROPERTYVALUE 不正確屬性值
CTL_E_INVALIDPROPERTYARRAYINDEX 不正確屬性陣列索引
CTL_E_SETNOTSUPPORTEDATRUNTIME 在執行階段不支援 Set
CTL_E_SETNOTSUPPORTED 不支援 Set (唯讀屬性)
CTL_E_NEEDPROPERTYARRAYINDEX 須提供屬性陣列索引
CTL_E_SETNOTPERMITTED 不允許使用 Set
CTL_E_GETNOTSUPPORTEDATRUNTIME 在執行階段不支援 Get
CTL_E_GETNOTSUPPORTED 不支援 Get (唯寫屬性)
CTL_E_PROPERTYNOTFOUND 找不到屬性
CTL_E_INVALIDCLIPBOARDFORMAT 不正確剪貼簿格式
CTL_E_INVALIDPICTURE 不正確圖片
CTL_E_PRINTERERROR 圖片錯誤
CTL_E_CANTSAVEFILETOTEMP 無法將檔案儲存至 TEMP
CTL_E_SEARCHTEXTNOTFOUND 找不到搜尋文字
CTL_E_REPLACEMENTSTOOLONG 取代文字太長

如有必要,請使用 CUSTOM_CTL_SCODE 宏,為其中一個標準代碼未涵蓋的條件定義自訂錯誤碼。 這個宏的參數應該是介於 1000 到 32767 之間的整數,包含 。 例如:

#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)

如果您要建立 ActiveX 控制項來取代現有的 VBX 控制項,請使用 VBX 控制項所使用的相同數值來定義您的 ActiveX 控制項錯誤碼,以確保錯誤碼相容。

處理控制項中的特殊索引鍵

在某些情況下,您可能會想要以特殊方式處理特定擊鍵組合:例如,在多行文字方塊控制項中按下 ENTER 鍵時插入新行,或在按下方向鍵識別碼時在編輯控制項群組之間移動。

如果 ActiveX 控制項的基類為 COleControl ,您可以在容器處理訊息之前覆寫 CWnd::P reTranslateMessage 來處理訊息。 使用這項技術時,如果您處理 覆寫 PreTranslateMessage 中的訊息,請一律傳回 TRUE

下列程式碼範例示範處理與方向索引鍵相關的任何訊息的可能方式。

BOOL CMyAxUICtrl::PreTranslateMessage(MSG* pMsg)
{
   BOOL bHandleNow = FALSE;

   switch (pMsg->message)
   {
   case WM_KEYDOWN:
      switch (pMsg->wParam)
      {
      case VK_UP:
      case VK_DOWN:
      case VK_LEFT:
      case VK_RIGHT:
         bHandleNow = TRUE;
         break;
      }
      if (bHandleNow)
      {
         OnKeyDown((UINT)pMsg->wParam, LOWORD(pMsg->lParam), HIWORD(pMsg->lParam));
      }
      break;
   }
   return bHandleNow;
}

如需處理 ActiveX 控制項鍵盤介面的詳細資訊,請參閱 ActiveX SDK 檔。

存取執行時間看不見的對話方塊控制項

您可以建立沒有使用者介面且在執行時間看不見的對話控制項。 如果您在執行時間 ActiveX 控制項中新增不可見的對話方塊,並使用 CWnd::GetDlgItem 來存取控制項,控制項將無法正常運作。 相反地,您應該使用下列其中一種技術來取得代表 控制項的物件:

  • 使用 [新增成員變數精靈],選取 [ 控制項變數 ],然後選取控制項的識別碼。 輸入成員變數名稱,然後選取控制項的包裝函式類別作為 控制項類型

    -或-

  • 將區域變數和子類別宣告為對話方塊專案。 插入類似下列的程式碼( CMyCtrl 是包裝函式類別,IDC_MYCTRL1是控制項的識別碼):

    CCirc myCirc;
    myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this);
    // ... use myCirc ...
    myCirc.UnsubclassWindow();
    

另請參閱

MFC ActiveX 控制項