对windows消息机制的理解

我感觉之前理解的有问题,重新写了一下,新手


#include<Windows.h>





LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);




int WINAPI WinMain(HINSTANCE hInstance,//这个东西是一个句柄,由操作系统给你传过来的东西,用来标识你这个程序。
  HINSTANCE hPrecInstance,//这玩意没啥用,已经被微软阉割了,废了
  PSTR szCmdLine,
  int iCmdShow)
{


HWND hwnd;//先不要管他的作用
MSG msg;//同上






WNDCLASS wc;   //这里的作用,就是声明一个窗口类,这个窗口类相当于一张表,这张表由你来填写,填写一些窗口的主要特征,比如风格等等


//第一步:
//在这里填写,开始填写
wc.style=0; //这个是样式
wc.lpfnWndProc = (WNDPROC)WndProc; //这个就是你的窗口要执行什么函数,比如在你的窗口上点击了一下,然后他就做成一条消息,转给这个函数。
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance; //把系统传过来的句柄给这个窗口,就好比系统传过来的句柄是一个灵魂,而这个你设置的窗口是一个肉体,你用系统给的灵魂来操纵你的肉体


//实际的句柄,就是一个指针,指向指针的指针,被指向的指针,就是操作系统的对象,这就好比:
//牧童遥指杏花村一样,牧童的手指是句柄,杏花村的牌子是被指的指针,而杏花村就是你的应用程序


wc.hIcon = LoadIcon(NULL,IDI_WINLOGO); //设置你的图标,就是窗口左上角的那个东西
wc.hCursor = LoadCursor(NULL,IDC_ARROW); //设置你的鼠标样式
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW); //这就是背景色,COLOR_WINDOW就是:背景色是windows自带的那个灰色。
wc.lpszMenuName = NULL; //这里是设置你的菜单,NULL就是啥都没有
wc.lpszClassName = TEXT("MyWndClass");     //这里填写一个类名,就是当你后面再注册的时候用一个字符串来标示这个表。










//第二步
//注册这个表,作用是把他给系统,然后系统加载
//注意,现在系统可不知道你要弄什么类型的窗口,所以需要把你想弄的窗口填写成一张表,然后给系统,这个时候系统就知道了。
RegisterClass(&wc);








//第三步
//好了,现在系统已经知道一个你想要的基本的样式了,你可以创建你想要的样式的窗口了,所以这一步,就是创建窗口!


hwnd = CreateWindow( //这里返回一个句柄,你可以用这个玩意对你的窗口为所欲为
TEXT("MyWndClass"), //你想创建什么基本样式的窗口呢?上面你已经定义了一个wc,而且把他提交给系统了,这个时候上面的类名就起作用了,标示这,你要用这个
//类名来做一个上面定义的窗口。
TEXT("我是标题么么哒"),//不言而喻
WS_OVERLAPPEDWINDOW, //设置其他的一些样式,为什么不在上面的wc设置呢?因为更加灵活了
CW_USEDEFAULT, //下面的是什么我也不知道
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);






//第四步,显示你的窗口,这里要转到MS_PAINT消息 然后去消息队列里处理这个消息
ShowWindow(hwnd,iCmdShow); //显示






//第五步,刷新
UpdateWindow(hwnd);//为什么要刷新呢?其实你不刷新也没关系,这就好比有的人打开电脑以后喜欢右键刷新一下。


//第六步,消息的循环
while(GetMessage(&msg,NULL,0,0)) //这里从消息得到一个消息,注意是一个!   消息存在哪里呢?msg结构里,这个结构可以看一下定义
//当消息是Quit的时候,也就是退出的时候,返回0,程序直接退出
{
TranslateMessage(&msg); //然后翻译一下消息,从msg结构里得到,翻译,在放回去。   因为有些键盘上的东西是很蛋疼的,要翻译成编码
DispatchMessage(&msg);//转发到windows系统,然后windows系统转给Wndproc函数,也就是过程函数
}
}






LRESULT CALLBACK WndProc(HWND hwnd, //这个参数是msg结构的前四个参数,操作系统把这四个参数传给WndProc,然后保留msg后面的参数。
UINT message,
WPARAM wParam,
LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;//这是一个客户区的句柄,什么是客户区呢,就是你的窗口刨去标题栏,在刨去- 口 X 键 以及菜单那一部分就是客户区


RECT rect;//用来标记你的客户区大小,这是一个矩形




switch(message) //传过来的消息
{
case WM_DESTROY://当你摁下X键的时候,实际上并不是要销毁窗口,比如记事本,摁下X键的时候,会提示你,是否保存,于是当你摁下X键的时候,回去部署你的代码,比如你要保存
//然后你再这里处理你要如何保存,等等等等等等等等等。


PostQuitMessage(0);//当你真正的部署好你的代码,做好收尾工作,好了,在GetMessage里告诉他,然后这个函数返回0,跳出循环,你的程序结束。
return 0;


case WM_PAINT: //这个消息实际上是最后执行的,因为当你不停的移动窗口的时候,就会产生一堆重新绘画的消息,那样别的消息就无法执行,所以当你移动窗口的时候,会
//自动的把这个消息移动到消息队列的末尾,然后在执行别的消息。


hdc = BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect); //计算出你的客户区的大小,然后传给rect这个结构,rect有四个参数,里面分别是客户端的左上角坐标,和右下角坐标
DrawText(hdc,TEXT("Hello, Windows!"),-1,&rect,//传入你要弄的窗口,写的内容,窗口的客户区的大小
DT_SINGLELINE | DT_CENTER | DT_VCENTER);//这个是你写的地方和样式,比如占一行,在垂直的中央,在水平的中央
return 0;


case WM_LBUTTONDOWN://当你用左键点下客户区的时候,就会产生这个消息
MessageBox(NULL,TEXT("恩,啊~~"),TEXT("我是客户区的消息~"),MB_OK);
return 0;


case WM_NCLBUTTONDOWN://当你点下非客户区,NC就是nonclient,非客户区,比如标题栏,比如- 口 X
MessageBox(NULL,TEXT("恩,啊~~"),TEXT("我是非客户区的消息~"),MB_OK);
return 0;
}




return DefWindowProc(hwnd,message,wParam,lParam);//仔细观察,会发现,DefWindowProc的四个参数和过程函数一样,他的作用就是,你不能解决的,系统帮你解决。


}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值