概括
視圖視窗完全建立後第一個被框架調用的函式。框架在第一次調用 OnDraw前會調用OnInitialUpdate,因此OnInitialUpdate是設定滾動視圖的邏輯尺寸和映射模式的最合適的地方。
時間上,兩者先後順序不同,構造函式生成本類的對象,但沒有產生視窗, OnCreate後視窗產生, 然後才是視圖的OnInitialUpDate,一般在這裡對視圖的顯示做初始化。簡單點,就是ONCREATE只是產生VIEW的基本結構和變數而在OnInitialUpDate()中,主要初始化視圖中控制項等。對各個變數進行初始化操作。
例子。我們要在視圖中添加一個button和combobox控制項則
函式中寫法
int CFormView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CRect rect(20,20,100,50);
m_ctrlButton.Create("Button1",WS_CHILD|WS_VISIBLE,rect,this,NULL);
//創建按扭控制項
CFont *pFont=CFont::FromHandle((HFONT)::GetStockObject(ANSI_VAR_FONT));
CRect rect1(150,20,350,100);
m_combobox.Create(WS_CHILD|WS_VISIBLE|CBS_SIMPLE|CBS_NOINTEGRALHEIGHT|WS_VSCROLL,rect1,this,NULL);
return 0;}
OnInitialUpDate中寫法
void CFormView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
//初始化組合框控制項
m_combobox.AddString("Mondy");
m_combobox.AddString("Tuesday");
m_combobox.AddString("Wednesday");
m_combobox.AddString("Thursday");
m_combobox.AddString("Saturday");
m_combobox.AddString("Sunday");
}
在MFC程式設計中,按照傳統的設計,如果處理WM_PAINT訊息,一般會派生一個OnPaint函式,映射到WM_PAINT訊息上進行繪圖處理。但是很多程式中並沒有出現OnPaint,一個OnDraw函式做了更多的繪圖操作。而在訊息映射的列表中,也沒有見到WM_PAINT到OnDraw的映射。
實際上,OnDraw不是OnPaint的映射,出現OnDraw,是為了實現各種不同的設備上的繪圖一致性。
首先,讀者需要明白的是,WM_PAINT訊息是為了繪製螢幕而出現的,因此,在OnPaint中,我們只能存取螢幕DC,進行繪製,常見的代碼是:
void MyWnd::OnPaint()
{CPaintDC dc(this);
//draw code here}
這裡的CPaintDC的構造函式會自動調用BeginPaint,獲得一個螢幕DC,並附加在dc對象上。當dc對象析構時,系統自動調用EndPaint並使invalidated rectangle變成validated狀態,從而結束繪製。(注意,重複創建CPaintDC實例會失敗也因為如此)
如果我們在OnPaint中繪製,那么在印表機上繪製我們就需要再寫一個OnPrint函式,重新繪製。這樣,程式設計者就需要維護兩套代碼。為了簡化操作,MFC框架把大部分繪製操作都放在OnDraw中,OnPaint和OnPrint只構造相應的DC,然後分別調用OnDraw.也就是說,OnDraw適用於所有的設備,而OnPaint只適用於螢幕。
大家在設計過程中必須注意:OnDraw是被基類的OnPaint主動調用的,如果你繼承了OnPaint,你應該要么調用基類的OnPaint(此前不得創建CPaintDC實例,也不得調用BeginPaint),要么自己創建CPaintDC實例,並調用OnDraw.