zoukankan      html  css  js  c++  java
  • 窗口参数Hello Win32 之疯狂注释版

    时间紧张,先记一笔,后续优化与完善。

        回忆刚刚学习WIN32编程的时候,打开《windows程序设计》这本书,书中给的第一段代码就是一个Hello Win32的小程序。看得我头大,书中讲授的很具体,几乎每行代码都给了解释。但解释归解释,我一行一行的琢磨这些代码,还是不知道它们是什么意思。于是我把代码一行一行的敲到了编译器里,并找着书上的讲授,给每行代码都标上了长长的、具体的注释。尽管有的注释写上去后我还是不懂,但总算完成了这个Hello Win32 之疯狂注释版。今天翻出来,贴上来记念一下。

        

        

        每日一道理
    只有启程,才会到达理想和目的地,只有拼搏,才会获得辉煌的成功,只有播种,才会有收获。只有追求,才会品味堂堂正正的人。
    #include <windows.h> 
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);					//声明窗口进程函数,后面有定义
    
    int WINAPI WinMain(HINSTANCE hInstance,									//程序进口点WinMain函数,第一个参数为程序实例句柄,用于标识该程序,第二个参数用于同一程序多次运行时的标识,但在WIN32中不再使用,为NULL
    	HINSTANCE hPrevInstance,											//第三个参数为程序运行参数,第四个参数为程序运行的初始状态,最小化、畸形或最大化
    	LPSTR lpCmdLine,
    	int nShowCmd
    	)
    {
    	static TCHAR szAppName[]=TEXT("HelloWin!");								//定义一个字符串保存程序的名字,自在定义
    	HWND hwnd;															//定义一个句柄,以备后面创立窗体时使用
    	MSG msg;															//定义一个消息结构,用于后面的消息循环
    	WNDCLASS wndclass;													//定义一个窗口类结构体,该结构体名为wndclass,并在下面几行设置该结构体内的数据
    	wndclass.style			=CS_HREDRAW|CS_VREDRAW;						//CS_HREDRAW为水平方向尺寸,CS_VREDRAW为垂直方向尺寸,这两个标识用于后面调整窗体大小时,中心文本任然能表现在中心
    	wndclass.lpfnWndProc	=WndProc;									//将这个窗口类的进程设置为WndProc进程函数,这个进程处理基于这个窗口类创立的所有窗口的全部消息,lpfnWndProc为指向WndProc函数的指针
    	wndclass.cbClsExtra		=0;											//用于在类结构和windows外部保存的窗口结构中预留一些额定空间,程序可以根据需要来使用预留的空间
    	wndclass.cbWndExtra		=0;											//同上
    	wndclass.hInstance		=hInstance;									//程序的实例句柄,由于该窗口属于该程序,这里与WinMain函数中的第一个参数一致
    	wndclass.hIcon			=LoadIcon(NULL,IDI_APPLICATION);			//加载图标供程序使用,这里使用系统自带的预先定义的图标,第一个参数为NULL,第二个参数IDI_APPLICATION是一个简单的窗口小图形的图标,如果要用自己预备的图标,第一个参数为程序实例句柄hInstance,第二个参数标识图标
    	wndclass.hCursor		=LoadCursor(NULL,IDC_ARROW);				//加载鼠标指针供程序使用,LoadCursor函数加载一个预先定义的鼠标光标,光标款式为IDC_ARROW,并返回该光标的句柄,这样,当我们将鼠标放到窗体客户区上时,鼠标酿成一个小箭头,如果第二参数是其他款式,则鼠标放在窗体客户区上时,表现不一样的光标
    	wndclass.hbrBackground	=(HBRUSH)GetStockObject(WHITE_BRUSH);		//获取绘制窗口背景的刷子,GetStockObject函数返回一个刷子句柄,参数WHITE_BRUSH为白色刷子,所以这里返回白色刷子句柄,也可以设置其他颜色,这决定着窗口客户区的背景颜色
    	wndclass.lpszMenuName	=NULL;										//指定窗口类菜单,这里不需要菜单,为空
    	wndclass.lpszClassName	=szAppName;									//设置一个类名,自在定义,这里我们定义为扫尾定义的szAppName[]
    	RegisterClass(&wndclass);											//注册刚刚定义的窗口类
    	hwnd=CreateWindow(szAppName,										//根据窗口类创立一个窗口,返回一个窗口句柄保存在hwnd里,同时下面的参数指定有关该窗口的更具体的信息,第一个参数为程序注册的窗口类名称
    		TEXT("The Hello Program"),											//第二个参数为窗口标题栏的内容
    		WS_OVERLAPPEDWINDOW,											//第三个参数为窗口风格,这里WS_OVERLAPPEDWINDOW是一种标准的窗口风格,它有一个标题栏,标题栏左边有一个系统菜单框,标题栏右侧有最小化、最大化和关闭按钮,四周还有表示窗口大小的边框
    		CW_USEDEFAULT,													//第四个参数为窗口在屏幕上的水平位置,这里使用默认位置
    		CW_USEDEFAULT,													//第五个参数为窗口在屏幕上的垂直位置,这里也使用默认位置
    		CW_USEDEFAULT,													//第六个参数为窗口宽度,这里使用默认值
    		CW_USEDEFAULT,													//第七个参数为窗口高度,这里也使用默认值
    		NULL,															//第八个参数为父窗口句柄,由于这个程序只有一个窗口,这个窗口就是第一流窗口,所以这里留空
    		NULL,															//第九个参数为窗口菜单句柄,这里没有菜单,也留空
    		hInstance,														//第十个参数为程序实例句柄,与后面一样都为hInstance
    		NULL);															//最后为创立参数指针为空,可以用这个指针访问以后想要引用的程序中的数据
    	ShowWindow(hwnd,nShowCmd);											//在屏幕上表现该窗口,参数hwnd即为刚刚创立好的窗口的句柄,nShowCmd即WinMan函数的第四个参数,决定窗口初始的状态,畸形、最小化或最大化
    	UpdateWindow(hwnd);													//使窗口刷新自身
    	while(GetMessage(&msg,NULL,0,0))									//进入消息循环,GetMessageb函数没执行一次从消息队列中掏出一个消息,参数NULL,0,0表示程序接受属于它的所有窗口的所有消息
    	{
    		TranslateMessage(&msg);											//将msg结构传给windows,转换一些键盘消息
    		DispatchMessage(&msg);											//该函数将msg结构传给windows,然后windows将该消息发送给适当的窗口进程,让它处理,本程序中窗口进程即WndProc函数
    	}
    	return msg.wParam;													//当退出消息消息循环后,返回msg结构的wParam数据,该数据是传递给PostQuitMessage函数的值(通常是0)
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM IParam) //定义窗口进程,窗口进程确定了再窗口的客户区域表现什么,以及窗口怎样响应用户的输入
    {																				//第一个参数hwnd是接收消息的窗口的句柄,第二个参数message是标识该消息的数字,第三四个参数为32位的消息参数,供给关于消息的更多信息
    	HDC hdc;															//定义一个设备描述表句柄,这里指表现输入设备句柄
    	PAINTSTRUCT ps;														//该结构体内包括一些窗口进程,用来刷新窗口客户区的内容
    	RECT rect;															//定义一个RECT结构体,用于后面保存窗口客户区域的尺寸
    	switch(message)														//处理消息,这里我们定义的WndProc窗口进程函数只处理两种消息
    	{
    	case WM_PAINT:														//当我们调整窗口边框时,全部窗口将酿成无效的,窗口进程将收到此WM_PAINT消息,接下来我们需要从新绘制窗口,这也是使得中心文本能一直保持在中心的原因
    		hdc=BeginPaint(hwnd,&ps);										//开始窗口绘制,第一个参数为程序的窗口句柄,第二个参数为指向PAINTSTRUCT结构体的指针,该结构体内包括一些窗口进程,用来刷新窗口客户区的内容。BeginPaint函数返回一个设备描述表句柄,保存在hdc里
    		GetClientRect(hwnd,&rect);										//获取窗口客户区的尺寸,第二个参数为之前定义的RECT结构体,用于保存窗口客户区域的尺寸
    		DrawText(hdc,TEXT("Hello,Windows 7!"),-1,&rect,					//表现窗口中心文本,第一个参数为设备描述表句柄,第二个参数为要表现的字符串,第三个参数为-1,指示字符串是以字节0结束的,第三个参数是保存窗口客户区尺寸的结构体
    			DT_SINGLELINE|DT_CENTER|DT_VCENTER);
    		EndPaint(hwnd,&ps);												//结束窗口绘制,参数同开始窗口绘制
    		return 0;
    	case WM_DESTROY:													//单击右上角关闭按钮时触发此消息
    		PostQuitMessage(0);												//在消息队列中插入一条“退出”消息,这使得WinMain函数退出消息循环,程序终止
    		return 0;
    	}
    	return DefWindowProc(hwnd,message,wParam,IParam);					//DefWindowProc为默认消息处理函数,窗口进程不处理的消息都传给该函数
    }

    文章结束给大家分享下程序员的一些笑话语录: 不会,Intel会维持高利润,也会维持竞争局面,国外的竞争不是打死对方的那种。你看日本有尼康,佳能,索尼,都做相机,大家都过得很滋润。别看一堆厂,其实真正控制的是后面的那几个财团——有些竞争对手,后面其实是一家人。

    --------------------------------- 原创文章 By
    窗口和参数
    ---------------------------------

  • 相关阅读:
    深入理解Spring Redis的使用 (三)、使用RedisTemplate的操作类访问Redis
    深入理解Spring Redis的使用 (二)、RedisTemplate事务支持、序列化
    Elasticsearch 评分score计算中的Boost 和 queryNorm
    Docker 镜像构建的时候,应该小心的坑
    怎么给kibana加上权限?
    网站异常了,日志要怎么看?
    使用 Gradle 配置java项目
    Cassandra 类型转换限制
    Elasticsearch 排序插件的开发
    ElasticSearch 2.0以后的改动导致旧的资料和书籍需要订正的部分
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3112986.html
Copyright © 2011-2022 走看看