Windows编程3:消息循环

消息

Q:什么是消息?
A:消息是窗口感应用户动作的一种机制。

Q:消息有什么用?
A:消息的用处是可以让窗口根据用户的动作来实施相应的回应和动作

消息循环

处理消息的循环机制,通常有一处理函数来处理消息,消息处理函数就放在在之前的

wc.lpfnWndProc=/*消息处理函数*/;

消息处理函数

LRESULT CALLBACK WndProc(HWND hwnd, //是哪个窗口发来的消息。
UINT Message, //消息是什么?
WPARAM wParam, //附加的消息
LPARAM lParam)//附加的消息2
{
	return DefWindowProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
}
...
wc.lpfnWndProc=WndProc();
...

细心的人发现了,这儿的WndProc,不就是返回了一个名字叫DefWindowProc的东西吗,但这DefWindowProc又是什么呢,它翻译过来即“缺省的消息处理函数”,它会按照先前设定的来执行,不需我们再去管他。有人要问了:“那就直接把他放到‘wc.lpfnWndProc’里去么。”这也是可以的,所以有代码:

...
wc.lpfnWndProc=DefWndProc();
...

不过我还是推荐额外写一个函数,因为我们将来会“省”一些消息的,所以,现在的代码成了这样:

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, //是哪个窗口发来的消息。
UINT Message, //消息是什么?
WPARAM wParam, //附加的消息
LPARAM lParam)//附加的消息2
{
	return DefWindowProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	WNDCLASSEX wc;//一个窗口类
	HWND hwnd;//还记得这个是什么吗?对,就是窗口句柄
	MSG Msg;//消息

	memset(&wc,0,sizeof(wc));
	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.lpfnWndProc	 = WndProc; 
	wc.hInstance	 = hInstance;//他要你传一个应用程序实例句柄
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);//他说要个鼠标句柄
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);//请告诉它窗口的颜色,可以不要加1,也可以加2、加3都可以
	wc.lpszClassName = "WindowClass";//窗口类名,注意不是窗口标题、窗口名
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION); //他说他要一个图标
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION); //emm...这个就跟上面的填一样的

/*
LoadIcon会传回一个图标句柄
LoadCursor会传回一个鼠标句柄
*/

	if(!RegisterClassEx(&wc)) {
		MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}//注册窗口,如果注册失败,则弹出对话框

	hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,//EX窗口风格
	"WindowClass",//刚才所说的窗口类名
	"Caption",//这个就是窗口标题啦
	WS_VISIBLE|WS_OVERLAPPEDWINDOW,//普通窗口风格,WS_VISIBLE它指的是窗口初始是否可见;WS_OVERLAPPEDWINDOW指的是一般窗口风格,剧透一下,将来的控件窗口就不需要了。
	CW_USEDEFAULT,CW_USEDEFAULT,//窗口左上角的xy坐标
	640,480,//窗口的宽和高,不知道为什么它不是长和宽,而是宽和高(长)
	NULL,//这个是个窗口句柄,NULL为桌面
	NULL,//HMENU昨天忘记讲了,它不仅代表了一个菜单,还是一个窗口标识,将来控件会用到
	hInstance,//填空题:HINSTANCE代表了_____,答案:应用程序实例句柄
	NULL);//附加参数(没什么卵用)
	if(hwnd == NULL) {
		MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}//与上面一样,窗口创建失败则弹出一个对话框

	while(GetMessage(&Msg, NULL, 0, 0) > 0){//获取消息Get得到
		TranslateMessage(&Msg);//翻译消息,甭管它是什么,照做就行
		DispatchMessage(&Msg);//与上面同理,要真有兴趣可以一搜
	}//~~这就是我们传说中的消息循环~~
	return Msg.wParam;
}

现在就可以编译成功了,然后
DevC++还是有便捷方式!!!
还是点插入,点击MainProc,注意鼠标要在,头文件与WinMain之间,这样它会把你的光标放到一个地方,你就在那个里面填入WM_CREATE就可以了(当然也可以直接把那个case删掉),下片我将会说到WM_CREATE以及插入代码段中第二个case中WM_DESTROY是什么意思,以及有什么用。
编译成功了
另外,如果用DevC++的话,那么一定要创建项目哦,用源码的话,它会额外创建一个控制台窗口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值