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
原创粉丝点击