共用方式為


MFC ActiveX 控制項:子類別化 Windows 控制項

本文說明子類別化通用 Windows 控制流程建立 ActiveX 控制項。 子類別化現有 Windows 控制項能夠快速開發 ActiveX 控制項。 新的控制項會有子視窗控制項的能力,例如繪製和回應滑鼠點選動作。 MFC ActiveX 控制項範例是 按鈕 主要視窗控制項的範例。

對的子類別 Windows 控制項,完成下列工作:

  • 覆寫 COleControl 的 IsSubclassedControl 和 PreCreateWindow 成員函式

  • 修改 OnDraw 成員函式

  • 處理所有 ActiveX 控制項的訊息 (OCM) 會反映控制項

    注意事項注意事項

    使用在 Control Settings 頁面,,的 Select Parent Window Class 下拉式清單中,如果您選取控制項子類別化這個工作為您完成由 ActiveX 控制項精靈。

請參閱知識庫 (Knowledge Base) Q243454 有關子類別化控制項的詳細資訊。

覆寫 IsSubclassedControl 和 PreCreateWindow

若要覆寫 PreCreateWindowIsSubclassedControl,將下列程式碼加入至控制項類別宣告的 protected 區段:

  virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    BOOL IsSubclassedControl();

在控制項實作檔 (.CPP) 中,加入下列程式碼會實作兩個覆寫的函式:

// CMyAxSubCtrl::PreCreateWindow - Modify parameters for CreateWindowEx

BOOL CMyAxSubCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.lpszClass = _T("BUTTON");
    return COleControl::PreCreateWindow(cs);
}

// CMyAxSubCtrl::IsSubclassedControl - This is a subclassed control

BOOL CMyAxSubCtrl::IsSubclassedControl()
{
    return TRUE;
}

請注意,在此範例中, Windows 按鈕控制項在 PreCreateWindow所指定。 不過,所有標準 Windows 控制項子類別化。 如需標準 Windows 控制項的詳細資訊,請參閱 控制項

當子類別化 Windows 控制項,您可能會想要指定特定視窗樣式時 (WS_) 或延伸視窗樣式 (WS_EX_) 旗標用於建立主控視窗。 您可以修改 cs.stylecs.dwExStyle 結構欄位可以這些參數的值在 PreCreateWindow 成員函式。 應使用 OR 作業,這些欄位的修改,保存由類別 COleControl設定的預設旗標。 例如,在中,如果控制項子類別化按鈕控制項,而且想要控制項顯示為核取方塊,請將下列程式碼插入至 CSampleCtrl::PreCreateWindow的實作,在 return 陳述式之前:

cs.style |= BS_CHECKBOX;

此作業將 BS_CHECKBOX 樣式旗標,,讓預設樣式旗標 (WS_CHILD) 類別 COleControl 不變。

修改 OnDraw 成員函式

如果您希望子類別化控制項保留與對應的 Windows 控制項,控制項的 OnDraw 成員函式應該只包含呼叫 DoSuperclassPaint 成員函式的外觀,如下列範例所示:

void CMyAxSubCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
    if (!pdc)
        return;

    DoSuperclassPaint(pdc, rcBounds);
}

DoSuperclassPaint 成員函式,實作 COleControl,以指定之裝置內容的 Windows 控制項的視窗程序繪製控制項,在周框之內。 即使不是作用中,這樣可讓控制項成為可見。

注意事項注意事項

DoSuperclassPaint 成員函式只會啟用裝置內容以 WM_PAINT 訊息的 wParam 的控制項型別一起使用。這包括一些標準 Windows 控制項,例如 SCROLLBARBUTTON和所有通用控制項。對於不支援這個行為的控制項,您必須提供自己的程式碼正確顯示非現用控制項。

處理反映的 Windows 訊息。

視窗控制項通常會將某些視窗訊息傳送給其父視窗。 這些訊息,例如 WM_COMMAND,由使用者提供動作的通知。 其他選項,例如 WM_CTLCOLOR,用來取得父視窗的資訊。 ActiveX 控制項與父視窗通常通訊透過其他方法。 通知由引發事件傳送 (傳送事件通知),以及控制項容器的資訊可以存取容器的環境屬性取得。 由於這些通訊技術存在, ActiveX 控制項容器不會處理控制項所傳送的任何視窗訊息。

若要防止容器接收子視窗控制項傳送 Windows 訊息, COleControl 建立額外的視窗做為控制項的父代。 這個額外的視窗,稱為「反映程式」,為的子類別視窗控制項的 ActiveX 控制項只會有相同的大小和位置與視窗控制項。 反映程式視窗攔截特定 Windows 訊息並將其加入至控制項。 控制項,在其視窗程序,可以採取動作然後處理這些反映訊息適用於 ActiveX 控制項 (例如,引發事件)。 為已攔截視窗訊息及其對應的反映訊息清單參閱 要反映的 Windows 訊息 ID

ActiveX 控制項容器可能會執行訊息反映,不需要 COleControl 建立反映程式視窗和減少子視窗控制項的執行階段的額外負荷。 COleControl 偵測容器是否可以核取支援這項功能 MessageReflect 環境屬性與 TRUE的值。

處理反映的 Windows 訊息,將項目加入至控制項資訊對應和實作處理函式。 由於反映訊息不是標準的部分 Windows 定義的訊息,類別檢視不支援將這類訊息處理常式。 不過,手動加入處理常式不困難。

若要將反映的 Windows 訊息的訊息處理常式手動執行下列動作:

  • 在控制項類別。.H 檔案,宣告處理常式函式。 函式應該具有 LRESULT 和兩個參數的傳回型別,而型別分別為 WPARAMLPARAM。 例如:

    class CMyAxSubCtrl : public COleControl
    {
    
    
    ...
    
    
    protected:
        LRESULT OnOcmCommand(WPARAM wParam, LPARAM lParam);
    };
    
  • 在控制項類別 .CPP 檔案,請將 ON_MESSAGE 項目加入至訊息對應。 這個輸入參數應該是訊息識別項和處理常式函式的名稱。 例如:

    BEGIN_MESSAGE_MAP(CMyAxSubCtrl, COleControl)
        ON_MESSAGE(OCM_COMMAND, &CMyAxSubCtrl::OnOcmCommand)
    END_MESSAGE_MAP()
    
  • 因此在 .CPP 檔案,請實作 OnOcmCommand 成員函式處理反映訊息。 wParamlParam 參數與原始的 Windows 訊息。

如需範例的反映訊息如何管理,請參閱 MFC ActiveX 控制項範例 按鈕。 它會偵測 BN_CLICKED 通知程式碼並透過引發的 OnOcmCommand 處理常式 (傳送) 回應點擊事件。

請參閱

概念

MFC ActiveX 控制項