Window之消息循环机制
来源:互联网 发布:移民新西兰 知乎 编辑:程序博客网 时间:2024/06/06 05:44
简单介绍Windows消息循环机制,一个粗浅的认识。。。。
windows窗口的通用写法,设计窗口类(WNDCLASS),注册窗口类(RegisterClass),创建窗口(CreateWindow),窗口的显示(ShowWindow)与首次绘制(UpdateWindow),消息循环(while(GetMessage)....)。这是windows窗口中的一个套路,多写几次就会记住的。下面说一下消息机制。
windows处理事件是以消息来进行处理的,例如按动键盘是一个消息,鼠标移动也是一个消息。Window程序设计中消息分为两种,一种是队列消息,由Window投递到消息队列中,由消息队列中的函数进行窗口过程的调用。还有一种就是非队列消息,由Window操作系统直接调用而不是投入到消息队列中!!!其实两种都有操作系统的辅助,前者的窗口过程是由自己调用的,后者是由操作系统来调用的...
下面是我一些思考与问题:
Window api编程中有没有中断响应呢?
对于这个,我认为有,因为在WinMain是以循环结束的,即不断处理消息队列中的消息从而调用窗口过程。而对于有操作系统直接调用窗口过程的非队列消息,若无中断则一直不能得到响应,所以我认为有在while(GetMessage())循环中有中断。既然有中断,那么正在处理消息时(这里指执行窗口过程中的语句)是否会被打断呢?答案是,不会被打断。
消息处理时是不会被打断的,且若在消息中发送一个消息SendMessage(),则第二个消息处理完才能视为第一个消息被处理完成...
其次,消息的接收与消息的处理(窗口过程)是不是并发的?所要继续学习了解...
#include<windows.h>#include<stdio.h>#include<stdlib.h>#pragma comment(lib,"WINMM.LIB")LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow){WNDCLASS wndclass;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hInstance=hInstance;wndclass.lpfnWndProc=WinProc;wndclass.lpszClassName=TEXT("NewClass");wndclass.lpszMenuName=NULL;wndclass.style=CS_VREDRAW | CS_HREDRAW;if(!RegisterClass(&wndclass)){MessageBox(NULL,TEXT("Register failed!"),TEXT("Error Message"),MB_OK);return 1;}HWND hwnd=CreateWindow(TEXT("NewClass"),TEXT("My First Window"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);if(!hwnd){MessageBox(NULL,TEXT("Create Window failed!"),TEXT("Error Message"),MB_OK|MB_ICONERROR);return 1;}ShowWindow(hwnd,iCmdShow);UpdateWindow(hwnd);MSG msg;while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);} return 0;}LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){static RECT rect; //保留从WM_SIZE中得到客户区的大小,设为static HDC hdc;PAINTSTRUCT ps;TCHAR szBuffer[100]; switch(message){ case WM_CREATE:PlaySound(TEXT("hello.wav"),NULL,SND_FILENAME|SND_ASYNC); break; case WM_SIZE:rect.bottom = HIWORD(lParam); rect.top=0;rect.right=LOWORD(lParam);rect.left=0;break;case WM_PAINT://GetClientRect(hwnd,&rect); 这里有WM_SIZE来代替hdc = BeginPaint(hwnd,&ps);DrawText(hdc,TEXT("Hello World!"),lstrlen(TEXT("Hello World!")),&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);EndPaint(hwnd,&ps);break;case WM_CLOSE:if(IDYES==MessageBox(NULL,TEXT("Are you close ?"),TEXT("Warning"),MB_YESNO|MB_ICONWARNING)){DestroyWindow(hwnd);}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd,message,wParam,lParam);}return 0;}
0 0
- Window之消息循环机制
- Window消息循环补遗
- 工作笔记之-Handler消息循环机制
- Window消息传递机制
- Window消息传递机制
- Window消息机制
- window消息机制
- window消息机制(三)
- window消息机制(四)
- window消息机制
- Window消息传递机制
- window消息机制
- Window消息机制
- window消息机制
- android应用消息处理机制分析之消息循环
- SDK消息循环机制
- windows 消息循环机制
- SDK消息循环机制
- 用iSlider实现手机端图片轮转
- 【建议28:理解延迟求值和主动求值之间的区别】
- 字符串 KMP HDU 2203
- tomcat集群配置
- jquery 教程
- Window之消息循环机制
- Codeforces404C【构造】
- nagios 部署笔记
- JNI/NDK开发指南(七)---调用构造方法和父类实例方法
- linux添加超级管理员用户,修改,删除用户
- 关于linux load average的深入了解
- Leetcode 136. Single Number (Medium) (cpp)
- RTAB-Mapping SLAM 使用初步
- MySQL主库高可用 -- 双主单活故障自动切换方案