#include //Windows程序设计头文件

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//窗口消息处理程序,固定形式。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)//Windows程序入口
{
static TCHAR szAppName[] = TEXT("HelloWin");
HWND hwnd;//窗口句柄
WNDCLASS wndclass;//窗口类别结构
MSG msg;//消息结构
//设置窗口类别结构
wndclass.style = CS_HREDRAW | CS_VREDRAW;//窗口类别样式。CS_HREDRAW水平方向、CS_VREDRAW垂直方向大小改变时,窗口重绘。
wndclass.lpfnWndProc = WndProc;//设定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;//窗口类别名
/*RegisterClass函数只有一个参数,即指向WNDCLASS结构的指针。
实际上,RegisterClassA函数将获得一个指向WNDCLASSA结构的指针,而RegisterClassW函数将获得一个指向WNDCLASSW结构的指针。
程序要使用哪个函数来注册窗口类别,取决于发送给窗口的消息包含ASCII文字还是Unicode文字。

现在有一个问题:如果用定义的UNICODE标识符编译了程序,程序将呼叫RegisterClassW。
该程序可以在Microsoft Windows NT中执行良好。
但如果此程序在Windows 98上执行,RegisterClassW函数并未真地被执行到。函数有一个进入点,但函数呼叫后只传回0,表明错误。

由于MessageBoxW是可在Windows 98环境下执行的几个Unicode函数之一,所以下面过程其执行正常。
*/
if(!RegisterClass(&wndclass))//注册窗口类别
{
MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
return 0;
}
//CreateWindow发送WM_CREATE消息
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);//更新窗口。发送WM_PAINT消息重绘。
//消息循环
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
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 Windows XP!"), -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);
}