MFC中的几个重要函数:区别和含义

时间上,两者先后顺序不同,构造函数生成本类的对象,但没有产生窗口,OnCreate后窗口产生, 然后才是视图的OnInitialUpDate,一般在这里对视图的显示做初始化。简单点,就是ONCREATE只是产生VIEW的基本结构和变量而在OnInitialUpDate()中,主要初始化视图中控件等。对各个变量进行初始化操作。
例子。我们要在视图中添加一个button和combobox控件则
OnCreate函数中写法如下:
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");

}




1.onPaint与onDraw

这两个函数的区别在网上解释的也比较多,首先要明确OnPaint()是CWnd类的成员函数,OnDraw()是CView类的成员函数,而CView派生于CWnd,因此CView类也继承了OnPaint函数。另外,要明确响应WM_PAINT消息的是OnPaint函数。

对于View类来说,当其窗口客户区变得无效时,windows将产生一个WM_PAINT消息,View类继承的OnPaint函数响应该消息,并通过创建CPaintDC类的对象进一步调用OnDraw函数。因此,通常情况下,我们没有必要重写OnPaint函数,只需要在OnDraw类中进行绘图操作。

 

2.OnCreate和PreCreateWindow

首先说明一下OnCreate和PreCreateWindow的调用时间,PreCreateWindow是在窗口注册之后,并用CreateWindowEx产生窗口之前调用的;而OnCreate是在窗口创建之后,显示之前调用的。

PreCreateWindow的是让程序员在PreCreateWindow中按自己的要求修改窗口的注册信息,以改变窗口的风格,如果在PreCreateWindow中修改了注册信息值,那么在紧接着的调用CreateWindowEx创建窗口时,其参数就会发生相应的改变,从而就创建了一个符合我们要求的窗口。

OnCreate函数是WM_CREATE消息的相应函数,任何一个窗口创建时都会产生一个WM_CREATE消息,由于此时还没有开始消息循环,因此是通过SendMessage直接发出的,不经过消息循环,直接调用消息相应函数。OnCreate函数的主要目的是让程序员在窗口创建之后,显示之前,通过该函数向窗口添加控件以及初始绘图操作。

 

3.OnCreate和OninitDialog

首先要区分一点,OninitDialog主要针对对话框,而OnCreate用于所有窗口。再说明一下他们还有Onsize的调用顺序,OnCreate > OnSize > OnInitDialog。

从msdn的说明上,wm_create消息是在调用createwindow或createwindowex函数创建窗口时产生的,而wm_initdialog消息是是在对话框显示之前产生的。

具体来说,oncreate是在窗口创建时,但窗口还没有创建完成时的调用的,在该函数内部先调用父类的oncreate函数创建窗口,然后创建了工具条和状态栏。因此在该函数中可以给成员变量赋值,也可以修改窗口的基本内容,比如在窗口内创建一个按钮,或创建插入符,但不能对窗口控件进行修改或初始化,因为窗口还没有建立完成。

而oninitdialog函数式在对话框创建完成,控件也创建完成,在对话框以及其内部的控件显示之前调用。在该函数中,可以给成员变量进行赋值,也可以通过控件ID对其进行修改。

最后还要说明一下,一般oninitdialog是在编写对话框程序时进行初始化操作的函数,主要在其内部进行控件初始化操作,如显示或隐藏某控件,移动控件,也可以在其内部对成员变量赋值,但赋值操作一般在构造函数中完成,一般没必要为对话框程序重写oncreate函数。而oncreate函数主要是针对单文档程序的,主要在视类或框架类的窗口框架创建完成而进行控件添加时为他们的客户区添加控件或者进行某些初始化操作。



在窗口的CWnd::Create()/CreateEx()调用返回前,要调用PreCreateWindow(),对Create()/CreateEx()中的风格参数进行预处理设置.之后调用OnCreate进行实际的窗口创建,返回后,Create()/CreateEx()也返回,窗口创建结束.

PreCreateWindow()顾名思义就是在窗口创建之前执行的,它的主要任务是对所要创建的窗口进行一些风格或者其他方面的初始化或者说是设置,可以这么说,如果说窗口好比一栋建筑,那么PreCreateWindow()要做的就是在还没有建筑的时候将建筑的图纸画出来,而OnCreate()要做的就是根据图纸将建筑构建起来.

 

OnCreate是一个消息响应函数,是响应WM_CREATE消息的一个函数,而WM_CREATE消息是由Create函数调用的。

  在view类中,Create 是虚函数框架调用,是用来“生成一个窗口的子窗口”。 而OnCreate 函数是用来“表示一个窗口正在生成”。

  一个窗口创建(Create)之后,会向操作系统发送WM_CREATE消息,OnCreate()函数主要是用来响应此消息的。因为在MFC里面用一种消息映射的机制来响应消息,也就是可以用函数来响应相应的消息。就拿CMainFrame类来说,当窗口创建后会产生WM_CREATE消息,我们可以在OnCreate函数里实现我们要在窗口里面增加的东西,例如按扭,状态栏,工具栏等。这些子窗口一般是定义成类中的一个成员变量,因为要保证生命周期。一般以m_开头来表示成员(member)。

  OnCreate()不产生窗口,只是在窗口显示前设置窗口的属性如风格、位置等,Create()负责注册并产生窗口

  Create()不是对应于消息WM_CREATE的,OnCreate()才是。Create()只用于产生窗口,像动态创建控件中的Create()一样。



参考:https://www.cnblogs.com/Simon-Sun1988/articles/4120863.html

         http://www.cnblogs.com/mingfei200169/articles/666567.html

猜你喜欢

转载自blog.csdn.net/a_Treasure/article/details/80837920