设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 服务器 > 系统 > 正文

win32消息机制

发布时间:2021-01-04 14:41 所属栏目:52 来源:网络整理
导读:windows操作系统最大的特殊是良好的用户交互性 消息机制:产生消息,传递消息并处理消息的过程 1.产生消息 不可控 1 typedef struct tagMSG 2 { 3 HWND hwnd; // 窗口句柄 4 UINT message; // 消息id 5 WPARAM wParam; // 消息的辅助参数 6 LPARAM lParam; /

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,PM_REMOVE))//最后一个参数表示从消息队列移除消息
 5         {
 6             if (!TranslateAccelerator(msg.hwnd,&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);//理解为排队,把消息直接投递给窗口对应的消息队列,以供下一次得到消息时从消息队列取出
 8                             Sleep(1000);
 9                             hdc = GetDC(hWnd);
10                             TextOut(hdc,_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,_T("keydown"),7);
19                         ReleaseDC(hWnd,hdc);
20     }
21         break;

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读