Win32应用程序与Win32控制台程序的不同之处在于:
① Win32应用程序以WinMain()为主函数,可以使用所有Win32API
② Win32控制台程序以main()为主函数,不能使用GDI函数
Win32应用程序之所以可以使用Win32API,是因为引入了Windows.h,从而包含了数据类型定义与API的入口点。
在VS中创建一个空的Win32应用程序。该程序中不包含任何资源和文件,全部需要自行添加。
首先需要添加一个main.cpp(不需要头文件)。在该文件中添加一个WinMain()函数用于程序入口点。
WinMain()函数结构如下:
也就是说WinMain()函数包含三部分:
① 定义并注册窗口类
② 创建并显示窗口
③ 启动消息循环
源码:
#include <Windows.h>
#include "tchar.h"
static LPCWSTR szAppName = _T("Demo_Class"); //主窗口名
LRESULT CALLBACK WndProc(HWND hwnd,UINT Message,WPARAM wParam, LPARAM lParam);
BOOL Def_RegClass(HINSTANCE hInst);
HWND Create_ShowWnd(HINSTANCE hInst,int nCmdShow);
//主函数
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInstance, LPSTR lpszCmdParam,int nCmdShow)
{
MSG Msg;
if (!Def_RegClass(hInst))
{
return FALSE;
}
if (!Create_ShowWnd(hInst,nCmdShow))
{
return FALSE;
}
//启动消息循环
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
//定义并注册窗体类
BOOL Def_RegClass(HINSTANCE hInst)
{
WNDCLASS WndClass;
WndClass.style = CS_HREDRAW|CS_VREDRAW; //窗口类样式
WndClass.lpfnWndProc = WndProc; //窗口回调函数指针
WndClass.cbClsExtra = 0; //分配在窗口类结构后的字节数
WndClass.cbWndExtra = 0; //分配在窗口实例后的字节数
WndClass.hInstance = hInst; //定义窗口类的应用程序的实例句柄
WndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION); //窗口类的图标
WndClass.hCursor = LoadCursor(NULL,IDC_ARROW); //窗口类的光标
WndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //窗口类的背景画刷
WndClass.lpszMenuName = NULL; //窗口类的菜单名
WndClass.lpszClassName = szAppName; //窗口类名
return (RegisterClass(&WndClass)!=0);
}
//创建并显示窗体
HWND Create_ShowWnd(HINSTANCE hInst,int nCmdShow)
{
HWND hwnd = CreateWindow( szAppName, //窗口类名
szAppName, //窗口标题名
WS_OVERLAPPEDWINDOW, //窗口样式
CW_USEDEFAULT, //窗口左上角x坐标
CW_USEDEFAULT, //窗口左上角y坐标
CW_USEDEFAULT, //窗口宽
CW_USEDEFAULT, //窗口高
NULL, //窗口的父窗口句柄
NULL, //窗口的主菜单句柄
hInst, //创建窗口的应用程序当前句柄
NULL //指向一个传递给窗口的参数值指针
);
if (hwnd == NULL)
{
return FALSE;
}
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
return hwnd;
}
//窗口回调函数
LRESULT CALLBACK WndProc(HWND hwnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
switch(Message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,Message,wParam,lParam);
}
}