ActiveX之繪製過程

來源:互聯網
上載者:User

一、ActiveX控制項的繪製過程

    當ActiveX控制項被顯示或被重繪時,繪製過程類似於其它用MFC開發的應用程式,不過有一點不同:ActiveX控制項具有active、inactive二種狀態。

    ActiveX控制項容器中的ActiveX控制項可以看作是一個子視窗,像其它視窗一樣,當接收到WM_PAINT訊息的時候能夠自繪。ActiveX的基類COleControl在它的OnPaint中處理這個訊息,預設情況下是調用你的ActiveX控制項的OnDraw方法。

    當ActiveX控制項的狀態是inactive時,它的繪製過程又不同。這時控制項的視窗是無效的或是不存在,因此它不能夠接收pain訊息。這時控制項的容器會直接調用控制項的OnDraw方法,這有別於active狀態下的控制項繪製過程,因為OnPaint成員函數是不會被調用的。

    像上一自然段討論的那樣,ActiveX控制項的繪製依賴於狀態有二種繪製方式,這二種方式都是架構調用OnDraw成員函數,所以應該在OnDraw方法中添加繪製的主要代碼。

    OnDraw方法處理控制項的繪製,當控制項為inactive時,控制項容器調用OnDraw時傳遞容器的裝置上下文以及控制項所佔據的矩形地區的座標。

    被架構傳入的矩形包含了控制項佔據的面積,如果控制項是active的,那麼矩形的左上方座標是(0,0),而所傳的裝置上下文是包含控制項的子視窗的上下文。如果ActiveX是inactive的,那麼矩形的左上方並不一定是(0,0),裝置上下文是包含控制項的視窗的上下文。

Ps:OnDraw中,不要依賴於矩形的左上方座標來繪圖是很重要的。如果依賴這個座標可能會出現意想不到的結果。

預設的OnDraw如下:

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);}

ps:當繪製控制項時,不要去假設被傳入到OnDraw方法中的裝置上下文的狀態,因為有時容器傳入的上下文並不一定會被初始化為預設的狀態,所以你要明確的指出你繪製代碼中的pen,brushes,colors,fonts等。

二、繪製代碼最佳化

在控制項成功重繪之後,下一步就是最佳化OnDraw方法。

預設條件下,控制項的重繪是控制項整體重繪,這對於簡單的控制項是適合的。但在多數情況下僅重繪控制項需要重繪的部分地區可以提高繪製速度。

OnDraw方法提供一個簡便的最佳化方式——使用參數rcInvalid,這個參數表示控制項中需要重繪的地區。通常這個地區小於控制項本身,因為可加速繪製過程。

三、使用元檔案繪製控制項

    在多數情況下,OnDraw的參數pdc指向的是一個螢幕的裝置上下文。然而,在繪製控制項映像或是在預覽列印時,接收到的DC是特殊的類型——元檔案DC(metafile DC)。有別螢幕DC那樣立即處理繪製請求,元檔案DC會儲存操作,並在稍後的時間裡回放繪製操作。一些容器應用程式在設計模式時可能會選擇元檔案DC來渲染控制項圖片。

    元檔案的繪圖請求可由容器通過二個介面函數產生:一個是IViewObject::Draw,這個函數能夠被非元檔案繪圖調用。另一個是IdataObjet::GetData。當元檔案DC被當作參數傳遞時,MFC架構對COleControl::OnDrawMetafile產生一個調用請求,因為它是一個虛函數,所以在control類中重寫這個函數來做一些特殊的處理。預設下是調用COleControl::OnDraw。

    為了保證控制項在二種DC下都能被繪製,所使用的繪圖方法必須同時支援這二種DC。你要意識到座標系統並不是以像素來衡量的。

    因為OnDrawMetafile預設的實現會調用控制項的OnDraw方法。所以僅能使用那些同時支援二種DC的方法,除非你重寫了OnDrawMetafile方法。下面的列表給出了可同進支援二種DC的方法,詳細資料參考CDC類

更多內容參考MSDN:http://msdn.microsoft.com/en-us/library/552z1tz3.aspx#_core_the_painting_process_of_an_activex_control

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.