| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1838 人关注过本帖, 1 人收藏
标题:有容兄请进,关于Windows消息循环机制,高手略过本帖。
只看楼主 加入收藏
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
结帖率:98.48%
收藏(1)
 问题点数:0 回复次数:27 
有容兄请进,关于Windows消息循环机制,高手略过本帖。
如何正确理解消息循环机制,罗云彬的汇编例子举得很好,所以偶昨天花了点时间,把汇编的改成C语言,你可以按着最上面的提示,开启一个空的记事本,然后运行本程序。

程序代码:
/**
; MsgWindow.cpp (MsgWindows01)
; 将窗口的消息流程显示到 Notepad 进程的编辑窗口中
    通过该程序,你可以查看,在一个窗口中创建过程中会接收到哪些消息,
    移动鼠标到窗体上,看看看有哪些消息没有经过消息循环,直接发送到窗口过程中了。
    然后查看一下当点击关闭按钮时,窗口会接收到哪些消息。
        想知道TranslateMessage函数倒底起什么作用,不妨修改程序注释之。
    直观的理解Windows窗体消息机制就是这样的,是不是很简单?

 */

#include <windows.h>
//消息索引表
UINT dwMsgTable[]    =    {WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_SIZE,
                        WM_ACTIVATE, WM_SETFOCUS, WM_KILLFOCUS,WM_ENABLE,WM_SETREDRAW,
                        WM_SETTEXT,WM_GETTEXT,WM_GETTEXTLENGTH,WM_PAINT,WM_CLOSE,
                        WM_QUERYENDSESSION,WM_QUIT,WM_QUERYOPEN,WM_ERASEBKGND,WM_SYSCOLORCHANGE,
                        WM_ENDSESSION,WM_SHOWWINDOW,WM_WININICHANGE,WM_DEVMODECHANGE,WM_ACTIVATEAPP,
                        WM_FONTCHANGE,WM_TIMECHANGE,WM_CANCELMODE,WM_SETCURSOR,WM_MOUSEACTIVATE,
                        WM_CHILDACTIVATE,WM_QUEUESYNC,WM_GETMINMAXINFO,WM_PAINTICON,WM_ICONERASEBKGND,
                        WM_NEXTDLGCTL,WM_SPOOLERSTATUS,WM_DRAWITEM,WM_MEASUREITEM,WM_DELETEITEM,
                        WM_VKEYTOITEM,WM_CHARTOITEM,WM_SETFONT,WM_GETFONT,WM_SETHOTKEY,WM_GETHOTKEY,
                        WM_QUERYDRAGICON,WM_COMPAREITEM,WM_GETOBJECT,WM_COMPACTING,/*WM_OTHERWINDOWCREATED,*/
                        /*WM_OTHERWINDOWDESTROYED,*/WM_COMMNOTIFY,WM_WINDOWPOSCHANGING,WM_WINDOWPOSCHANGED,WM_POWER,
                        WM_COPYDATA,WM_CANCELJOURNAL,WM_NOTIFY,WM_INPUTLANGCHANGEREQUEST,WM_INPUTLANGCHANGE,
                        WM_TCARD,WM_HELP,WM_USERCHANGED,WM_NOTIFYFORMAT,WM_CONTEXTMENU,
                        WM_STYLECHANGING,WM_STYLECHANGED,WM_DISPLAYCHANGE,WM_GETICON,WM_SETICON,
                        WM_NCCREATE,WM_NCDESTROY,WM_NCCALCSIZE,WM_NCHITTEST,WM_NCPAINT,
                        WM_NCACTIVATE,WM_GETDLGCODE,WM_SYNCPAINT,WM_NCMOUSEMOVE,WM_NCLBUTTONDOWN,
                        WM_NCLBUTTONUP,WM_NCLBUTTONDBLCLK,WM_NCRBUTTONDOWN,WM_NCRBUTTONUP,WM_NCRBUTTONDBLCLK,
                        WM_NCMBUTTONDOWN,WM_NCMBUTTONUP,WM_NCMBUTTONDBLCLK,WM_KEYDOWN,WM_KEYUP,
                        WM_CHAR,WM_DEADCHAR,WM_SYSKEYDOWN,WM_SYSKEYUP,WM_SYSCHAR,
                        WM_SYSDEADCHAR,WM_KEYLAST,WM_INITDIALOG,WM_COMMAND,WM_SYSCOMMAND,
                        WM_TIMER,WM_HSCROLL,WM_VSCROLL,WM_INITMENU,WM_INITMENUPOPUP,
                        WM_MENUSELECT,WM_MENUCHAR,WM_ENTERIDLE,WM_CTLCOLORMSGBOX,WM_CTLCOLOREDIT,
                        WM_CTLCOLORLISTBOX,WM_CTLCOLORBTN,WM_CTLCOLORDLG,WM_CTLCOLORSCROLLBAR,WM_CTLCOLORSTATIC,
                        WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBLCLK,WM_RBUTTONDOWN,
                        WM_RBUTTONUP,WM_RBUTTONDBLCLK,WM_MBUTTONDOWN,WM_MBUTTONUP,WM_MBUTTONDBLCLK,
                        WM_MOUSELAST,WM_PARENTNOTIFY,WM_ENTERMENULOOP,WM_EXITMENULOOP,WM_MDICREATE,
                        WM_MDIDESTROY,WM_MDIACTIVATE,WM_MDIRESTORE,WM_MDINEXT,WM_MDIMAXIMIZE,
                        WM_MDITILE,WM_MDICASCADE,WM_MDIICONARRANGE,WM_MDIGETACTIVE,WM_MDISETMENU,
                        WM_DROPFILES,WM_MDIREFRESHMENU,WM_CUT,WM_COPY,WM_PASTE,
                        WM_CLEAR,WM_UNDO,WM_RENDERFORMAT,WM_RENDERALLFORMATS,WM_DESTROYCLIPBOARD,
                        WM_DRAWCLIPBOARD,WM_PAINTCLIPBOARD,WM_VSCROLLCLIPBOARD,WM_SIZECLIPBOARD,WM_ASKCBFORMATNAME,
                        WM_CHANGECBCHAIN,WM_HSCROLLCLIPBOARD,WM_QUERYNEWPALETTE,WM_PALETTEISCHANGING,WM_PALETTECHANGED,
                        WM_HOTKEY,WM_PRINT,WM_PRINTCLIENT,WM_PENWINFIRST,WM_PENWINLAST,
                        WM_MENURBUTTONUP,WM_MENUDRAG,WM_MENUGETOBJECT,WM_UNINITMENUPOPUP,WM_MENUCOMMAND,
                        WM_NEXTMENU,WM_SIZING,WM_CAPTURECHANGED,WM_MOVING,WM_POWERBROADCAST,
                        WM_DEVICECHANGE,WM_ENTERSIZEMOVE,WM_EXITSIZEMOVE};

