《深入浅出MFC》笔记(二)

简介:
1,Message Map雏形之实现
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

LONG OnCreate(HWND,UINT,WPARAM,LPARAM);
LONG OnPaint(HWND,UINT,WPARAM,LPARAM);
LONG OnSize(HWND,UINT,WPARAM,LPARAM);
LONG OnCommand(HWND,UINT,WPARAM,LPARAM);
LONG OnSetFocus(HWND,UINT,WPARAM,LPARAM);
LONG OnClose(HWND,UINT,WPARAM,LPARAM);
LONG OnDestroy(HWND,UINT,WPARAM,LPARAM);
LONG OnAbout(HWND,UINT,WPARAM,LPARAM);
LONG OnExit(HWND,UINT,WPARAM,LPARAM);

struct MSGMAP_ENTRY 
{//消息映射表表项
    UINT nMessage;
    LONG (*pfn)(HWND,UINT,WPARAM,LPARAM);
};

MSGMAP_ENTRY _messageEntries[]=
{
    WM_CREATE,OnCreate,
    WM_PAINT,OnPaint,
    WM_SIZE,OnSize,
    WM_COMMAND,OnCommand,
    WM_SETFOCUS,OnSetFocus,
    WM_CLOSE,OnClose,
    WM_DESTROY,OnDestroy
};
MSGMAP_ENTRY _commandEntries[] = 
{
    IDM_ABOUT,OnAbout,
    IDM_EXIT,OnExit
};

LONG OnCreate(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)
{
    return 0;
}
LONG OnPaint(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    hdc = BeginPaint(hWnd, &ps);    
    ::TextOut(hdc,10,10,_T("hello"),5);
    EndPaint(hWnd, &ps);
    return 0;
}
LONG OnSize(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)
{
    return 0;
}
LONG OnCommand(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)
{//处理command
    int i,wmId,wmEvent;
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    int numEntries = sizeof(_commandEntries)/sizeof(_commandEntries[0]);//命令映射表表项数目
    for (i=0;i<numEntries;++i)
    {
        if (_commandEntries[i].nMessage==wmId)
        {//命令匹配
            return (*_commandEntries[i].pfn)(hWnd,nMessage,wParam,lParam);//调用处理函数
        }
    }
    if (i==numEntries)
    {
        return DefWindowProc(hWnd,nMessage,wParam,lParam);
    }
    return 0;
}
LONG OnSetFocus(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)
{
    return 0;
}
LONG OnClose(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)
{
    DestroyWindow(hWnd);
    return 0;
}
LONG OnDestroy(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)
{
    PostQuitMessage(0);
    return 0;
}
LONG OnAbout(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)
{
    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    return 0;
}
LONG OnExit(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)
{
    DestroyWindow(hWnd);
    return 0;
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
     // TODO: 在此放置代码。
    MSG msg;
    HACCEL hAccelTable;
    // 初始化全局字符串
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_CH_1, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);
    // 执行应用程序初始化:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CH_1));
    // 主消息循环:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int i;
    int numEntries = sizeof(_messageEntries)/sizeof(_messageEntries[0]);//消息映射表表项数目
    for (i=0;i<numEntries;++i)
    {
        if (_messageEntries[i].nMessage==message)
        {//消息匹配
            return (*_messageEntries[i].pfn)(hWnd,message,wParam,lParam);//调用处理函数
        }
    }
    if (i==numEntries)
    {
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}


 2,空闲时间的处理
while (TRUE) 
    {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
                break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else 
        {
            OnIdle();
        }
    }

3, PostMessage的使用
LONG OnDestroy(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)
{
    ::PostMessage(hWnd,WM_QUIT,NULL,NULL);
    return 0;
}


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/01/18/1044829.html,如需转载请自行联系原作者
目录
相关文章
|
安全 API 调度
Qt开发笔记:QGLWidget、QOpenGLWidget详解及区别
Qt开发笔记:QGLWidget、QOpenGLWidget详解及区别
Qt开发笔记:QGLWidget、QOpenGLWidget详解及区别
|
分布式数据库 Windows
进入MFC讲坛的前言(四)
MFC的消息映射机制   MFC的设计者们在设计MFC时,紧紧把握一个目标,那就是尽可能使得MFC的代码要小,速度尽可能快。为了这个目标,他们使用了许多技巧,其中很多技巧体现在宏的运用上,实现MFC的消息映射的机制就是其中之一。
869 0
|
前端开发 vr&ar C++
进入MFC讲坛的前言(五)
框窗、视图和文档及其关系   MFC架构的另外一个特色是它的框窗、视图和文档这个三位一体的结构,它是一个典型的MVC(Model、View and Controler)结构。严格的讲,框窗不属于MVC中的任何一项,MFC设计者将框窗加进来是为了能更好的协调文档 和视图。
761 0
|
消息中间件 程序员
进入MFC讲坛的前言(二)
MFC的WinMain   使用MFC编程的程序员刚开始都会提出这样一个问题:我的程序是从哪儿开始执行的?回答是:从WinMain()开始执行的。提出这样的问题是由于在他们所编写的MFC应用中看不到WinMain()函数。
804 0
|
消息中间件 程序员 开发工具
进入MFC讲坛的前言(一)
在这里,我想谈谈自己学习MFC的一些体会。我是从1997年才开始在Window下编写程序的。在这之前,我编写过一些DOS程序,包括一个简单的全屏幕编辑器和一个带函数的表达式解释器,都是一些小的程序。Window 3.1流行后,我开始在它下面编写程序。
901 0