MSG类的定义
BOOL GetMessage(//从消息队列中取消息的函数,返回一个BOOL值,当消息队列中有消息,就返回一个真。
LPMSG lpMsg,//message infomation 存放消息对象的名字就行了
HWND hWnd,//handle to window 设置为NULL的话,就是获取所有线程的消息
UINT wMsgFilterMin,//first message指示最小的消息的值。WM_KEYFIRST可以指示第一个键盘消息
UINT wMsgFilterMax//last message指示最大的消息的值。如果都设置为0,函数将获取所有范围的消息。即取所有消息队列。
);
例如:MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);//对取到的消息对翻译。比如,按下按键,产生WM_KEYDOWN,WM_KEYUP.如果是输入字母(lpParam附加信息提供),那么. ////翻译为WM_CHAR(翻译)
DispatchMessage(&msg);//将收到的消息传递到回调函数。先路由给操作系统,然后操作系统调用回调函数。(投发)
}
----------------------------------
MSG类的定义
typedef struct tagMSG { // msg HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;
HWND:Identifies the window whose window procedure receives the message.也就是一个句柄。
句柄(HANDLE),资源的标识。
操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,又可将句柄细分为图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND)
应用程序实例句柄(HINSTANCE)等等各种类型的句柄。操作系统给每一个窗口制定一个唯一的标识号,即窗口句柄。
UINT:unsigned int 也就是说 message存放的是一些无符号整形变量。例如,我们按下鼠标,就会产生一个UINT数给message,那么问题来了。
这些数字,是很不好记的,微软给这些UINT定义成了一些宏。这些宏是以WM_开头的。比如,按下鼠标左键为WM_LBOTTONDOWN。 其他的宏要用的时候,自己去查MSDN
WPARAM:也是一种整数类型的数据。wParam存放的是message的附加参数,比如,我们按下A键,产生一个WM_CHAR消息,但是不知道按下的是哪个按键,所以,可以将A的ASCII码放在wParam中去。
LPARAM:和WPARAM的意思一样,作用不同。
DWORD:16*2的整数,time:Specifies the time at which the message was posted
POINT:结构体。可以差MSDN。表示了坐标值。pt指示一个光标的位置
int WINAPI WinMain(//windows应用程序的入口函数 HINSTANCE hInstance, //指向当前运行的应用程序实例的句柄。Handle to the current instance of the application HINSTANCE hPrevInstance, //指向前一个运行的应用程序实例的句柄。Handle to the previous instance of the application LPWSTR lpCmdLine, //LP:长指针类型。LPWSTR:一个指向字符串的长指针。lpCmdLine是命令行的参数command line int nShowCmd //nShowCmd,来决定你的应用程序是最小化还是最大化,还是关闭窗口 )//WinMain函数是操作系统调用的,里面的参数都是操作系统自动给的。命令行就是在windows命令行里面调用你写的程序,就像你在命令行敲calc.exe运行计算器一样。 命令行参数就是命令行后面跟的参数,这样就可以给程序传入参了。命令行参数实际上就是main函数的参数。窗口的创建步骤:1.设计一个窗口类2.注册窗口类3.创建窗口4.显示及更新窗口窗口类(设计一个窗口类)typedef struct _WNDCLASS { UINT style; //类的类型。具体查MSDN。。CS_HREDRAW:水平重画。 WNDPROC lpfnWndProc; //用来接收一个函数指针。当窗口产生一个消息,需要一个回调函数来处理这个消息,这个处理消息的函数就是用lpfnWndProc来指定//应用程序调用操作系统的函数,叫调用API,而操作系统调用我们编写的函数,这个被调用的就是回调函数。 int cbClsExtra; //类的一个额外的数据。类的附加内存。通常我们设置为0 int cbWndExtra; //类的一个额外的数据。窗口附加内存。通常我们设置为0 HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; //画刷的句柄,可以设置窗口背景的颜色。 LPCTSTR lpszMenuName; //long pointer const string LPCSTR.//设置菜单的名字。 LPCTSTR lpszClassName; //设置类的名字 } WNDCLASS;设置类的参数step 2:注册窗口类用RegisterClass();ATOM RegisterClass(CONST WNDCLASS *lpWndClass //class data)例如,上面,我们实例化一个类对象 WNDCLASS wndclass; 设置好各种参数后,再RegisterClass(&wndclass);就行了。
step 3:创建一个窗口类
用CreatWindow();
MSDN:
HWND CreateWindow( LPCTSTR lpClassName, //注册的类名。比如lpClassName = "weixin" LPCTSTR lpWindowName, //窗口的名字window name 比如 lpWindowName = "应用程序设计" DWORD dwStyle, //窗口的类型。查相应的宏。WS_OVERLAPPEDWINDOW 产生层叠的窗口。 int x, //窗口的横坐标。可以设置为CW_USEDEFAULT。就是缺省值 int y, int nWidth, //可以设置为CW_USEDEFAULT int nHeight, HWND hWndParent, //父窗口的句柄 HMENU hMenu, //菜单的句柄。如果没有设置为NULL HANDLE hInstance, //实例句柄 PVOID lpParam //作为WM_CREAT的附加参数。用不上的话,就可以设置为NULL。 );step 4:显示窗口BOOL ShowWindow( HWND hWnd, int nCmdShow //show state 可以设置最大化显示,最小化显示 );然后要调用UpdateWindow(hwnd).刷新窗口回调函数(窗口过程函数) WindowProc();LRESULT CALLBACK WindowProc (HWND hwnd,//handle to windowUINT uMsg,//message identifierWPARAM wParam,//first message parameterLPARAM lParam//second message parameter);MessageBox()//产生那种弹出的消息框int MessageBox(
HWND hWnd,//handle to owner window LPCTSTR lpszText, //text in message title LPCTSTR lpszCaption = NULL, //message box title。NULL is the default UINT nType = MB_OK //message box style MB_OK:The message box contains one push button:OK.This is the defualt.
);
HDC:设备上下文的HANDLE。DC和设备驱动程序打交道。这样程序员就不需要和不同平台的设备驱动程序打交道。1.创建一个win32 application的工程。2.添加源文件源文件代码如下:#include<windows.h> #include<stdio.h> LRESULT CALLBACK WinSunProc (//CallBack Function HWND hwnd,//handle to window UINT uMsg,//message identifier WPARAM wParam,//first message parameter LPARAM lParam//second message parameter ); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASS wndcls; wndcls.style=CS_HREDRAW|CS_VREDRAW; wndcls.lpfnWndProc = WinSunProc; wndcls.cbClsExtra = 0; wndcls.cbWndExtra = 0; wndcls.hInstance = hInstance; wndcls.hIcon = LoadIcon(NULL,IDI_APPLICATION); wndcls.hCursor = LoadCursor(NULL,IDC_ARROW); wndcls.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); wndcls.lpszMenuName = NULL; wndcls.lpszClassName = "weixin2013"; //Register WinClass RegisterClass(&wndcls); //Create Windows HWND hwnd; hwnd = CreateWindow("weixin2013","MFC学习",WS_OVERLAPPED,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,SW_SHOWNORMAL); UpdateWindow(hwnd);// //MSG MSG msg; while( GetMessage(&msg,NULL,0,0))//第二个参数设置为NULL是为了捕获任何窗口消息 { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } /********************************************* *Prototype of WinSunProc *********************************************/ LRESULT CALLBACK WinSunProc (//CallBack Function HWND hwnd,//handle to window UINT uMsg,//message identifier WPARAM wParam,//first message parameter LPARAM lParam//second message parameter ) { switch(uMsg) { case WM_CHAR: char name[20]; sprintf(name,"Char is %d",wParam); MessageBox(hwnd,name,"weixin2013",0); break; case WM_LBUTTONDOWN: MessageBox(hwnd,"Mouse Click","weixin2013",0); HDC hdc; hdc = GetDC(hwnd); TextOut(hdc,0,50,"计算机编程语言学习",strlen("计算机编程语言学习")); ReleaseDC(hwnd,hdc); 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,"是否要关闭?","weixin2013",MB_YESNO)) { DestroyWindow(hwnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam);//由于第一次少打了一个return,导致窗口无法弹出 } return 0; }运行效果静态图:![]()
[MFC学习笔记]--MSG结构体
最新推荐文章于 2023-11-27 11:28:20 发布
本文详细介绍了MFC中的MSG结构体,包括其各成员的意义,如hwnd、message、wParam和lParam等。同时,解析了GetMessage函数的工作原理,用于从消息队列中取出消息,并提供了示例代码展示如何处理消息。通过对MSG结构体和GetMessage函数的理解,有助于深入学习Windows编程中的消息处理机制。
2404

被折叠的 条评论
为什么被折叠?



