WM_CREATE与 WM_PAINT以及WM_INITDIALOG

程序如:
switch(iMessage)
{
    case WM_CREATE:
       ...
        return 0;
    case WM_PAINT:
         ......
         return 0;
    case WM_SIZE:
         ......
         return 0;
    default:
         return(DefWndProc(hwnd,iMessage,wParam,lParam));

}


WM_CREATE 在创建窗口时触发,只触发一次。
WM_PAINT在需要重画时调用,并多次触发。

WM_CREATE先于WM_PAINT


WM_CREATE在调用CreateWindow函数时发生
WM_PAINT在调用UpdateWindow函数时发生

windows是一个消息驱动的os,当窗口创建时,WM_CREATE被发送给窗口处理过程,等于时通知窗口,我(系统)已经把你创建了,你可以初始化自己了,通常窗口处理过程会加载必要的资源,创建子窗口等等,可以定制这个消息,完成特殊的初始化操作。

当窗口需要重画时,系统向窗口发送WM_PAINT,消息,通知窗口该画你自己了(只限客户区),窗口处理过程就画出窗口,这个消息也可以定制,画特殊的窗口



REATE、WM_INITDIALOG消息出现顺序及调用方式

wxleasyland@sina.com

2012.7

 

wxleasyland试验:

 

VC建的标准WIN32-HELLO WORLD程序中:

1.在CreateWindow()前面加上语句WinExec("cmd /k echo now call CreateWindow()",SW_SHOW);   Sleep(5000);

2.在CreateWindow()后面加上语句WinExec("cmd /k echo CreateWindow() RETURN",SW_SHOW);

3.在WndProc()中加上

case WM_CREATE:

           WinExec("cmd /k echo WndProc(): WM_CREATE: appear!",SW_SHOW);

           Sleep(5000);

           break;

4.运行,发现,先出现now call CreateWindow()、再WndProc(): WM_CREATE: appear!、最后CreateWindow() RETURN。

 

结论:

CreateWindow()是在运行后、返回前,发送消息WM_CREATE,并阻塞!

WM_CREATE消息直接发给消息处理函数WndProc()执行!而不是通过消息队列(GetMessage、DispatchMessage等)!!

其实就是CreateWindow()直接拿消息WM_CREATE去调用WndProc()!!!!!

如果WndProc()返回0,CreateWindow()正常返回hWnd。

如果WndProc()返回-1,CreateWindow()销毁窗口,并返回NULL。

 

所以WM_CREATE时,CreateWindow()内部已经创建好窗口了,但还没有返回,还没有hWnd!即窗口真正还没有创建结束。这时这里不能有对窗口上的控件操作的函数,不然就会“程序执行了非法操作”。比如GetDlgItem等。

 

 

标准WIN32程序中,是先RegisterClassEx()注册窗口类->再CreateWindow()创建窗口->再ShowWindow()显示出窗口->再UpdateWindow()立即用WM_PAINT刷新窗口->再LoadAccelerators()->再进入消息循环(GetMessage、DispatchMessage等)

 

 

在MFC对话框中,试验,是:先WM_CREATE,这时窗口未显示出来->再WM_INITDIALOG,这时窗口仍未显示出来-> OnInitDialog()运行完毕后,窗口才显示出来(应是默认通过ShowWindow())。

 

 

 

 

====================================

 

http://msdn.microsoft.com/en-us/library/windows/desktop/ms632619(v=vs.85).aspx

WM_CREATE message

Sent when an application requests that a window be created by calling the CreateWindowEx or CreateWindow function.    (The message is sent before the function returns.这个消息在函数返回前被发送)      The window procedure of the new window receives this message after the window is created, but before the window becomes visible.

A window receives this message through its WindowProc function.   窗口通过WindowProc函数来接收这个消息!

 

If an application processes this message, it should return zero to continue creation of the window.     If the application returns –1, the window is destroyed and the CreateWindowEx or CreateWindow function returns a NULL handle.  处理这个消息的程序应返回0,如果返回-1,则窗口被销毁并且CreateWindow返回NULL。

 

 

 

CreateWindow function

Creates an overlapped, pop-up, or child window.   It specifies the window class, window title, window style, and (optionally) the initial position and size of the window. The function also specifies the window's parent or owner, if any, and the window's menu.

 

Before returning, CreateWindow sends a WM_CREATE message to the window procedure.     在CreateWindow返回前,它会发送WM_CREATE给窗口处理程序。

For overlapped, pop-up, and child windows,  CreateWindow sends WM_CREATEWM_GETMINMAXINFO, and WM_NCCREATE messages to the window.      The lParam parameter of theWM_CREATE message contains a pointer to a CREATESTRUCT structure.   If the WS_VISIBLE style is specified, CreateWindow sends the window all the messages required to activate and show the window.

 

 

 

 

WM_NCCREATE message

Sent prior to the WM_CREATE message when a window is first created. 在WM_CREATE之前被发送。

