WinAPI入门: 第一个标准Win32窗口程序 [改进&详细注释版]

WinAPI入门: 第一个标准Win32窗口程序

下载链接:
若想立即看到本程序的运行结果,可点击EXE文件的免费下载链接;
HelloWin_v1.sfx.exe;–带语音和背景音乐;
相关链接:
MFC入门: 从WinAPI到MFC过渡的完整模板程序 [详细注释+示例教程]
(WinAPI进阶教程)

//v1;WinAPI入门;第一个标准Win32窗口程序;[改进&详细注释版@HelloWin.c;]

/*/背景说明;

	1.无论你编程使用的是MFC,还是DirectX,最终都是调用的WinAPI函数;其功能仅限于WinAPI的某个子集;
	  因此,WinAPI编程有时可以简单实现MFC某些看起来复杂的功能;还可以实现MFC编程无法实现的功能;
	  WinAPI定义了Windows编程所需的一切,直接使用WinAPI将无所不能;
	2.通过学习WinAPI编程,有助于理解现代操作系统的工作原理,更能深入理解Windows应用程序的运行原理;
	3.WinAPI编程作为一切Windows应用程序的基础,本程序的大部分语句都会出现在任何Windows程序中;
	  因此,本程序可以作为任何新程序的起点;或者通过复制作为一个模板来使用;
	4.本例演示最简单的标准Win32应用程序的结构框架;更完整的Win32应用程序还应该包括菜单和控制响应;
	  因此,本例的每个部分都是必不可少的;包括窗口的类注册/创建/显示/消息循环/回调函数等;
//----------------------------------------------+------------------------------------------------*/

//主程序;

//---------------------------------------------*/
//库引用;
#include <windows.h>					//WinAPI基本库;
//其中主要包含有以下5部分:				--但不包含winmm.lib;
//WINDEF.H		基本类型定义;
//WINNT.H		支持Unicode的类型定义;	--支持中文&国际化;
//WINBASE.H		Kernel函数;
//WINUSER.H		用户接口函数;
//WINGDI.H		图形设备接口函数;		--即GDI编程;
#pragma comment(lib,"winmm.lib")		//添加多媒体库;--可播放声音及视频;
//---------------------------------------------*/
//声明本地函数; 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);	//回调函数CALLBACK;即窗口过程proc;
//----------------------------------------------+------------------------------------------------*/

//定义主函数;–程序进入点;[相当于main();]

//---------------------------------------------*/
/*/补充资料;--Windows程序是如何执行的;
	1.在Win32中 CALLBACK/WINAPI均被定义为__stdcall,即标准调用;
	  这是一种函数调用习惯,关系到参数压栈的次序,以及处理堆栈的责任归属;
	  其它的函数调用习惯还有_pascal 和_cdecl;
	2.当 Windows的「外壳」shell(例如资源管理器侦测到使用者意欲执行一个 Windows程序,
	  于是调用加载器把该程序加载,然后调用C_startup代码;后者再调用WinMain()开始执行程序;
	  WinMain()的四个参数由操作系统传递进来。
//---------------------------------------------*/
//v1;主函数;[启动本应用程序时, Windows会提供4个实参;其中仅 hInstance和 nCmdShow在程序中用到;]
int WINAPI WinMain(
				HINSTANCE	hInstance,		//主窗口实例句柄;[*最重要;]
				HINSTANCE	hPrevInstance,	//上一个窗口实例句柄;[总是NULL;]
				LPSTR		lpCmdLine,		//命令行;[程序启动时可带参数;]
				int			nCmdShow)		//窗口显示方式;[窗口最大化/最小化等旗标组合;]
{
	static TCHAR szAppName[] =TEXT("HelloWin");			//定义应用程序名称;--字符串; TCHAR兼容宽字符UNICODE;
	//定义内部变量;
	//句柄Handle;即32位的ID代号,在 Windows编程中使用非常频繁,相当于资源对象的指针;
	HWND         hwnd;				//窗口句柄;--即窗口ID代号;是创建窗口时Windows的返回值;
	MSG          msg ;				//消息结构;--每个窗口都有一个消息循环,用它不断读取消息;然后转译分发处理;
	WNDCLASS     wndclass;			//窗口类结构;--存放窗口类的特征信息;
	//定义窗口;--用于窗口注册,共需10个参数;[结构体初始化;]
	//窗口产生之前,其众多属性参数必须先设定好;--这些属性牵涉广泛,需提前存放在数据结构wndclass中;
	wndclass.style          = CS_HREDRAW | CS_VREDRAW;				//窗口样式;旗标组合;--水平或垂直改变重绘REDRAW;
	wndclass.lpfnWndProc    = WndProc;								//回调函数名称;--实际是函数指针pfn;
	wndclass.cbClsExtra     = 0;									//为类对象预留的额外计数字节cb;[=couter byte;]
	wndclass.cbWndExtra     = 0;									//为窗体预留的额外计数字节cb;
	wndclass.hInstance      = hInstance;							//App实例句柄;--当前窗口实例的ID代号;由Windows提供;
	wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);		//Icon图标句柄;--普通应用图标;
	wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);			//Cursor光标句柄;--箭头鼠标指针;
	wndclass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);	//HBRUSH背景画刷句柄;--选择预设的标准画刷--白色;
	wndclass.lpszMenuName   = NULL;									//菜单名;--没有菜单为NULL;
	wndclass.lpszClassName  = szAppName;							//窗口类别名=应用程序名称;[小程序可以同名;]
	//注册窗口类;--如不成功则返回0;并立即跳出程序;
	if (!RegisterClass (&wndclass))		//如果窗口类注册不成功,则给出提示;
	{
		MessageBox(NULL, TEXT("This program requires Windows NT!"), 
			szAppName, MB_ICONERROR);	//对话框消息MB;[=Message Box;有时需要Windows NT环境兼容宽字符UNICODE;]
		return 0;
	}
	//创建窗口;--共需11个参数;[函数实参说明;中英对照;]
	//Windows创建窗口是一个复杂的过程,牵涉广泛,参数多点很正常;
	hwnd =CreateWindow(
		szAppName,						// window class name;		[窗口类别名=应用程序名称;同前;]
		TEXT ("HelloWin_v1"),			// window caption;			[窗口标题;文本字符串;]
		WS_OVERLAPPEDWINDOW,			// window style;			[窗口样式;同前;]
		CW_USEDEFAULT,					// initial x position;		[x坐标位置;窗口左上角;]
		CW_USEDEFAULT,					// initial y position;		[y坐标位置;窗口左上角;]
		240,							// initial x size;			[窗口尺寸;单位=像素Pixel;默认CW_USEDEFAULT;]
		120,							// initial y size;			[窗口尺寸;单位=像素Pixel;默认CW_USEDEFAULT;]
		NULL,							// parent window handle;	[父窗口句柄;没有为NULL;]
		NULL,							// window menu handle;		[窗口菜单句柄;没有为NULL;]
		hInstance,						// program instance handle;	[App实例句柄;由Windows提供;]
		NULL);							// creation parameters;		[建立参数;可选的引用资料;]
	//显示窗口;
	//注意:
	//通过CreateWindows()函数创建窗口后,仅仅是为窗口分配了内存空间,获得了句柄,但窗口并没有显示出来;
	//所以还需要调用 ShowWindow()函数来显示窗口;--包括正常显示/最大化/最小化;[由程序安装或使用者决定;]
	//而调用了ShowWindow()函数又仅仅是将窗口显示出来,但不会进行客户区的绘制;
	//所以还需要调用UpdateWindow()函数,生成 WM_PAINT消息,将客户区中的各种控件绘制出来;
	ShowWindow(hwnd, iCmdShow);			//显示窗口;--决定窗口的显示方式iCmdShow;
	UpdateWindow(hwnd);					//刷新窗口;--发送重绘消息WM_PAINT通知屏幕窗口区域自动刷新;
	//消息循环;
	while (GetMessage(&msg, NULL,0,0))	//(NULL,0,0)表示程式接收它自己建立的所有视窗的所有讯息;
	{
		TranslateMessage(&msg);			//转译消息;--将消息结构传给Windows,进行一些键盘转换;
		DispatchMessage(&msg);			//分发消息;--消息各部分经由Windows传给窗口回调函数Proc接收并处理;
		//[处理完原地返回继续读取下一条消息;]
	}
	//如果msg.message=WM_QUIT;这时GetMessage()传回0;退出msg循环;
	return msg.wParam;					//程序结束;返回wParam;
}
//----------------------------------------------+------------------------------------------------*/

