在視圖上描繪

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