A window receives this message through its WindowProc function.  窗口通过WindowProc函数来接收这个消息!

If an application processes this message, it should return TRUE to continue creation of the window. If the application returns FALSE, theCreateWindow or CreateWindowEx function will return a NULL handle.

 

 

 

====================================

引用网络上的:

====================================

UpdateWindow

 

UpdateWindow()立即用WM_PAINT刷新窗口。WM_PAINT消息并不是一直发的,一般在窗口遮住后再显示时系统自动发,而且它的优先级很低,只有在别的消息处理完后才处理;UpdateWindow给指定窗口的窗口过程发送一个WM_PAINT消息并立即执行(不经过消息队列),如果更新区域为空,则不发送消息。

 

===================================

 

WM_CREATE & WM_INITDIALOG

 

WM_CREATE是所有窗口都能响应的消息,表明本窗口已经创建完毕.可以安全的使用这个窗口了,例如在它上面画控件等等.这个状态肯定是在调用ShowWindows()显示窗口之前.

 

WM_WM_INITDIALOG是对话框才能收到的消息,表明对话框及其所有子控件都创建完毕了,这个状态肯定是调用显示对话框的函数之前.所以可以在WM_WM_INITDIALOG对控件进行一些修改等.

 

-------

 

nvneibaba_069 - 初级水手长 七级

 

不要被MFC干扰了,MFC封装了太多的东西,心里想着API的执行顺序就行了。

 

所有窗口都是在注册窗口类之后调用CreateWindowEx来创建的,创建成功之后(HWND有效但CreateWindowEx尚未返回)系统自动发送WM_CREATE消息,所以你的OnCreate将被执行,在这里窗口已经创建成功了,你可以安全地创建各种子窗口。

 

-------

 

http://www.cppblog.com/pwqonline/archive/2008/12/04/67806.html

 

WM_CREATE消息响应函数和WM_INITDIALOG消息响应函数之区别

 

          在响应WM_CREATE消息响应函数的时候,对话框及子控件还未创建完成,亦是说只是通知系统说要开始创建窗口啦,这个消息响应完之后,对话框和子控件才开始创建。因此在此消息响应函数中无法对控件进行修改和初始化。

 

          而WM_INITDIALOG消息响应函数是在程序运行时,当其对话框和子控件全部创建完毕,将要显示内容的时候发送的消息。因此可以在WM_INITDIALOG消息响应函数中添加对编辑框控件的初始化和修改。

 

-------

 

WM_CREATE消息用来产生子窗口控件,WM_CREATE是谁发出的,什么意思??

当然是windows操作系统发出,所有消息都是由操作系统发出给程序的,分成进队消息,和不进队消息,wm_create不仅仅指子窗口产生,所有窗口在操作系统内部产生时,windows都会发出这个消息

 

--------

 

应用程序中处理消息的顺序(转)

 

MFC应用程序中处理消息的顺序

 

1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc

 

2.AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数

 

3.WindowProc()      该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数

 

4.OnWndMsg()        该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数,对于WM_NOTIFY消息

调用OnNotify()消息响应函数。任何被遗漏的消息将是一个窗口消息。OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数

 

5.OnCommand()       该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数

 

6.OnCmdMsg()        根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。

例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数

 

MFC应用程序创建窗口的过程

 

1.PreCreateWindow()   该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数 (可以设置窗口风格等等)

 

2.PreSubclassWindow() 这也是一个重载函数,允许首先子分类一个窗口

 

3.OnGetMinMaxInfo()   该函数为消息响应函数,响应的是WM_GETMINMAXINFO消息,允许设置窗口的最大或者 最小尺寸

 

4.OnNcCreate()        该函数也是一个消息响应函数,响应WM_NCCREATE消息,发送消息以告诉窗口的客户区 即将被创建

 

5.OnNcCalcSize()      该函数也是消息响应函数,响应WM_NCCALCSIZE消息,作用是允许改变窗口客户区大小

 

6.OnCreate()          该函数也是一个消息响应函数,响应WM_CREATE消息,发送消息告诉一个窗口已经被创建

 

7.OnSize()            该函数也是一个消息响应函数,响应WM_SIZE消息,发送该消息以告诉该窗口大小已经 发生变化

 

8.OnMove()            消息响应函数,响应WM_MOVE消息,发送此消息说明窗口在移动

 

9.OnChildNotify()     该函数为重载函数,作为部分消息映射被调用,告诉父窗口即将被告知一个窗口刚刚被 创建

 

MFC应用程序关闭窗口的顺序(非模态窗口)

 

1.OnClose()       消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送此消息

 

2.OnDestroy()     消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息

 

3.OnNcDestroy()   消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁后发送此消息

 

4.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作,被CWnd调用

 

MFC应用程序中打开模式对话框的函数调用顺序

 

1.DoModal()             重载函数,重载DoModal()成员函数

 

2.PreSubclassWindow()   重载函数,允许首先子分类一个窗口

 

