switch (message)
        
    {
        
    case   WM_CREATE:
        
           
                
        
    case   WM_SIZE:
        
                    
        
        
    case WM_VSCROLL:
        
}
windows从队列里面取出消息
然后经过翻译然后windows调用函数过程的时候
message是只是一个值WM_CREATE
还是
message也是一个队列先赋值message为WM_CREATE
然后再赋值WM_SIZE
再然后赋值WM_VSCROLL??
请高手指教

解决方案 »

  1.   

    WM_CREATE,WM_SIZE等都是微软的一些自定义类型,可以用goto defination来查看一下.
    你写出的这几个只是一些常用的,还有很多
      

  2.   

    message只是一个参数,当系统调用消息处理函数时,会根据当前取得的消息对这个参数进行赋值.message怎么可能会是一个队列呢?消息处理函数在处理完当前消息之后马上就退出了,并不是循环处理各个消息,而是每来一个消息就调用一次.
      

  3.   

    一般来说,WndProc 这个函数不是你来显式调用,而是Windows系统来调的,明白这点你的问题也就清楚了,WM_CREATE,WM_SIZE,WM_VSCROLL都是系统传进来的参数。
      

  4.   

    WM_CREATE 等只是一个数值,#define 出来的。根据数值的不同来确定执行哪个行为。没有什么翻译或队列,不要想复杂了。
      

  5.   


    简单地讲,你可以这样理解:消息队列是一个数据结构,隶属于线程,而“消息”就是一个结构体对象(参照 MSG 结构体)。
    放置消息时,就是产生一个“消息”结构体放到“消息队列”这个数据结构之中;线程中有一个消息泵,它不断检查“消息队列”这个数据结构,如果发现其中有“消息”就把它取出来(最常见的形式就是 GetMessage 返回),然后交给目标去处理(绝大多数情况下消息由对应的窗口过程来处理)。WM_CREATE 消息是不经过消息队列的,不过你可以暂时忽略这种差异。窗口创建时要有一个窗口函数,窗口函数通常就是你的那种“switch”结构。窗口一但创建,就会有一个 WM_CREATE 消息,对你而言就是窗口函数被调用,“switch (message) ” 中 message 的值就等于 WM_CREATE(本质是一个定义数值的宏),所以你就可以这里作一些创建窗口对应的动作。然后随着窗口的活动,会有不同的消息被窗口函数处理,对你而言就是 “switch (message) ” 中 message 的值不同。
    WM_CREATE、WM_SIZE 等都是宏,就是定义了一个数值,目的是不用记忆那些预定义的值,你也可以就把它们换成对应的值。
      

  6.   

    消息的有结构的如下
    typedef struct {
        HWND hwnd;
        UINT message;
        WPARAM wParam;
        LPARAM lParam;
        DWORD time;
        POINT pt;
    } MSG, *PMSG;
    你做的每一件事件。例如你按下键盘的一个键。它会产生扫描码。然后键盘驱动程序把它翻译成消息(填上面的消息结构)然后放到系统消息队列。最后再由操作系统分到每个应用程序的消息队列中。再就是应用程序自己的消息循环等待获得消息进行处理。
    再就是调用DISPATCHMESSAGE把消息分派到窗口过程处理。所以MESSAGE应该是在产生消息时就已经写好了的
      

  7.   

    我很同意楼上的观点:
    消息的有结构的如下 
    typedef struct { 
        HWND hwnd; 
        UINT message; 
        WPARAM wParam; 
        LPARAM lParam; 
        DWORD time; 
        POINT pt; 
    } MSG, *PMSG; WM_CREATE 等只是一个数值,#define 出来的。根据数值的不同来确定执行哪个行为。而这个值可以看成一个ID标识,是在postmessage或sendmessage时填进去的。比如: Postmessage(WM_QUIT, NULL, NULL);
    队列是有的,和线程绑定的。