MFC-客戶區與非客戶區
1 在一個MDI(多文件)應用程式中每個概念如下圖所標示:
1)視窗框架的客戶區就是指圖中的灰色部分:即藍色方框內區域,框架的非客戶區就是指藍色方框之外的視窗區域,包括程式圖示,標題欄,選單,最大最小/關閉按紐,左右兩個框和底下的狀態條.
2)檢視的客戶區就是指圖中綠色部分:即紅色方框內的區域,檢視的非客戶區就是指檢視部分紅色方框之外的區域,包括:檔案圖示,標題欄,三個按紐和兩個滾動條.
3)從圖中可以看出,工具欄(工具條)不屬於框架的非客戶區,它跟檢視是框架客戶區內的”兄弟”.它也是一個視窗,讀者不妨再拖拽工具條,它還可以拖出框架視窗區域.
4)因此,以後程式設計中,對於CClientDC,CWindowDC,GetClientDC(),GetWindowDC()應該可以很容易就區分開了.
2. OnPaint和OnDrawn的區別
OnDraw()和OnPaint()好象兄弟倆,因為它們的工作類似。一般Windows會發送兩個訊息WM_PAINT(通知客戶區有變化)和WM_NCPAINT(通知非客戶區有變化)。非客戶區的重畫系統自己搞定了,而客戶區的重畫需要我們自己來完成。這就需要OnDraw()或 OnPaint()來重畫視窗。它們用來重繪客戶區,onpaint負責響應重繪訊息,然後onpaint呼叫ondraw進行重繪。
OnDraw()和OnPaint()的區別:
首先:CView類派生自CWnd類,OnPaint()是CWnd的類成員,同時負責響應WM_PAINT訊息。OnDraw()是CVIEW的成員函式,並且沒有響應訊息的功能。這就是為什麼你用VC成的程式程式碼時,在檢視類只有 OnDraw沒有OnPaint的原因—onpaint函式都是繼承自Cwnd基類。
其次,要想在螢幕上繪圖或顯示圖形,首先需要建立裝置環境DC。其實DC是一個數據結構,它包含輸出裝置(不單指你17寸的純屏顯示器,還包括印表機之類的輸出裝置)的繪圖屬性的描述。MFC提供了CPaintDC類和CWindwoDC類來實時的響應,而CPaintDC支援重畫。當檢視變得無效時(包括大小的改變,移動,被遮蓋等等),Windows 將 WM_PAINT 訊息傳送給它。該檢視的OnPaint 處理函式通過建立 CPaintDC 類的DC物件來響應該訊息並呼叫檢視的 OnDraw 成員函式。通常我們不必編寫重寫的 OnPaint 處理成員函式。
///CView預設的標準的重畫函式
void CView::OnPaint()
{
CPaintDC dc(this);
OnPreparDC(&dc);
OnDraw(&dc); //呼叫了OnDraw
}
既然OnPaint最後也要呼叫OnDraw,因此我們一般會在OnDraw函式中進行繪製。下面是一個典型的程式:
///檢視中的繪圖程式碼首先檢索指向文件的指標,然後通過DC進行繪圖呼叫。
void CMyView::OnDraw( CDC* pDC )
{
CMyDoc* pDoc = GetDocument();
CString s = pDoc->GetData(); // Returns a CString
CRect rect;
GetClientRect( &rect );
pDC->SetTextAlign( TA_BASELINE | TA_CENTER );
pDC->TextOut( rect.right / 2, rect.bottom / 2, s, s.GetLength() );
}
因此我們一般用OnPaint維護視窗的客戶區(例如我們的視窗客戶區加一個背景圖片),用OnDraw維護檢視的客戶區(例如我們通過滑鼠在檢視中畫圖)。