MFC ActiveX 控制項: 子類別化 Windows 控制項
這份文件說明一般的 Windows 控制項來建立 ActiveX 控制項子類別化的程序。子類別化現有的 Windows 控制項為開發 ActiveX 控制項時的快速方法。新控制項會有子類別化 Windows 控制項,例如繪製和回應滑鼠按鍵動作的能力。MFC ActiveX 控制範例按鈕是子類別化 Windows 控制項的範例。
若要子類別化 Windows 控制項,請完成下列工作:
覆寫 COleControl IsSubclassedControl 和 PreCreateWindow 成員函的式
修改 OnDraw 成員函式
處理的控制項反映任何 ActiveX 控制訊息 (OCM)
注意事項
這項工作大部分都為您完成由 ActiveX 控制項精靈如果您選取要使用子類別控制項選取父視窗類別 下拉式選單上的 控制設定頁面。
在子類別化控制項,請參閱知識庫文件編號 Q243454 如需詳細資訊。
覆寫 IsSubclassedControl 及 PreCreateWindow
若要覆寫PreCreateWindow和IsSubclassedControl,加入下列幾行程式碼必須以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;
}
請注意,在這個範例中,[視窗按鈕控制項中指定PreCreateWindow。不過,任何標準的 Windows 控制項可以是子類別化。如需有關標準 Windows 控制項的詳細資訊,請參閱控制項。
子類別化 Windows 控制項,您可能想要指定特殊的視窗樣式 (WS_) 或延伸視窗樣式 (WS_EX_) 旗標,以供建立控制項的視窗。您可以設定中的這些參數的值PreCreateWindow成員函式,藉由修改 cs.style 和 cs.dwExStyle 結構欄位。修改這些欄位應使用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成員函式只會使用這些控制項型別,可讓裝置內容,以傳遞做為 wParam 的WM_PAINT訊息。這包含一些標準 Windows 控制項,例如捲軸 和 按鈕,以及所有常用的控制項。對於不支援這個行為的控制項,您必須提供自己的程式碼,以便適當地顯示非作用中的控制項。 |
處理反映視窗訊息
Windows 控制項通常會將特定視窗訊息傳送給其父視窗。其中幾個訊息,例如 WM_COMMAND,提供使用者動作的告知。其他人,例如WM_CTLCOLOR,用來從父視窗中取得資訊。ActiveX 控制項通常是與父視窗通訊,以其他方式。通知藉由引發事件 (傳送事件告知) 溝通,並藉由存取容器的環境屬性取得控制項容器的相關資訊。因為有這些通訊方式,ActiveX 控制項容器便不需要處理任何控制項所傳送的視窗訊息。
若要防止容器接收由子類別化 Windows 控制項,傳送的視窗訊息COleControl建立額外的視窗,以做為控制項的父代。這個額外的視窗,稱為"反映程式 」,會建立只對非 ActiveX 控制項子類別的視窗控制,以及 [控制] 視窗會有相同的大小和位置。反映體視窗攔截特定視窗訊息,並將它們傳送回該控制項。該控制項,在這個視窗程序,然後可以藉由採取動作 (例如,引發事件) 的 ActiveX 控制項的適當處理這些反映的訊息。請參閱反映視窗訊息 Id 為一系列被攔截的 windows 訊息,以及其對應反映訊息。
ActiveX 控制項容器可能會用來執行訊息反映本身,不需要的COleControl來建立反映體視窗,並減少額外負荷的子類別化 Windows 控制項的執行時間。COleControl偵測到容器是否支援這項功能,藉由檢查 MessageReflect 環境的屬性,且其值為 ,則為 TRUE。
若要處理一個反映的視窗訊息,加入控制項的訊息對應項目,並實作處理常式函式。因為反映的訊息不是一組標準的 Windows 所定義的訊息的一部分,[類別檢視不支援加入這類訊息處理常式。不過,它並不難手動加入的處理常式。
若要新增一個反映的視窗訊息的訊息處理常式以手動方式執行下列作業:
在控制項類別。H 檔案中,宣告處理函式。函式應該有的傳回型別 LRESULT 和兩個參數,與型別 WPARAM 和 LPARAM,分別。例如:
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 成員函式來處理反映的訊息。WParam 和 lParam 參數都是一樣的原始視窗訊息。
請參閱 MFC ActiveX 控制項範例將示範如何反映訊息處理,如按鈕。它示範了 OnOcmCommand 會偵測到的處理常式 BN_CLICKED 告知程式碼和開火的回應 (傳送) 一個 Click 事件。