//定义回调函数;–窗口消息响应;

//---------------------------------------------*/
/*/补充资料;--消息结构MSG;
//对消息msg的理解是Win32编程所必需的;因此这里列出MSG类型的结构;
typedef struct tagMSG  
{ 
	HWND	hwnd;		//窗口句柄;--窗口ID代号32位整数;同前;
	UINT	message;	//消息标识;--无符号整型32位;
	WPARAM	wParam;		//消息短参数;--实际为32位;
	LPARAM	lParam;		//消息长参数;--实际为32位; 
	DWORD	time; 		//消息放入消息队列的时间;
	POINT	pt; 		//消息放入消息队列时的鼠标位置坐标(x,y);
}MSG, *PMSG; 
//---------------------------------------------*/
//v1;回调函数;--负责处理本窗口类所有实例的消息;
//[因为专为Windows向上调用而设计,所以叫回调函数;通常子程序为向下调用;]
//注意,回调函数的4个形参,对应消息结构中的4个成员;
//当Windows向应用程序发送消息,其实质就是通过调用本回调函数实现的;
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    //定义内部变量;
	HDC         hdc;		//设备环境句柄;
    PAINTSTRUCT ps ;		//保存绘图环境数据的结构体;
    RECT        rect;		//客户区矩形; 
	//消息处理;--消息响应;
    switch (message)
    {
    case WM_CREATE:						//创建窗口;[WM =Window Message;]
		PlaySound( TEXT("HelloWin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;	//语音;
		Sleep(2000);					//等待语音结束,再开始音乐;
		PlaySound( TEXT("bkmusic.wav"), NULL, SND_FILENAME | SND_ASYNC);	//背景音乐;
		break;      
    case WM_PAINT:						//绘制窗口或重绘无效矩形区;--此处显示文本信息;
		hdc =BeginPaint(hwnd, &ps);		//获取设备环境句柄;--包括绘图环境数据;   
		GetClientRect(hwnd, &rect);	//获取客户区矩形;    
		DrawText(hdc, TEXT("Hi,我是Win32窗口!"), -1, &rect,
			DT_SINGLELINE |DT_CENTER |DT_VCENTER);    
			//@客户区rect;文本格式=(单行|水平居中|垂直居中); 
		EndPaint(hwnd, &ps);
		break;      
    case WM_DESTROY:					//已销毁窗口;--由 WM_CLOSE消息触发;[如用户点击了关闭按钮;]
		PostQuitMessage(0);				//将 WM_QUIT放入消息队列;
		break;
    default:
		return DefWindowProc(hwnd, message, wParam, lParam);	//默认;Windows内部消息处理;
	}
	return 0 ;
}
//----------------------------------------------+------------------------------------------------*/
//----------------------------------------------+------------------------------------------------*/
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值