最近在重新复习Windows的窗体程序,所以现在开始把一个Win窗体程序的基本要素和代码都记录下来:
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM );
int WINAPI WinMain(
HINSTANCEhInstance, //程序实例句柄,用以标识本应用程序
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow
)
{
TCHAR szAppName[] = TEXT("Win32");
HWND hwnd;
MSG msg;
WNDCLASSEXwndclass; //WNDCLASSEX比旧的WNDCLASS多了2个新字段
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor = LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CUR3));
wndclass.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WndProc;
wndclass.lpszClassName = szAppName;
wndclass.lpszMenuName = NULL;
//2个新字段
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.hIconSm = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
//注册窗体类,以后根据同一个窗体类创建的窗体基本属性一样
if(!RegisterClassEx(&wndclass) )
{
MessageBox(NULL, TEXT("Can notRegister!"), szAppName, MB_ICONERROR);
return 0;
}
//创建窗体
if(!(hwnd =CreateWindowEx(NULL, //高级特性style,详细查msdn
szAppName, //窗体类字符串
TEXT("Win32Test"), //窗体标题
WS_OVERLAPPEDWINDOW, //窗体风格,详细查msdn
CW_USEDEFAULT,CW_USEDEFAULT,//窗体起始位置为默认,也即是窗体左上角的x, y坐标,可自行设定
CW_USEDEFAULT,CW_USEDEFAULT, //窗体宽和高
NULL,NULL, //窗体父窗口句柄和窗体菜单句柄,这里设为NULL
hInstance, NULL))) //窗体程序实例hInstance,而保留字段设NULL
return0;
ShowWindow(hwnd,nCmdShow); //令窗体可见的,也可以在上面的窗体风格位置添加WS_VISIBLE
UpdateWindow(hwnd); //向窗体发送一个WM_PAINT消息以刷新窗体客户区
//消息循环,直至接收WM_QUIT退出循环
while(GetMessage(&msg, NULL, 0,0))
{
TranslateMessage(&msg); //对从消息队列获取的一条消息进行翻译,处理
DispatchMessage(&msg); //把消息派发到对应的窗体,然后使用对应的过程函数WndProc(如下)处理
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_CLOSE:
{
//这里使用一个弹出窗体来提示用户是否退出本窗体程序,点击“是”就向窗体发送WM_DESTROY消息来关闭程序,否则退出本函数(不作任何处理,注意:这里直接跳过了DefWindowProc的处理,避免该默认过程向窗体发送关闭消息)
if(IDYES ==MessageBox(hwnd, TEXT("退出程序吗?"), NULL, MB_YESNO | MB_ICONQUESTION))
{
SendMessage(hwnd,WM_DESTROY, NULL, NULL);
}
return 0;//处理完毕函数退出
}break;
case WM_DESTROY:
{
PostQuitMessage(0);//向窗体发送WM_QUIT
return0;
}
break;
}
return DefWindowProc(hwnd, message, wParam,lParam );
}
PS:TEXT()是一个对ASCII和UNICODE字符编码支持的宏,如果编译环境是设定为UNICODE的话会自动采用UNICODE编码,否则就是ASCII,简而言之,就是使用该宏可以根据需求来支持两种编码。TEXT宏等价于_T、T宏。