- /*
- DC的分類:
- 設備上下文是一個包含了設備屬性等信息的Windows數據結構,所有與描畫相關的
- 函數調用都是通過DC對象完成的,DC對象封裝了WindowsAPI函數.DC允許設備獨立
- 地在系統是進行描畫,可以描畫到顯示器上,打印機及中間文件上.
- CPaintDC封裝了Windows的常用描畫流程:先調用BeginPaint,然後進行描畫,最後
- 調用EndPaint.CPaintDC的構造函數會幫助我們調用BeginPaint,析構函數會幫助
- 我們調用EndPaint.基本流程就是創建CDC對象,然後描畫,最後銷燬CDC對象.在
- 編程框架中,這些流程都是自動完成的,它會向我們的OnDraw函數傳遞一個CD指針,
- 然後我們就可以在這個DC上進行描畫操作了.傳遞過來的DC指針會被編程框架
- 銷燬,底層的設備上下文會根據我們OnDraw函數的返回值決定是否被釋放.
- CClientDC封裝只工作在窗口客戶區的設備上下文,它的構造函數會調用GetDC,
- 其析構函數會調用ReleaseDC。
- CWindowDC封裝了工作在整個窗口,包括邊框的設備上下文。
- CMeteFileDC封裝了工作在Windows中間文件上的設備上下文,在這種情況下,
- 爲了獲得DC,我們需要手工調用OnPrepareDC。
- */
- /*
- 在視圖上描繪:
- 幾乎所有的描繪操作都發生在視圖的OnDraw函數裏,所以我們應該重載我們自己
- 視圖的OnDraw函數:
- 1:通過我們自己的文檔類方法獲取數據
- 2:通過編程框架傳遞過來的DC進行數據的顯示
- 當文檔類的數據發生變化的時候,視圖類需要即時地反映出這一變化。常規情況
- 下,變化是用戶通過文檔的視圖操作完成的。這種情況下,視圖通過調用文檔類
- 的UpdateAllViews來通知本文檔的所有視圖去更新他們自己。UpdateAllViews
- 會調用每一個視圖的OnUpdate方法,默認情況下OnUpdate會重繪整個視圖的客戶區。
- 當然我們可以重載OnUpdate以便能讓其只重繪與變化數據相關的區域。
- 文檔的UpdateAllViews和視圖的OnUpdate允許用戶只傳遞針對已變化數據的信息。
- 這種“微量機制”就允許我們限制客戶區域的重繪區域,從而提高效率。OnUpdate
- 需要兩個“微量參數”,第一個類型爲LPARAM,允許你傳遞任何你喜歡的數據,
- 第二個類型爲CObject,允許你傳遞任何派生自CObject的對象指針,這裏體現出
- 了針對接口編程的思想。
- 當視圖無效之後,系統會向其發送WM_PAINT消息,視圖的OnPaint函數會響應這個
- 消息,它會創建一個CPaintDC類型的DC,然後調用視圖的OnDraw函數,一般情況
- 下我們不需要重載OnPaint函數。
- 經典的在視圖中進行描繪操作的代碼是先獲得相關文檔的指針,然後調用DC的方法
- 進行描繪操作。
- */
- void CMyView::OnDraw(CDC* pDC)
- {
- CMyDoc* pDoc = GetDocument();//獲得文檔指針
- ASSERT_VALID(pDoc);
- if (!pDoc)
- return;
- CString s = pDoc->GetData();//在我們自己的文檔類中,我們可以複雜化GetData
- CRect rect;
- GetClientRect(&rect);
- pDC->SetTextAlign(TA_BASELINE | TA_CENTER);
- pDC->TextOut(rect.right / 2, rect.bottom / 2, s, s.GetLength());
- }
- /*
- 通過視圖解析用戶的輸入:
- 視圖的其它成員函數會處理和解析用戶的所有輸入。通常情況下你應該在視力類中
- 定義一個消息響應函數去處理以下內容:
- 產生自鼠標和鍵盤的Windows消息。
- 來自菜單,工具欄和快捷鍵的命令消息。
- 這些消息處理函數會將鼠標的單擊,雙擊,移動,拖拽,鍵盤按下,菜單命令解析
- 爲數據的輸入,選擇,編輯,及複製與粘貼等。
- 程序應該處理哪些消息應該根據程序本身的需要。
- */
在視圖上描繪
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.