几个关键的MFC函数的区别

onPaint与onDraw

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

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


OnCreate和PreCreateWindow

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

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

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


OnCreate和OninitDialog

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

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

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

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

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



个人的理解,大家辩证的看。

参考:http://bbs.csdn.net/topics/287357

http://bbs.csdn.net/topics/80219285

http://www.cnblogs.com/lingshaohu/archive/2011/12/12/2284881.html

你可能感兴趣的:(几个关键的MFC函数的区别)