在檢視中的繪圖
幾乎所有的繪圖應用程式中,就會發生在檢視中的OnDraw成員函式,您必須在您的檢視類別中覆寫。 (例外狀況是滑鼠繪製、 討論解譯使用者輸入透過檢視。)您OnDraw覆寫:
藉由呼叫您提供的成員函式的文件中取得資料。
顯示資料,藉由呼叫成員函式的架構就會傳遞到的裝置內容物件的OnDraw。
當文件的資料變更時以某種方式,檢視必須重新繪製以反映所做的變更。 一般而言,這是因為當使用者尚未透過文件檢視變更。 如此一來,則檢視會呼叫文件的 UpdateAllViews 成員函式,來通知來自行更新相同的文件的所有檢視。 UpdateAllViews每一個檢視表會呼叫 OnUpdate 成員函式。 預設實作的OnUpdate使檢視表的整個用戶端區域失效。 您可以覆寫它,要使其失效的只有那些區域之工作區對應到文件已修改的部分。
UpdateAllViews成員函式類別的 CDocument 和OnUpdate成員函式類別的CView可讓您傳遞資訊描述哪些組件的文件已經過修改。 這項 「 提示 」 機制,可讓您限制檢視必須重繪的區域。 OnUpdate使用兩個 「 提示 」 引數。 首先, lHint,型別的 LPARAM,可讓您傳送任何資料,您要第二個, pHint,型別的CObject1,可讓您將指標傳遞至任何物件衍生自CObject。
當檢視就會變成無效時,Windows 會將它傳送WM_PAINT訊息。 檢視表的 OnPaint 訊息處理函式回應方式建立裝置內容物件類別的 CPaintDC ,並呼叫您的檢視OnDraw成員函式。 您通常不必撰寫覆寫OnPaint處理函式。
A 的裝置內容是一種 Windows 資料結構,其中包含的顯示器或印表機等裝置之繪圖屬性相關資訊。 所有的繪圖呼叫都透過裝置內容物件進行的。 繪製在畫面上, OnDraw會傳遞CPaintDC物件。 繪製一台印表機,則會傳遞 CDC 設為目前的印表機物件。
您的程式碼檢視中繪製的第一次擷取變數的指標,文件中,然後可透過裝置內容的繪製呼叫。 下列的簡單OnDraw範例說明的程序:
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
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());
}
在這個範例中,您會定義GetData做為衍生的文件類別的成員。
此範例會列印它會從 [文件中,在檢視中置中取得任何字串。 如果OnDraw呼叫正在進行螢幕繪圖, CDC物件傳入的pDC是CPaintDC已經呼叫其建構函式,已BeginPaint。 繪圖函式的呼叫都透過裝置內容的指標進行的。 裝置內容和繪製呼叫的相關資訊,請參閱類別 CDC 在 MFC 參考手冊 》 和使用視窗物件。
如需更多範例如何撰寫的OnDraw,請參閱 MFC 範例。