MFC ActiveX 控制項: 繪製 ActiveX 控制項
本文將告訴您 ActiveX 控制項繪製過程以及如何更改繪製程式碼來最佳化這個過程。 (請參閱最佳化控制項繪圖的技術如何來最佳化繪圖不需要個別控制項還原先前所選取的 GDI 物件。 所有控制項都已繪製之後,容器可自動將還原原始的物件。)
這份文件中的範例是以預設設定 MFC ActiveX 控制項精靈所建立的控制項。 如需有關如何建立使用 MFC ActiveX 控制項精靈控制項的基本架構應用程式的詳細資訊,請參閱下面的文件 MFC ActiveX 控制項精靈。
涵蓋下列主題:
繪製控制項及其支援繪製 ActiveX 控制項精靈所建立的程式碼的整體程序
如何將繪製過程最佳化
如何繪製控制項使用中繼檔
ActiveX 控制項的繪製過程
它們時 ActiveX 控制項一開始顯示,或重畫,請依照類似於其他重要的區別在於使用 MFC 開發的應用程式的繪製過程: ActiveX 控制項可以處於使用中或非現用狀態。
作用中的控制項都會在子視窗由 ActiveX 控制項容器。 就像其他視窗,它會負責繪製其本身時WM_PAINT接收訊息。 控制項的基底類別, COleControl,在此訊息的處理其OnPaint函式。 這個預設實作會呼叫OnDraw控制項的函式。
會以不同的方式繪製非作用中的控制項。 當控制項是非作用中時,它的視窗是不可見或不存在,所以無法接收繪製訊息。 相反地,控制項容器會直接呼叫OnDraw控制項的函式。 這點不同於作用中的控制項繪製過程中, OnPaint永遠不會呼叫成員函式。
如同上一段所討論,ActiveX 控制項的更新方式而定的控制項狀態。 不過,因為架構會呼叫OnDraw成員函式在這兩種情況下,您可以將大部份的繪製程式碼在這個成員函式。
OnDraw成員函式會處理控制項繪製。 當控制項是非作用中時,控制項容器會呼叫OnDraw,傳遞控制項容器的裝置內容和控制項所佔矩形區域的座標。
由框架的矩形傳遞OnDraw成員函式包含控制項所佔的區域。 如果控制項是非作用中,左上角會是 (0,0),所傳遞的裝置內容是給包含控制項的子視窗。 如果控制項是非作用中,左上角座標不一定是 (0,0),所傳遞的裝置內容是給包含控制項的控制項容器。
![]() |
---|
請務必,若要做的修改OnDraw 不依賴該矩形的左上角 ondraw 等於 (0,0),而且只在矩形內繪製傳遞給OnDraw。如果您繪製超出矩形區域,可能會發生未預期的結果。 |
在控制項實作檔 MFC ActiveX 控制項精靈所提供的預設實作 (。CPP) 裡,顯示下面,會是有白色的筆刷矩形繪製,並使用目前的背景色彩填滿橢圓形。
void CMyAxUICtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
// TODO: Replace the following code with your own drawing code.
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
pdc->Ellipse(rcBounds);
}
![]() |
---|
當繪製控制項,您應該提出任何假設傳遞做為裝置內容的狀態 pdc 參數,以OnDraw函式。有時裝置內容由容器應用程式所提供,就不一定會初始化為預設狀態。特別是,明確選取的畫筆、 筆刷、 色彩、 字型和您的繪圖程式碼所需的其他資源。 |
最佳化您的 [小畫家] 程式碼
在控制項成功繪製其本身之後下, 一個步驟是最佳化OnDraw函式。
繪製的 ActiveX 控制項的預設實作會繪製整個控制項區域。 這是足以應付簡單的控制項,但在許多情況下重繪控制項就會快如果只需更新的部分重新繪製,而非整個控制項。
OnDraw函式提供簡便的最佳化方法,藉由傳遞rcInvalid,需要重繪控制項的矩形區域。 使用此區域,通常小於整個控制項] 區域中,以加速繪製過程。
繪製您的控制項使用中繼檔
在大多數情況下pdc參數,以OnDraw函式會指向螢幕裝置內容 (DC)。 不過,列印時影像控制項或在預覽列印的工作階段期間,以呈現收到的 DC 的一種特殊類型,稱為 「 中繼 」 檔 DC"。 與不同的是螢幕 DC 會立即處理所傳送給它的要求,中繼檔 DC 會儲存要求以便在稍後播放。 有些容器應用程式也可以選擇要呈現控制項的影像使用中繼檔 DC 在設計模式中。
中繼檔繪製要求可以讓兩個介面函式透過容器: IViewObject::Draw (這個函式也可以呼叫的非型中繼檔繪製) 和 IDataObject::GetData。 當中繼檔 DC 被當成一個參數傳遞時,MFC 架構會呼叫 COleControl::OnDrawMetafile。 因為這是虛擬成員函式時,會覆寫這個函式在執行任何特殊處理的控制項類別。 預設的行為呼叫COleControl::OnDraw。
若要確定可以在同時螢幕及中繼檔裝置內容中繪製控制項,您必須使用支援螢幕與中繼檔 DC 中的成員函式。 請注意可能不像素為單位測量座標系統。
因為的預設實作OnDrawMetafile會呼叫控制項的OnDraw函式,請使用所適用的中繼檔] 及 [螢幕裝置內容,除非您覆寫成員函式OnDrawMetafile。 下列列出的子集CDC成員函式可用在中繼檔和螢幕裝置內容中。 如需有關這些函式的詳細資訊,請參閱類別 CDC 在 MFC 參考手冊 》。
弧形 |
BibBlt |
套索 |
---|---|---|
Ellipse |
逸出字元 |
ExcludeClipRect |
ExtTextOut |
FloodFill |
IntersectClipRect |
LineTo |
MoveTo |
OffsetClipRgn |
OffsetViewportOrg |
OffsetWindowOrg |
PatBlt |
Pie |
Polygon |
Polyline |
PolyPolygon |
RealizePalette |
RestoreDC |
RoundRect |
SaveDC |
ScaleViewportExt |
ScaleWindowExt |
SelectClipRgn |
SelectObject |
SelectPalette |
SetBkColor |
SetBkMode |
SetMapMode |
SetMapperFlags |
SetPixel |
SetPolyFillMode |
SetROP2 |
SetStretchBltMode |
SetTextColor |
SetTextJustification |
SetViewportExt |
SetViewportOrg |
SetWindowExt |
SetWindowORg |
StretchBlt |
TextOut |
|
除了CDC成員函式中,有幾個其他相容的中繼檔 DC 中的函式。 其中包括 CPalette::AnimatePalette, CFont::CreateFontIndirect,和三的成員函式的CBrush: CreateBrushIndirect, CreateDIBPatternBrush,以及 CreatePatternBrush。
不會記錄在中繼檔的函式是: DrawFocusRect, DrawIcon, DrawText, ExcludeUpdateRgn, FillRect, FrameRect, GrayString, InvertRect, ScrollDC,以及 TabbedTextOut。 中繼檔 DC 不是實際相關聯的裝置,因為您無法使用中繼檔 DC SetDIBits、 GetDIBits 和 CreateDIBitmap。 您可以使用 SetDIBitsToDevice 和 StretchDIBits 中繼檔 DC 作為移動目的。 CreateCompatibleDC, CreateCompatibleBitmap,以及 CreateDiscardableBitmap 並不具備意義與中繼檔 DC。
使用中繼檔 DC 時要考慮的另一個重點是不可能以像素計算座標系統。 基於這個理由,您的繪圖程式碼應該加以調整,以省略所有傳遞至OnDraw 在rcBounds參數。 如此可避免不小心繪製超出控制項,因為rcBounds表示控制項視窗的大小。
您已實作的中繼檔呈現控制項之後,使用測試容器來測試中繼檔。 如需存取測試容器的詳細資訊,請參閱用測試容器測試屬性和事件。
若要測試使用測試容器的控制項的中繼檔
在測試容器的編輯 ] 功能表中,按一下 插入新控制項。
在插入新控制項方塊中選取的控制項,然後按一下 [ 確定。
控制項隨即出現在測試容器中。
在控制項 ] 功能表中,按一下 繪製中繼檔。
另一個視窗隨即出現,顯示的中繼檔。 您可以變更此視窗,以查看 [縮放比例如何影響控制項的中繼檔的大小。 您可以隨時關閉這個視窗。