[MFC学习笔记]--MSG结构体

本文详细介绍了MFC中的MSG结构体,包括其各成员的意义,如hwnd、message、wParam和lParam等。同时,解析了GetMessage函数的工作原理,用于从消息队列中取出消息,并提供了示例代码展示如何处理消息。通过对MSG结构体和GetMessage函数的理解,有助于深入学习Windows编程中的消息处理机制。

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 window
UINT uMsg,//message identifier
WPARAM wParam,//first message parameter
LPARAM 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;
}
运行效果静态图:


 
 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值