int MSG_TABLE_LEN = sizeof(dwMsgTable) / sizeof(UINT);

//消息字符串表
char *szStringTable[] = {
            "WM_NULL                  ",
            "WM_CREATE                ",
            "WM_DESTROY               ",
            "WM_MOVE                  ",
            "WM_SIZE                  ",
            "WM_ACTIVATE              ",
            "WM_SETFOCUS              ",
            "WM_KILLFOCUS             ",
            "WM_ENABLE                ",
            "WM_SETREDRAW             ",
            "WM_SETTEXT               ",
            "WM_GETTEXT               ",
            "WM_GETTEXTLENGTH         ",
            "WM_PAINT                 ",
            "WM_CLOSE                 ",
            "WM_QUERYENDSESSION       ",
            "WM_QUIT                  ",
            "WM_QUERYOPEN             ",
            "WM_ERASEBKGND            ",
            "WM_SYSCOLORCHANGE        ",
            "WM_ENDSESSION            ",
            "WM_SHOWWINDOW            ",
            "WM_WININICHANGE          ",
            "WM_DEVMODECHANGE         ",
            "WM_ACTIVATEAPP           ",
            "WM_FONTCHANGE            ",
            "WM_TIMECHANGE            ",
            "WM_CANCELMODE            ",
            "WM_SETCURSOR             ",
            "WM_MOUSEACTIVATE         ",
            "WM_CHILDACTIVATE         ",
            "WM_QUEUESYNC             ",
            "WM_GETMINMAXINFO         ",
            "WM_PAINTICON             ",
            "WM_ICONERASEBKGND        ",
            "WM_NEXTDLGCTL            ",
            "WM_SPOOLERSTATUS         ",
            "WM_DRAWITEM              ",
            "WM_MEASUREITEM           ",
            "WM_DELETEITEM            ",
            "WM_VKEYTOITEM            ",
            "WM_CHARTOITEM            ",
            "WM_SETFONT               ",
            "WM_GETFONT               ",
            "WM_SETHOTKEY             ",
            "WM_GETHOTKEY             ",
            "WM_QUERYDRAGICON         ",
            "WM_COMPAREITEM           ",
            "WM_GETOBJECT             ",
            "WM_COMPACTING            ",
            /*"WM_OTHERWINDOWCREATED    ",*/
            /*"WM_OTHERWINDOWDESTROYED  ",*/
            "WM_COMMNOTIFY            ",
            "WM_WINDOWPOSCHANGING     ",
            "WM_WINDOWPOSCHANGED      ",
            "WM_POWER                 ",
            "WM_COPYDATA              ",
            "WM_CANCELJOURNAL         ",
            "WM_NOTIFY                ",
            "WM_INPUTLANGCHANGEREQUEST",
            "WM_INPUTLANGCHANGE       ",
            "WM_TCARD                 ",
            "WM_HELP                  ",
            "WM_USERCHANGED           ",
            "WM_NOTIFYFORMAT          ",
            "WM_CONTEXTMENU           ",
            "WM_STYLECHANGING         ",
            "WM_STYLECHANGED          ",
            "WM_DISPLAYCHANGE         ",
            "WM_GETICON               ",
            "WM_SETICON               ",
            "WM_NCCREATE              ",
            "WM_NCDESTROY             ",
            "WM_NCCALCSIZE            ",
            "WM_NCHITTEST             ",
            "WM_NCPAINT               ",
            "WM_NCACTIVATE            ",
            "WM_GETDLGCODE            ",
            "WM_SYNCPAINT             ",
            "WM_NCMOUSEMOVE           ",
            "WM_NCLBUTTONDOWN         ",
            "WM_NCLBUTTONUP           ",
            "WM_NCLBUTTONDBLCLK       ",
            "WM_NCRBUTTONDOWN         ",
            "WM_NCRBUTTONUP           ",
            "WM_NCRBUTTONDBLCLK       ",
            "WM_NCMBUTTONDOWN         ",
            "WM_NCMBUTTONUP           ",
            "WM_NCMBUTTONDBLCLK       ",
            "WM_KEYDOWN               ",
            "WM_KEYUP                 ",
            "WM_CHAR                  ",
            "WM_DEADCHAR              ",
            "WM_SYSKEYDOWN            ",
            "WM_SYSKEYUP              ",
            "WM_SYSCHAR               ",
            "WM_SYSDEADCHAR           ",
            "WM_KEYLAST               ",
            "WM_INITDIALOG            ",
            "WM_COMMAND               ",
            "WM_SYSCOMMAND            ",
            "WM_TIMER                 ",
            "WM_HSCROLL               ",
            "WM_VSCROLL               ",
            "WM_INITMENU              ",
            "WM_INITMENUPOPUP         ",
            "WM_MENUSELECT            ",
            "WM_MENUCHAR              ",
            "WM_ENTERIDLE             ",
            "WM_CTLCOLORMSGBOX        ",
            "WM_CTLCOLOREDIT          ",
            "WM_CTLCOLORLISTBOX       ",
            "WM_CTLCOLORBTN           ",
            "WM_CTLCOLORDLG           ",
            "WM_CTLCOLORSCROLLBAR     ",
            "WM_CTLCOLORSTATIC        ",
            "WM_MOUSEMOVE             ",
            "WM_LBUTTONDOWN           ",
            "WM_LBUTTONUP             ",
            "WM_LBUTTONDBLCLK         ",
            "WM_RBUTTONDOWN           ",
            "WM_RBUTTONUP             ",
            "WM_RBUTTONDBLCLK         ",
            "WM_MBUTTONDOWN           ",
            "WM_MBUTTONUP             ",
            "WM_MBUTTONDBLCLK         ",
            "WM_MOUSELAST             ",
            "WM_PARENTNOTIFY          ",
            "WM_ENTERMENULOOP         ",
            "WM_EXITMENULOOP          ",
            "WM_MDICREATE             ",
            "WM_MDIDESTROY            ",
            "WM_MDIACTIVATE           ",
            "WM_MDIRESTORE            ",
            "WM_MDINEXT               ",
            "WM_MDIMAXIMIZE           ",
            "WM_MDITILE               ",
            "WM_MDICASCADE            ",
            "WM_MDIICONARRANGE        ",
            "WM_MDIGETACTIVE          ",
            "WM_MDISETMENU            ",
            "WM_DROPFILES             ",
            "WM_MDIREFRESHMENU        ",
            "WM_CUT                   ",
            "WM_COPY                  ",
            "WM_PASTE                 ",
            "WM_CLEAR                 ",
            "WM_UNDO                  ",
            "WM_RENDERFORMAT          ",
            "WM_RENDERALLFORMATS      ",
            "WM_DESTROYCLIPBOARD      ",
            "WM_DRAWCLIPBOARD         ",
            "WM_PAINTCLIPBOARD        ",
            "WM_VSCROLLCLIPBOARD      ",
            "WM_SIZECLIPBOARD         ",
            "WM_ASKCBFORMATNAME       ",
            "WM_CHANGECBCHAIN         ",
            "WM_HSCROLLCLIPBOARD      ",
            "WM_QUERYNEWPALETTE       ",
            "WM_PALETTEISCHANGING     ",
            "WM_PALETTECHANGED        ",
            "WM_HOTKEY                ",
            "WM_PRINT                 ",
            "WM_PRINTCLIENT           ",
            "WM_PENWINFIRST           ",
            "WM_PENWINLAST            ",
            "WM_MENURBUTTONUP         ",
            "WM_MENUDRAG              ",
            "WM_MENUGETOBJECT         ",
            "WM_UNINITMENUPOPUP       ",
            "WM_MENUCOMMAND           ",
            "WM_NEXTMENU              ",
            "WM_SIZING                ",
            "WM_CAPTURECHANGED        ",
            "WM_MOVING                ",
            "WM_POWERBROADCAST        ",
            "WM_DEVICECHANGE          ",
            "WM_ENTERSIZEMOVE         ",
            "WM_EXITSIZEMOVE          ",
};

