• win32消息机制


    windows操作系统最大的特殊是良好的用户交互性

    消息机制:产生消息,传递消息并处理消息的过程

    1.产生消息 不可控

    1     typedef struct tagMSG
    2     {
    3     HWND hwnd;//窗口句柄
    4     UINT message;//消息id
    5     WPARAM wParam;//消息的辅助参数
    6     LPARAM lParam;//消息的辅助参数
    7     DWORD time;//消息产生的时间
    8     POINT pt;//消息产生时鼠标的坐标
    9     }     MSG;

    2.传递消息(分成两个部分,1、系统传递消息给应用程序 不可控;2.应用程序传递消息给应用程序 可控)

    windows操作系统为每一个正在运行的应用程序维护一个消息队列

    3.消息处理 可控 吧消息当成条件 ,如何去拿到这个条件

    主消息循环: GetMessage是从消息队列中得到消息 如果消息队列没有消息,消息堵塞 等待消息 如果的带了消息,要判断这个消息是否是WM_QUIT消息如果是返回false 如果不是 函数返回true

    1     while (GetMessage(&msg, NULL, 0, 0))//从消息队列取消息,取出来放在第1个参数,最后两个参数表示消息的过滤,第3个参数表示的id到第4个参数表示的id这个区间表示的消息id才能被得到,给0,表示不过滤
    2     {
    3         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))//翻译快捷键
    4         {
    5             TranslateMessage(&msg);//翻译消息,主要做键盘消息的翻译
    6             DispatchMessage(&msg);//投递消息
    7         }
    8     }

    PeekMessage 从消息队列去取得消息,如果消息队列有消息 返回true 没有返回false

     1     ZeroMemory(&msg, sizeof(msg));
     2     while (msg.message != WM_QUIT)
     3     {
     4         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))//最后一个参数表示从消息队列移除消息
     5         {
     6             if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))//翻译快捷键
     7             {
     8                 TranslateMessage(&msg);//翻译消息,主要做键盘消息的翻译
     9                 DispatchMessage(&msg);//投递消息
    10             }
    11         }
    12         //游戏的画面更新
    13         //游戏的数据更新
    14     }

    处理窗口消息中switch内函数

     1 case WM_LBUTTONDOWN://鼠标左键点击消息
     2     {
     3                             ////SendMessage 可以理解为插队,理解为递归,直接把消息投递给窗口对应的消息处理函数
     4                             //SendMessage(hWnd,//发给哪个窗口
     5                             //    WM_KEYDOWN,//发送的消息id
     6                             //    0, 0);//后两个参数表示这个消息id的辅助信息
     7                             PostMessage(hWnd, WM_KEYDOWN, 0, 0);//理解为排队,把消息直接投递给窗口对应的消息队列,以供下一次得到消息时从消息队列取出
     8                             Sleep(1000);
     9                             hdc = GetDC(hWnd);
    10                             TextOut(hdc, 0, 0, _T("button"), 6);
    11                             ReleaseDC(hWnd, hdc);
    12     }
    13         break;
    14     case WM_KEYDOWN://键盘按下消息
    15     {
    16                         Sleep(2000);
    17                         hdc = GetDC(hWnd);
    18                         TextOut(hdc, 200, 0, _T("keydown"), 7);
    19                         ReleaseDC(hWnd, hdc);
    20     }
    21         break;
  • 相关阅读:
    bzoj 3438 小M的作物
    洛谷 1126 机器人搬重物
    hdu 4055 Number String
    顺序对齐
    codevs 1300 文件排版
    NOIP 2015 提高组 Day2
    poj 2484 A Funny Game
    51nod 1548 欧姆诺姆和糖果 (制约关系优化枚举)
    hdu 1907 John (anti—Nim)
    hdu 2516 取石子游戏 (斐波那契博弈)
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/11438542.html
Copyright © 2020-2023  润新知