创建一个窗口,显示一行文本,并播放一段音频.
音频文件的名称应为: “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);
}
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程序设计 第五版 珍藏版》