const char* szClassName        =    "MyClass";
const char* szCaptionMain    =    "Message Tester";

const char* szDestClass        =    "Notepad";
const char* szFormat        =    "WndProc: [%04x]%s %08x %08x\n";
const char* szCreateWindow1    =    "Creating Window...\n";
const char* szCreateWindow2    =    "CreateWindow end\n";
const char* szShowWindow1    =    "Showing Window...\n";
const char* szShowWindow2    =    "ShowWindow end\n";
const char* szUpdateWindow1    =    "Updating Window...\n";
const char* szUpdateWindow2    =    "UpdateWindow end\n";
const char* szGetMsg1        =    "Getting Message...\n";
const char* szGetMsg2        =    "[%04x]Message gotten\n";
const char* szDispatchMsg1    =    "Dispatching Message...\n";
const char* szDispatchMsg2    =    "DispatchMessage end\n";

////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK ProcWinMain(HWND, UINT, WPARAM, LPARAM);
void SendtoNotepad(const char *);
void ShowMessage(UINT, WPARAM, LPARAM);
////////////////////////////////////////////////////////////////////////

//主程序入口
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hpre, 
                   LPSTR linecmd, int nShow)
{
    char szBuffer[128];
    WNDCLASSEX wnd;
    MSG msg;
    HWND hwnd;

    memset(&wnd, 0, sizeof(WNDCLASSEX));
    wnd.cbSize = sizeof(WNDCLASSEX);
    wnd.hInstance = hinst;
    wnd.style = CS_HREDRAW | CS_VREDRAW;
    wnd.lpfnWndProc = ProcWinMain;
    wnd.hbrBackground = (HBRUSH) 1;
    wnd.lpszClassName = szClassName;
    wnd.hCursor = LoadCursor(NULL, IDC_ARROW);

    RegisterClassEx(&wnd);

    SendtoNotepad(szCreateWindow1);
    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,
        szClassName, szCaptionMain,
        WS_OVERLAPPEDWINDOW,
        50,50,100,100,
        0, 0, hinst, 0);

    SendtoNotepad(szCreateWindow2);

    SendtoNotepad(szShowWindow1);
    ShowWindow(hwnd, SW_SHOWNORMAL);
    SendtoNotepad(szShowWindow2);

    SendtoNotepad(szUpdateWindow1);
    UpdateWindow(hwnd);
    SendtoNotepad(szUpdateWindow2);

    //消息循环
    while(TRUE)
    {
        int ret;
        
        SendtoNotepad(szGetMsg1);
        ret = GetMessage(&msg, NULL, 0, 0);
        wsprintf(szBuffer, szGetMsg2, msg.message);
        SendtoNotepad(szBuffer);

        if ( ret == 0 ) break;

        TranslateMessage(&msg);
        SendtoNotepad(szDispatchMsg1);
        DispatchMessage(&msg);
        SendtoNotepad(szDispatchMsg2);
    }

    return (int)msg.wParam;

}

