以上为windows程序的基本结构。
//windows程序的基础代码
#include<windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//回调函数声明
int WINAPI WinMain(HINSTANCE hInstance, // 程序的当前实例句柄
HINSTANCE hPrevInstance, // 程序的上一个实例句柄 , 在win32程序中 , 它始终是NULL
PSTR szCmdLine, // 命令行
int iCmdShow) // 窗口显示状态
{
static TCHAR szAppName[] = TEXT("HelloWin"); //以'\0'字符结尾的字符串 , 这里是程序的名称(实际用作后面的窗口类的名字)
HWND hwnd; //窗口句柄
MSG msg; //消息结构体
WNDCLASS wndclass; //窗口类
wndclass.style = CS_HREDRAW | CS_VREDRAW; //窗口类的风格
wndclass.lpfnWndProc = WndProc; //窗口类绑定的回调函数(也称为窗口过程)
wndclass.cbClsExtra = 0; //窗口类额外参数(默认为0)
wndclass.cbWndExtra = 0;//窗口类额外参数(默认为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, //窗口类的名字
TEXT("The Hello Program"), //窗口名称(标题栏显示的内容)
WS_OVERLAPPEDWINDOW, //窗口的风格
CW_USEDEFAULT, //窗口x坐标
CW_USEDEFAULT, //窗口y坐标
CW_USEDEFAULT, //窗口宽度
CW_USEDEFAULT, //窗口长度
NULL, //父窗口句柄
NULL, //菜单句柄
hInstance, //程序的当前实例
NULL); //窗口创建数据
/* 程序运行完CreateWindow , 还没运行ShowWindow时 ,
windows向窗口的WndProc发送了第一条消息: WM_Create */
ShowWindow(hwnd, iCmdShow); //显示窗口
UpdateWindow(hwnd); //更新窗口
/* 运行完UpdateWindow后 , windows向窗口的WndProc
发送了第二条消息: WM_PAINT . 如果ShowWindow没有调用或是调用失败 , WM_PAINT消息是不会发送的*/
//消息循环
while(GetMessage(&msg, NULL, 0, 0))//这里的NULL不能写成hwnd , 否则程序不能正常运行
{
TranslateMessage(&msg);//转换键盘消息
DispatchMessage(&msg);//将消息传送给windows(os) , 由windows来回调
}
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:
PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;//播音
hdc = BeginPaint(hwnd, &ps);//获取设备句柄 , 开始重绘
GetClientRect(hwnd, &rect);//获取客户区的大小
DrawText(hdc, TEXT("Hello, Windows 98!"), -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对于消息的默认处理
//(注意: 第三个和第四个参数不能传递错误!!!)
}