1. 程式人生 > >MFC中客戶區和非客戶區的區別&OnPaint和OnDrawn的區別

MFC中客戶區和非客戶區的區別&OnPaint和OnDrawn的區別

1.客戶區和非客戶區的區別: 在一個MDI(多文件)應用程式中每個概念如下圖所示: MFC中客戶區和非客戶區的區別&OnPaint和OnDrawn的區別 MFC中客戶區和非客戶區的區別&OnPaint和OnDrawn的區別

視窗框架客戶區即藍色方框內區域,視窗框架非客戶區指藍色方框之外的視窗區域,包括程式圖示、標題欄、選單欄、最大\最小\關閉按鈕,左右邊框和底下的狀態條。 檢視的客戶區指圖中綠色部分,即紅色方框內區域,非客戶區指檢視部分紅色方框之外的區域,包括檔案圖示、標題欄、三個按鈕和兩個滾動條。 工具欄不屬於框架的非客戶區,它同檢視一樣屬於框架客戶區內的內容,它也是一個視窗。 以後程式設計中,對於CClientDC,CWindowDC,GetClientDC(),GetWindowDC()應該可以很容易就區分開了.
C++中的DC:全稱為Device Context裝置描述表,在C++ MFC中的類為CDC。DC是一個包含裝置(物理輸出裝置,如顯示器及裝置驅動程式)資訊的結構體,在windows平臺下,所以的圖形操作都利用DC來完成。要在視窗中輸出文字或顯示圖形,就需要用到裝置描述表即DC。 裝置描述表是一個windows的資料結構,它包含了一個裝置(比如顯示器和印表機)繪圖屬性的相關資訊。所有的繪圖操作的呼叫都通過一個裝置描述表型別的物件來實現,這個類物件封裝了API函式中關於畫線、作圖和輸入輸出文字的相關操作。裝置描述表允許在視窗上進行與裝置無關的繪圖操作,裝置描述表可用在往螢幕、印表機或圖元檔案的繪圖操作。 2. OnPaint和OnDrawn的區別: On
Draw()和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維護檢視的客戶區(例如我們通過滑鼠在檢視中畫圖)。