windows消息运行机制
- 格式:docx
- 大小:20.52 KB
- 文档页数:6
1.消息在windows程序中,消息是由MSG结构体来表示的。
typedfstructtagMSG(HWND hwnd; //消息所属窗口UINT message; //指定消息的标识符,不同的消息对应不同的数值,但是由于数值不便于记忆,windows将消息对应的数值定义为WM_XXX宏。
例如WM_LBUTTONDOWN;WPARAM wParam; // wParam和lParam用于指定消息的附加信息LPARAM lParam;DWORD time; //表示消息投递到消息队列中的时间POINT pt; //表示鼠标的当前位置)msg;2.WinMain函数的定义int WINAPI WinMain(HINSTANCE hInstance, //表示该程序当前运行的实例的句柄,这好似一个数值HINSTANCE hPrevInstance, //表示当前实例的前一个实例的句柄LPSTR lpCmdLine, //一个以空终止的字符串intnCmdShow //指定程序的窗口应该如何显示);3.窗口的创建①设计一个窗口;②注册窗口;③创建窗口;④显示及更新窗口。
(1) 设计一个窗口类typedefstruct _WNDCLASS(UINT style; //指定这一类型窗口的样式WNDPROC lpfnWndProc; //函数指针,指向窗口过程函数intcbClsExtra; //类附加内存intcbWndExtra;HANDLE hInstance; //包含窗口过程的程序的实例句柄HICON hIcon; //指定窗口的图标句柄HCURSOR hCursor; //指定窗口类的光标句柄HBRUSH hbrBackground; //指定窗口类的背景画刷句柄LPCTSTR lpszMenuName; //一个以空终止的字符串,指定菜单资源的名字LPCTSTR lpszClassName; //一个以空终止的字符串。
指定窗口类的名字)WNDCLASS;(2) 注册窗口类ATOM RegisterClass(CONST WNDCLASS *lpfnWndClass); //只有一个参数,即窗口类对象的指针(3) 创建窗口HWND CreateWindow(LPCTSTR lpClassName, //指定窗口类的名字LPCTSTR lpWindowName,//指定窗口的名字DWORD dwStyle, //指定创建窗口的样式int x, //x.y,nWidth,nHeight分别指定窗口左上角的x,y坐标和窗口的宽度,高度int y, //intnWidth, //intnHeight, //HWND hWndparent, //指定被创建窗口的父窗口句柄HMENU hMenu, //指定窗口菜单的句柄HANDLE hInstance, //指定窗口所属的应用程序实例的句柄LPVOID lpParm, //作为WM_CREATE消息的附加参数lParam传入的数据指针);(4) 显示及更新窗口BOOL ShowWindow(HWND hWnd, //创建窗口后返回的句柄intnCmdShow //指定窗口的显示状态);BOOL UpdateWindow(HWND hwnd //创建窗口后返回的句柄);4.消息循环BOOL GetMessage(LPMSG lpMsg, //指向一个消息结构体,GetMessage从线程的消息队列中取出的消息信息将保存在该结构体对象中HWND hwnd, // 指定接收属于哪一个窗口的消息UINT wMsgFilterMin, //指定要获取消息的最小值UINT wMsgFilterMax //指定要获取消息的最大值);例:/*****************************************************GetMessage函数只有在接收到WM_QUIT消息时才返回0。
才会挑出while循环。
否则将始终处于运行状态******************************************************/MSG msgwhile(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg); //翻译消息DispatchMessage(&msg); //将消息回传给操作系统}5.编写窗口过程函数LRESULT CALLBACK windowProc(HWND hwnd, //窗口句柄UINT uMsg, //消息代码,由TranslateMessage翻译得到WPARAM wParam, //消息附加参数LPARAM lParam //消息附加参数);//窗口过程函数的名字可以随便取,在窗口过程函数内部使用switch/case语句来确定窗口过程接收到的是什么消息例:switch(uMag){case WM_CHAR:......break;case WM_LBUTTONDOEN://用户左击MessageBox(hwnd,"mouse clicked","message",0);//弹出消息窗口告诉用户点击了鼠标HDC hdc;//创建一个DC对象hdc=GetDC(hwnd);//用hdc保存GetDC函数返回的与特定窗口相关联的DC的句柄TextOut(hdc,0,50,"陈祥",strlen("陈祥"));//在窗口(0,50)的位置处输出一行文字ReleaseDC(hwhdc,hdc);//释放DC所占用的资源,否则会引起内存泄漏break;....default;returnDefWindowProc(hwnd,uMag,wParam,lParam);};创建一个Win32应用程序的步骤:①编写WinMain函数,可以在MSDN上查找并复制;②设计窗口类;③注册窗口类;④创建窗口;⑤显示并更新窗口;⑥编写消息循环;⑦编写窗口过程函数。
窗口过程函数的语法,可通过MSDN查看WNDCLASS的lpfnWndProc 成员变量,在这个成员的解释中可以查到。
WinMain.cpp/******************************************************这是一个Win32 Application类型的项目,主要功能是建立一个窗口*******************************************************/#include <windows.h>#include <stdio.h>LRESULT CALLBACK WinSunProc(HWND hwnd, //窗口句柄UINT uMsg, //消息代码,由TranslateMessage翻译得到WPARAM wParam, //消息附加参数LPARAM lParam //消息附加参数);int WINAPI WinMain(HINSTANCE hInstance, //表示该程序当前运行的实例的句柄,这好似一个数值HINSTANCE hPrevInstance, //表示当前实例的前一个实例的句柄LPSTR lpCmdLine, //一个以空终止的字符串intnCmdShow //指定程序的窗口应该如何显示){//设计一个窗口类WNDCLASS wndcls;wndcls.cbClsExtra=0;wndcls.cbWndExtra=0;wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);wndcls.hIcon=LoadIcon(NULL,IDI_INFORMATION);wndcls.hInstance=hInstance;//应用程序实例句柄由WinMain函数传进来wndcls.lpfnWndProc=WinSunProc;wndcls.lpszClassName="chenxiang2016";wndcls.lpszMenuName=NULL;wndcls.style=CS_HREDRAW | CS_VREDRAW;RegisterClass(&wndcls);//创建一个窗口,定义一个变量用来保存成功创建窗口后返回的句柄HWND hwnd;hwnd=CreateWindow("chenxiang2016","窗口测试",WS_OVERLAPPEDWINDOW, 0,0,600,400,NULL,NULL,hInstance,NULL);//显示及刷新窗口ShowWindow(hwnd,SW_SHOWNORMAL);UpdateWindow(hwnd);//定义消息结构体,开始消息循环MSG msg;while (GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}//用下面的while循环出现鼠标一碰到窗口就退出的现象// BOOL bRet;// while ((bRet==GetMessage(&msg,hwnd,0,0))!=0)// {// if (bRet==-1)// {// return -1;// }// else// {// TranslateMessage(&msg);// DispatchMessage(&msg);// }// }returnmsg.wParam;}//编写窗口过程函数LRESULT CALLBACK WinSunProc(HWND hwnd, //窗口句柄UINT uMsg, //消息代码,由TranslateMessage翻译得到WPARAM wParam, //消息附加参数LPARAM lParam //消息附加参数){switch(uMsg){case WM_CHAR:charszChar[20];sprintf(szChar,"char code is %d",wParam);MessageBox(hwnd,szChar,"char",0);break;case WM_LBUTTONDOWN:MessageBox(hwnd,"鼠标左击了","提示",0);//弹出消息窗口告诉用户点击了鼠标HDC hdc;//创建一个DC对象hdc=GetDC(hwnd);//用hdc保存GetDC函数返回的与特定窗口相关联的DC的句柄TextOut(hdc,0,20,"赵丹华傻逼!",strlen("赵丹华傻逼!"));//在窗口(0,20)的位置处输出一行文字ReleaseDC(hwnd,hdc);//释放DC所占用的资源,否则会引起内存泄漏break;case WM_PAINT:HDC hDC;PAINTSTRUCT ps;hDC=BeginPaint(hwnd,&ps);TextOut(hDC,0,0,"陈祥",strlen("陈祥"));EndPaint(hwnd,&ps);break;case WM_CLOSE:if (IDYES==MessageBox(hwnd,"是否真的结束?","退出提示",MB_YESNO)){DestroyWindow(hwnd);}break;case WM_DESTROY:PostQuitMessage(0);break;case WM_RBUTTONDOWN:HDC hdc1;hdc1=GetDC(hwnd);MoveToEx(hdc1,0,50,NULL);LineTo(hdc1,400,50);ReleaseDC(hwnd,hdc1);break;default:returnDefWindowProc(hwnd,uMsg,wParam,lParam);}return 0;}。