我用win32API写一个函数,如果在WinMain()函数里消息循环前有我自己的一个初始化函数MyInit()
WinMian(...)
{
...
MyInit();
while(GetMessage(...))
{
}
}
那么程序是先执行我的MyInit()呢还是先执行WM_CREATE消息呢?
还有WM_CREATE消息和WM_PAINT消息又是怎样的关系呢,窗口的第一遍绘图是在程序什么阶段进行的呢?
假如我的MyInit()是一个DirectDraw的初始化函数,我可以把它放到WM_CREATE消息里吗?怎样放呢?
感觉问题有点多,哈哈,不好意思啊,不要觉的我烦人啊....:)
WinMian(...)
{
...
MyInit();
while(GetMessage(...))
{
}
}
那么程序是先执行我的MyInit()呢还是先执行WM_CREATE消息呢?
还有WM_CREATE消息和WM_PAINT消息又是怎样的关系呢,窗口的第一遍绘图是在程序什么阶段进行的呢?
假如我的MyInit()是一个DirectDraw的初始化函数,我可以把它放到WM_CREATE消息里吗?怎样放呢?
感觉问题有点多,哈哈,不好意思啊,不要觉的我烦人啊....:)
调用CreateWindow马上就响应WM_CREATE这个消息了WM_CREATE响应窗口创建
WM_PAINT响应窗口重绘假如我的MyInit()是一个DirectDraw的初始化函数,我可以把它放到WM_CREATE消息里吗?
可以,
当然啦,放在WinMian也可以如果放在WM_CREATE消息里
那么在你的窗口函数中,响应WM_CREATE这个消息,然后做一些你要的初试话
WM_CREATE是个消失,虽然有可能在你的函数调用之前被产生出来了,产生出来了并不代表你马上就要处理他,在下面的这段代码里面才开始处理消息的:
while(GetMessage(...))
{
}
你上面的语句只要还没有运行到,就不好处理任何消息的。另外,那个DirectDraw的初始化函数放在哪儿不重要,只要在使用DirectDraw功能之前调用就行。最后,从楼主问的问题,我猜测,楼主对windows编程的本质还不是很清楚,因此推荐楼主看一下《Windows程序设计》这本书。
再执行到 while(GetMessage(...))
{
}
刚才看了一下对CreateWindow的解释,具体如下:
Before returning, CreateWindow sends a WM_CREATE message to the window procedure. For overlapped, pop-up, and child windows, CreateWindow sends WM_CREATE, WM_GETMINMAXINFO, and WM_NCCREATE messages to the window. The lParam parameter of the WM_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.
对于有些消息必须要处理完了才返回,比如CreateWindow触发的WM_CREATE的消息。看来操作系统对消息的处理并不仅仅是通过消息循环这一条路,他还会主动的去处理某些消息。另外,根据上面的英文解释,CreateWindow除了触发WM_CREATE消息,还会触发和显示或者激活窗口有关的消息等,而这些消息有可能会调用到DirectDraw,而这些消息要先于WM_CREATE消息被触发(刚才我已经跟踪验证了一下,确实如此),所以你在WM_CREATE消息里面调用DirectDraw初始化函数已经晚了。所以不得不在CreateWindow之前调用。
WM_CREATE消息是CreateWindow()产生的
WM_PAINT消息是UpdateWindow(hwnd);产生的