複製鏈接
請複製以下鏈接發送給好友

OnInitialUpdate

鎖定
框架在第一次調用OnDraw前會調用OnInitialUpdate,因此OnInitialUpdate是設置滾動視圖的邏輯尺寸和映射模式的最合適的地方。
外文名
OnInitialUpdate
概    括
第一個被框架調用的函數
時間上
兩者先後順序不同
例    子
添加一個button和combobox控件

目錄

OnInitialUpdate概括

視圖窗口完全建立後第一個被框架調用的函數。
時間上,兩者先後順序不同,構造函數生成本類的對象,但沒有產生窗口,OnCreate後窗口產生, 然後才是視圖的OnInitialUpDate,一般在這裏對視圖的顯示做初始化。簡單點,就是ONCREATE只是產生VIEW的基本結構和變量而在OnInitialUpDate()中,主要初始化視圖中控件等。對各個變量進行初始化操作。
例子。我們要在視圖中添加一個buttoncombobox控件則

OnInitialUpdate函數中寫法

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.