OnInitialUpdate

OnInitialUpdate

框架在第一次調用OnDraw前會調用OnInitialUpdate,因此OnInitialUpdate是設定滾動視圖的邏輯尺寸和映射模式的最合適的地方

概括

視圖視窗完全建立後第一個被框架調用的函式。框架在第一次調用 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.

相關詞條

相關搜尋

熱門詞條

聯絡我們