我用win32API写一个函数,如果在WinMain()函数里消息循环前有我自己的一个初始化函数MyInit()
WinMian(...)
{
    ...
    MyInit();
    while(GetMessage(...))
    {
    }
}
那么程序是先执行我的MyInit()呢还是先执行WM_CREATE消息呢?
还有WM_CREATE消息和WM_PAINT消息又是怎样的关系呢,窗口的第一遍绘图是在程序什么阶段进行的呢?
假如我的MyInit()是一个DirectDraw的初始化函数,我可以把它放到WM_CREATE消息里吗?怎样放呢?
感觉问题有点多,哈哈,不好意思啊,不要觉的我烦人啊....:)

解决方案 »

  1.   

    那么程序是先执行我的MyInit()呢还是先执行WM_CREATE消息呢?看你是先调用CreateWindow这个函数还是先调用MyInit
    调用CreateWindow马上就响应WM_CREATE这个消息了WM_CREATE响应窗口创建
    WM_PAINT响应窗口重绘假如我的MyInit()是一个DirectDraw的初始化函数,我可以把它放到WM_CREATE消息里吗?
    可以,
    当然啦,放在WinMian也可以如果放在WM_CREATE消息里
    那么在你的窗口函数中,响应WM_CREATE这个消息,然后做一些你要的初试话
      

  2.   

    肯定是先运行你的
    WM_CREATE是个消失,虽然有可能在你的函数调用之前被产生出来了,产生出来了并不代表你马上就要处理他,在下面的这段代码里面才开始处理消息的:
        while(GetMessage(...))
        {
        }
    你上面的语句只要还没有运行到,就不好处理任何消息的。另外,那个DirectDraw的初始化函数放在哪儿不重要,只要在使用DirectDraw功能之前调用就行。最后,从楼主问的问题,我猜测,楼主对windows编程的本质还不是很清楚,因此推荐楼主看一下《Windows程序设计》这本书。
      

  3.   

    呵呵,看来有分歧啊,谢谢3楼的建议,WINDOWS程序设计是本好书,我以前已看过,我以前也是持第二种观点的,即WM_CREATE做为消息在循环里处理,但最近我在写一个DirectDraw程序,里面出现了一些问题,让我开始怀疑这个观点,并且我的DirectDraw初始化函数如果放到WM_CREATE里也是无法运行的,但放到WinMain里就一切正常,所以很迷茫啊
      

  4.   

    你可以设2个断点,试一下就知道了会先执行WM_CREATE
    再执行到 while(GetMessage(...))
        {
        }
      

  5.   

    handsomerun(毛毛) 说的对,我说的错了。
    刚才看了一下对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之前调用。
      

  6.   

    还有WM_CREATE消息和WM_PAINT消息又是怎样的关系呢
    WM_CREATE消息是CreateWindow()产生的
    WM_PAINT消息是UpdateWindow(hwnd);产生的