提供無視窗啟動
視窗建立程式碼 (也就是一切,這種狀況,當您呼叫一個功能是) 是高成本,來執行。 維護控制項來管理視窗的訊息] 視窗中包含的螢幕上。 無視窗控制項要因此較快,有視窗的控制項。
無視窗控制項的一個好處是,不像視窗型控制項,無視窗控制項支援透明繪製以及非矩形的螢幕區域。 透明的常見例子是控制項的具有透明背景的文字控制項。 讓文字樣式] 下項目,即會顯示穿過控制項來繪製文字,但不是背景。 使用非矩形的控制項,例如箭頭及圓形按鈕,通常進行較新的表單。
通常,控制項就不需要自己的視窗,就相反地,可以使用它的容器的視窗服務容器寫入以支援無視窗物件。 無視窗控制項都有較舊的容器的向下相容。 較舊的容器,未寫入用於支援無視窗控制項,無視窗控制項時建立視窗使用中。
由於無視窗控制項不會有它們自己的視窗,容器 (它們不會有一個視窗) 負責提供會否則廠商提供的控制項本身視窗的服務。 比方說,如果您的控制項,需要立即鍵盤焦點、 捕捉滑鼠,或是取得裝置內容,這些作業是由容器所管理。 容器將路由傳送到它的視窗,以適當的無視窗控制項的使用者輸入的訊息使用IOleInPlaceObjectWindowless介面。 (請參閱 ActiveX SDK 如需這個介面的描述。)COleControl成員函式叫用這些服務與容器。
若要讓您使用無視窗啟動的控制項,包括 windowlessActivate 旗標所傳回的集合中的旗標 COleControl::GetControlFlags。 例如:
DWORD CMyAxOptCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
...
// The control can activate without creating a window.
dwFlags |= windowlessActivate;
...
return dwFlags;
}
如果您選取 [自動產生程式碼中包含這個旗標無視窗啟動 選項在 控制設定 MFC ActiveX 控制項精靈] 頁面。
啟用無視窗啟動時,容器會委派至控制項的輸入的訊息IOleInPlaceObjectWindowless介面。 COleControl這個介面的實作會分派到您的控制項的訊息對應的訊息之後會適當地調整滑鼠座標。 您可以藉由加入對應的項目加入訊息對應來處理一般視窗訊息的訊息。 在這些訊息的處理常式,請避免使用m_hWnd成員變數 (或任何使用它的成員函式) 不需事先查看它的值不 NULL。
COleControl提供成員函式叫用滑鼠捕捉、 鍵盤焦點、 向下捲動,並適當地容器中的其他視窗服務包括:
在無視窗控制項中,您一定要使用COleControl成員函式,而不是相對應的CWnd成員函式或其相關的 Win32 API 函式。
您可以在無視窗控制項成為 OLE 拖放作業的目標。 通常,這會要求控制項的視窗會註冊為置放目標。 因為控制項都不有其本身的任何視窗,容器會使用自己的視窗做為置放目標。 此控制項也提供的實作IDropTarget介面的容器可以將委派呼叫的適當時機。 若要公開 (expose) 這個容器的介面,覆寫 COleControl::GetWindowlessDropTarget。 例如:
IDropTarget* CMyAxOptCtrl::GetWindowlessDropTarget()
{
m_DropTarget.m_xDropTarget.AddRef();
return &m_DropTarget.m_xDropTarget;
}