Win32项目中的WM_CREATE消息何时被调用的

(本文转载自http://bbs.ednchina.com/BLOG_ARTICLE_3005454.HTM

VC中WM_CREATE、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())。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows消息大全易语言版, 消息,就是指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 通常是一个指向内存数据的指针。由于W P a r a m、l P a r a m和P o i n t e r都是3 2位的, 因此,它们之间可以相互转换。 WM_NULL = 0; WM_CREATE = 1; 应用程序创建一个窗口 WM_DESTROY = 2; 一个窗口被销毁 WM_MOVE = 3; 移动一个窗口 WM_SIZE = 5; 改变一个窗口的大小 WM_ACTIVATE = 6; 一个窗口被激活或失去激活状态; WM_SETFOCUS = 7; 获得焦点后 WM_KILLFOCUS = 8; 失去焦点 WM_ENABLE = 10; 改变enable状态 WM_SETREDRAW = 11; 设置窗口是否能重画 WM_SETTEXT = 12; 应用程序发送此消息来设置一个窗口的文本 WM_GETTEXT = 13; 应用程序发送此消息来复制对应窗口的文本到缓冲区 WM_GETTEXTLENGTH = 14; 得到与一个窗口有关的文本的长度(不包含空字符) WM_PAINT = 15; 要求一个窗口重画自己 WM_CLOSE = 16; 当一个窗口或应用程序要关闭时发送一个信号 WM_QUERYENDSESSION = 17; 当用户选择结束对话框或程序自己调用ExitWindows函数 WM_QUIT = 18; 用来结束程序运行或当程序调用postquitmessage函数 WM_QUERYOPEN = 19; 当用户窗口恢复以前的大小位置时,把此消息发送给某个图标 WM_ERASEBKGND = 20; 当窗口背景必须被擦除时(例在窗口改变大小时) WM_SYSCOLORCHANGE = 21; 当系统颜色改变时,发送此消息给所有顶级窗口 WM_ENDSESSION = 22; 当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序, 通知它对话是否结束 WM_SYSTEMERROR = 23; WM_SHOWWINDOW = 24; 当隐藏或显示窗口是发送此消息给这个窗口 WM_ACTIVATEAPP = 28; 发此消息给应用程序哪个窗口是激活的,哪个是非激活的; WM_FONTCHANGE = 29; 当系统的字体资源库变化时发送此消息给所有顶级窗口 WM_TIMECHANGE = 30; 当系统的时间变化时发送此消息给所有顶级窗口 WM_CANCELMODE = 31; 发送此消息来取消某种正在进行的摸态(操作) WM_SETCURSOR = 32; 如果鼠标引起光标在某个窗口移动且鼠标输入没有被捕获时,就发消息给某个窗口 WM_MOUSEACTIVATE = 33; 当光标在某个非激活的窗口而用户正按着鼠标的某个键发送此消息给当前窗口 WM_CHILDACTIVATE = 34; 发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小 WM_QUEUESYNC = 35; 此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序 分离出用户输入消息 WM_GETMINMAXINFO = 36; 此消息发送给窗口当它将要改变大小或位置; WM_PAINTICON = 38; 发送给最小化窗口当它图标将

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值