《深入浅出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,如需转载请自行联系原作者
目录
相关文章
|
数据可视化 JavaScript 前端开发
【专栏】D3.js 和 Tableau 是两种流行的数据可视化工具
【4月更文挑战第27天】D3.js 和 Tableau 是两种流行的数据可视化工具。D3.js,一个JavaScript库,以其灵活性和定制性著称,适合创建复杂、个性化的可视化效果,但需要编程技能。Tableau,一款用户友好的分析软件,提供直观界面和强大分析功能,适合快速生成常见图表。在选择时,应考虑项目需求、团队技术能力、数据规模和性能要求。两者可单独使用,也可结合发挥各自优点。随着数据可视化需求的增长,这些工具将持续发展并提供更好的解决方案。
490 1
|
数据采集 传感器 监控
如何在LabVIEW中使用FPGA模块
如何在LabVIEW中使用FPGA模块
755 1
|
机器学习/深度学习
斯坦福大学博士在GitHub发布的漫画机器学习小抄,竟斩获129k标星
斯坦福大学数据科学博士Chris Albon在GitHub上发布了一份超火的机器学习漫画小抄,发布仅仅一天就斩获GitHub榜首标星暴涨120k,小编有幸获得了一份并把它翻译成中文版本,今天给大家分享出来!
665 14
斯坦福大学博士在GitHub发布的漫画机器学习小抄,竟斩获129k标星
|
算法 安全 数据安全/隐私保护
TLS 1.3 相比 TLS 1.2 在性能上有哪些提升
TLS 1.3 相比 TLS 1.2 在性能上有哪些提升
697 4
|
算法 C语言
深入理解算法效率:时间复杂度与空间复杂度
深入理解算法效率:时间复杂度与空间复杂度
|
Kubernetes Linux 数据安全/隐私保护
k8s安装环境准备:Virtualbox安装CentOS;复制多个CentOS虚拟机
k8s安装环境准备:Virtualbox安装CentOS;复制多个CentOS虚拟机
358 0
|
Java Maven Android开发
Maven常用命令
常用命令 编译源代码: mvn compile 编译测试代码:mvn test-compile 运行测试:mvn test 产生site:mvn site 打包:mvn package 在本地Repository中安装jar:mvn install 清除产生的项目:mvn clean 生成eclipse项目:mvn eclipse:ec
3018 0
|
消息中间件 缓存 架构师
2024年阿里Android高级面试题分享,附学习笔记+面试整理+进阶书籍
2024年阿里Android高级面试题分享,附学习笔记+面试整理+进阶书籍
|
安全 数据库 数据安全/隐私保护