//窗口过程
LRESULT CALLBACK ProcWinMain(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    ShowMessage(uMsg, wParam, lParam);
    switch(uMsg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

//查找消息说明字符串,并翻译格式发送到 Notepad 窗口
void ShowMessage(UINT _uMsg, WPARAM _wParam, LPARAM _lParam)
{
    char szBuffer[128];
    int i;

    for(i = 0; i < MSG_TABLE_LEN; i++)
    {
        if(_uMsg == dwMsgTable[i])
        {
            wsprintf(szBuffer, szFormat, _uMsg, szStringTable[i], _wParam, _lParam);
            SendtoNotepad(szBuffer);            
        }
    }
}

//查找 NotePad 窗口中的Edit控件句柄,然后把字符串中的字符以WM_CHAR消息发送到Edit中。
void SendtoNotepad(const char *_lpsz)
{
    HWND hWinNodepad;
    hWinNodepad = FindWindow(szDestClass, NULL);
    if(hWinNodepad)
    {
        POINT pt = {20, 20};
        hWinNodepad = ChildWindowFromPoint(hWinNodepad, pt);
        if(hWinNodepad)
        {
            int slen, i;
            slen = strlen(_lpsz);
            for(i = 0; i < slen; i++)
            {
                PostMessage(hWinNodepad, WM_CHAR, _lpsz[i], 1);
            }

        }
    }

}


附全部工程及汇编源代码:
C工程:
MsgWindow.rar (17.65 KB)

汇编工程:
MsgWindow01.rar (4.07 KB)
搜索更多相关主题的帖子: 记事本 编辑 Windows C语言 
2012-04-28 11:07
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
hellovfp 大哥 谢谢先 有劳你了 我去运行下看

梅尚程荀
马谭杨奚







                                                       
2012-04-28 11:40
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 2楼 有容就大
关于这段程序,偶找了一个原书第一版的:
不懂汇编没有关系,你可以对照着看里面的中文,Win32程序编译图解请看第二章,Win32可执行文件的开发过程一节。
然后对照着里面第四章的内容和实验一程序中的中文解释,看C程序既可明白。
Windows环境下32位汇编语言程序设计(罗云彬)第一版完全版CHM和源码.rar (3.17 MB)

我们都在路上。。。。。
2012-04-28 12:11
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
再送你两个资源:
http://
编译原理(原书第2版)(龙书)--.pdf
http://
[现代操作系统].(荷)Andrew.S.Tanenbaum.扫描版.pdf

这两本是经典的兰皮书,可以深入学习,不把思维局限在你现在学习的C程序上。

我们都在路上。。。。。
2012-04-28 12:18
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
去运行了你的程序 vc下能有几个消息库里没包含我就注释掉了 然后能运行 VS下没问题

但是怎么嵌入到我的记事本中?本来想上传我的源代码 等了半天传不上了 看了下压缩后有80多MB 超出上传限制了吗

看了下WIN32汇编, 它对基本原理的阐释比WINDOWS程序设计要详细的多 就是我汇编没入门 不知道后面能不能看懂 不过对照C语言的源代码看汇编代码还是能知道他的大致流程。

梅尚程荀
马谭杨奚







                                                       
2012-04-28 12:46
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 4楼 hellovfp
嗯 去下了 学习。

梅尚程荀
马谭杨奚







                                                       
2012-04-28 12:50
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 5楼 有容就大
哦,对的,有几个消息需要新的SDK,不过有编译成的EXE可以直接执行的。
不会吧,你的记事本原代码80MB?你可以看偶上传的代码中,其实只包括dsw,dsp,cpp文件和Release目录中的一个EXE,其它文件都删除了的。特别是生成的PCH预编译那个文件特大。
http://www. 这里有一个VC工程清理器,可以做这个工作。如果是VS的可以找一下有没有相应的类似小工具。

论坛帖子可能上传也有上限,具体是多少我也不知道,刚传的3MB左右的可以。
呵呵,不必在意汇编,其实读读上面的中文部分还是有很有趣的,另外图形GDI程序的两种典型结构,在本汇编书中也有提到,这个在其它二本书中没有讲的。

我们都在路上。。。。。
2012-04-28 12:58
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
如果你想让这个程序跑到你的记事本中显示消息,呵呵,想想怎么修改原程序可以做到,偶先不说答案。

我们都在路上。。。。。
2012-04-28 12:59
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
埋头苦读吧,相信经过这段时间的学习,你的程序视野会大大搞高。
然后古语常说:书中自有颜如玉,书中自有黄金屋,看书的同时,轻弹你的小手打打代码,很爽吧?

我们都在路上。。。。。
2012-04-28 13:07
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 9楼 hellovfp
嗯 WIN32汇编是讲了很多原理的东西 对消息机制的讲解还配合流程图片 不错的一本书。

梅尚程荀
马谭杨奚







                                                       
2012-04-28 13:09
快速回复:有容兄请进,关于Windows消息循环机制,高手略过本帖。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043482 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved