通过HelloWin程序了解Windows程序原理

创建一个窗口,显示一行文本,并播放一段音频.

效果图:

通过HelloWin程序了解Windows程序原理_第1张图片
音频文件的名称应为: “hellowin.wav”,放在和执行文件同目录下.

源代码:

/*----------------------------------------------------------------------------
		Displays "hello,veeja!" in a message box
----------------------------------------------------------------------------*/
#include
#pragma comment(lib,"winmm.lib") //导入声音头文件库
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrecInstance,
	PSTR szCmdLine, int iCmdShow)
	//函数的类型为WINAPI,这个标识符被定义为__stdcall,它指定了在Windows和应用程序之间的函数调用的特定次序
	//HINSTANCE 实例句柄--程序本身
	//PSTR该类型表示一个指向非宽字符串的指针,即char *
{
	static TCHAR szAppName[] = TEXT("helloWin");
	HWND			hwnd;  // HWND 窗口句柄
	MSG				msg;  // MSG  消息结构
	WNDCLASS		wndclass;  // WNDCLASS  窗口类

	wndclass.style = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = szAppName;

	if (!RegisterClass(&wndclass))
	{
		MessageBox(NULL, TEXT("this program requires windows NT!"),
			szAppName, MB_ICONERROR);
		return 0;
	}
	hwnd = CreateWindow(
		szAppName,					//window class name		
		TEXT("The Hello Program"),	//window caption
		WS_OVERLAPPEDWINDOW,		//window style
		CW_USEDEFAULT,				//initial x position
		CW_USEDEFAULT,				//initial y position
		CW_USEDEFAULT,				//initial x size
		CW_USEDEFAULT,				//initial y size
		NULL,						//parent window handle
		NULL,						//window menu handle
		hInstance,					//program instance handle
		NULL);						//creation parameters
	ShowWindow(hwnd, iCmdShow);
	UpdateWindow(hwnd);

	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
// 返回值类型为LRSULT,该类型等价于LONG
// CALLBACK是函数的类型,这个标识符被定义为__stdcall,它指定了在Windows和应用程序之间的函数调用的特定次序
// HWND 窗口句柄
// UINT 其实就是unsigned int,仅仅是为了书写方便,在Windows 98 中,表示一个32位的值.
// WPARAM 16位的无符号短整型
// LPARAM 32位的有符号的长整型
{
	HDC hdc; // HDC 设备环境句柄
	PAINTSTRUCT ps;  // PAINTSTRUCT  绘制结构
	RECT rect;  //RECT 矩形结构

	switch (message)
	{
	case WM_CREATE:
		PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
		GetClientRect(hwnd, &rect);
		DrawText(hdc, TEXT("hello,veeja!"), -1, &rect,
			DT_SINGLELINE | DT_CENTER | DT_VCENTER);
		EndPaint(hwnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, message, wParam, lParam);

}

Windows函数调用:

HELLOWIN程序所调用的Windows函数:

函数 简短描述
LoadIcon 加载图标,以供程序使用
LoadCursor 加载鼠标光标,以供程序使用
GetStockObject 获取一个图形对象.在本例中是一个用来对窗口的背景进行重绘的画刷
RegisterClass 为应用程序的窗口注册一个窗口类
MessageBox 显示消息框
CreateWindow 基于窗口类创建一个窗口
ShowWindow 在屏幕中显示窗口
UpdateWindow 指示窗口对其自身进行重绘
GetMessage 从消息队列获取消息
TranslateMessage 翻译一些键盘消息
DispatchMessage 将消息发送给窗口过程
PlaySound 播放声音文件
BeginPaint 表明窗口客户区的尺寸
DrawText 显示一个文本字符串
EndPaint 借宿窗口绘制
PostQuitMessage 将"退出"消息插入消息队列
DefWindowProc 执行默认的消息处理

大写标识符

HELLOWIN.c中使用了大量的大写标识符.这些标志符都是早Windows头文件中定义的.这些标志符有很多都是以两三或三个字母作为前缀,且其后紧跟一个下划线:

CS_HREDRAW		DT_VCENTER		SND_FILENAME
CS_VERDRAW		IDC_ARROW		WM_CREATE
CW_USEDEFAULT	IDI_APPLICATION	WM_DESTROY
DT_CENTER		MB_ICONERROR	WM_PAINT
DT_SINGLELINE	SND_ASYNC		WS_OVERLAPPEDWINDOW

这些标识符其实都是数值常量.前缀表明该常量所属的一般类别,如下表所示.

前缀 常量
CS 类窗口风格
CW 创建窗口选项
DT 文本绘制选项
IDI 图标的ID号
IDC 光标的ID号
MB 消息框选项
SND 声音选项
WM 窗口消息
WS 窗口风格

匈牙利标记法

前缀 数据类型
c char 或 WCHAR 或 TCHAR
by BYTE (无符号字符)
n short (短整形)
i int (整形)
x , y int , 表示 x 坐标 或者 y 坐标
cx , cy int , 表示 x 或 y 的长度, c 表示 “count”(计数)
B 或 f BOOL ( int ) , f 表示"flag"
w WORD (无符号短整形)
l LONG (长整型)
dw DWORD (无符号长整型)
fn 函数
s 字符串
sz 以零结束的字符串
h 句柄
p 指针

参考书籍:《WINDOWS程序设计 第五版 珍藏版》

你可能感兴趣的:(WINDOWS程序设计)