3.OnCreate()            消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建

 

4.OnSize()              消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化

 

5.OnMove()              消息响应函数,响应WM_MOVE消息,发送此消息,以告诉窗口正在移动

 

6.OnSetFont()           消息响应函数,响应WM_SETFONT消息,发送此消息,以允许改变对话框中控件的字体

 

7.OnInitDialog()        消息响应函数,响应WM_INITDIALOG消息,发送此消息以允许初始化对话框中的控件,或者是创建新控件

 

8.OnShowWindow()        消息响应函数,响应WM_SHOWWINDOW消息,该函数被ShowWindow()函数调用

 

9.OnCtlColor()          消息响应函数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件的颜色

 

10. OnChildNotify()     重载函数,作为WM_CTLCOLOR消息的结果发送

 

MFC应用程序中关闭模式对话框的顺序

 

1.OnClose()        消息响应函数,响应WM_CLOSE消息,当"关闭"按钮被单击的时候,该函数被调用

 

2.OnKillFocus()    消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送

 

3.OnDestroy()      消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送

 

4.OnNcDestroy()    消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被发送

 

5.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用

 

打开无模式对话框的顺序

 

1.PreSubclassWindow()    重载函数,允许用户首先子分类一个窗口

 

2.OnCreate()             消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建

 

3.OnSize()               消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化

 

4.OnMove()               消息响应函数,响应WM_MOVE消息,发送此消息以告诉窗口正在移动

 

5.OnSetFont()            消息响应函数,响应WM_SETFONT消息,发送此消息以允许改变对话框中控件的字体

 

以上这些的执行都是按给定的顺序执行!

 

只有清楚的了解应用程序的执行顺序,才能在编写代码的时候知道,在什么时候应该执行什么,以及在什么地方该处理什么!

 


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。 消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,它在Windows单元中是这样声明的: type TMsg = packed record hwnd: HWND; //窗口句柄 message: UINT;//消息常量标识符 wParam: WPARAM ;// 32位消息的特定附加信息 lParam: LPARAM ;// 32位消息的特定附加信息 time: DWORD;//消息创建时的时间 pt: TPoint; //消息创建时的鼠标位置 end ; 消息中有什么? 是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释:hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可 视对象的句柄(窗口、对话框、按钮、编辑框等)。message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也 可以是自定义的常量。 wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。 lParam 通常是一个指向内存中数据的指针。由于WParam、lParam和Pointer都是32位的,因此,它们之间可以相互转换。 WM_NULL =$0000 // WM_CREATE =$0001 //应用程序创建一个窗口 WM_DESTROY = $0002 //一个窗口被销毁 WM_MOVE = $0003 //移动一个窗口 WM_SIZE= $0005 //改变一个窗口的大小 WM_ACTIVATE= $0006 //一个窗口被激活或失去激活状态; WM_SETFOCUS= $0007 //获得焦点后 WM_KILLFOCUS= $0008 //失去焦点 WM_ENABLE= $000A //改变enable状态 WM_SETREDRAW= $000B //设置窗口是否能重画 WM_SETTEXT= $000C //应用程序发送此消息来设置一个窗口的文本 WM_GETTEXT = $000D //应用程序发送此消息来复制对应窗口的文本到缓冲区 WM_GETTEXTLENGTH = $000E //得到与一个窗口有关的文本的长度(不包含空字符) WM_PAINT = $000F //要求一个窗口重画自己 WM_CLOSE = $0010 //当一个窗口或应用程序要关闭时发送一个信号 WM_QUERYENDSESSION= $0011 //当用户选择结束对话框或程序自己调用ExitWindows函数 WM_QUIT= $0012 //用来结束程序运行或当程序调用postquitmessage函数 WM_QUERYOPEN = $0013 //当用户窗口恢复以前的大小位置时,把此消息发送给某个图标 WM_ERASEBKGND = $0014 //当窗口背景必须被擦除时(例在窗口改变大小时) WM_SYSCOLORCHANGE = $0015 //当系统颜色改变时,发送此消息给所有顶级窗口 WM_ENDSESSION = $0016 // 当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束 WM_SYSTEMERROR = $0017 // WM_SHOWWINDOW= $0018 //当隐藏或显示窗口是发送此消息给这个窗口 WM_ACTIVATEAPP = $001C //发此消息给应用程序哪个窗口是激活的,哪个是非激活的; WM_FONTCHANGE= $001D //当系统的字体资源库变化时发送此消息给所有顶级窗口 WM_TIMECHANGE= $001E //当系统的时间变化时发送此消息给所有顶级窗口 WM_CANCELMODE= $001F //发送此消息来取消某种正在进行的摸态(操作) WM_SETCURSOR = $0020 //如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口 WM_MOUSEACTIVATE = $0021 //当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口 WM_CHILDACTIVATE = $0022 //发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小 WM_QUEUESYNC= $0023 //此消息由基

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值