创建一个新的c++WIn32空项目
添加.cpp文件,取名main.cpp
创建主要代码
#include<windows.h>//大多数API函数需要包含此文件
//在创建应用程序入口点之前必须声明一个窗口过程原型函数才能在窗口结构 中使用
LERSULT CALLBACK WndProc(HINSTANCE hThis,UINT uMsg,WPARAM wParam,LPARAM lParam);
// Win32应用程序和控制台应用程序的main函数原型稍有不同,如下代码所示:
int WINAPI WinMain(HINSTANCE hThis,HINSTANCE hPrev,LPSTR szCmdLine,int iCmdShow)
注意,在返回类型(int)后面有一个WINAPI宏,它表示一种调用约定
参数:hThis 应用程序当前实例句柄
hPrev 应用程序上一个实例句柄,查询MSDN文档此参数设为NULL;
szCmdLine 应用程序命令行,设为NULL
iCmdShow 控制显示窗口
用UNREFERENVED_RARAMETER宏告诉编译器不使用某些参数,来优化程序如下所示
实例化窗口结构WNDCLASSEX,该对象存储了待生成窗口的细节,如栈大小,当前应用程序的实例句柄、窗口样式、窗口颜色、图标和鼠标指针主要代码段如下:
WNDCLASSEX wndclass={0};
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.style = CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon = NULL;
wndclass.hInstance = hThis;
wndclass.lpszClassName = "Project";
下面的代码注册一个窗口类供CreateWindow和CreateWindowE想函数调用
if(!RegisterClassEx(&wndclass))
{
MessageBeep(0);
return FALSE;
}
CreateWindow函数创建一个重叠、弹出的窗口或者子窗口,它指定窗口类、窗口标题、窗口样式、窗口的初始位置和大小(可选),该函数还指定了窗口的父窗口或所有者(如果有的话)
HWND hWnd=CreateWindow
("Project", //窗口类名.
"main", //标题名.
WS_OVERLAPPEDWINDOW, //带标题栏,最大/小按钮的窗口
CW_USEDEFAULT, //窗口左上角坐标.
0,
CW_USEDEFAULT, //采用缺省的宽度和高度.
0,
NULL, //无父窗口.
NULL, //无主菜单.
hThis, //当前实例句柄.
NULL);
ShowWindow(hWnd,nCmdShow); //显示窗口.
UpdateWindow(hWnd); //更新并绘制用户区.
我们还需要一个MSG结构的实例来表示窗口消息
MSG Message={0};
while(GetMessage(&Message,0,0,0))
{
TranslateMessage(&Message); //把虚拟消息翻译成字符消息
DispatchMessage(&Message);//分发一条消息给窗口过程
}
当关闭应用程序或触发一些退出命令时,DestroyWindow API销毁指定窗口
DestroyWindow (hWnd) ;
注销窗口类
unregisterClass( wndclass.lpszClassName,hThis);
定义
int WndProc(HWND hWnd,UINT iMessage,
UINT wParam,LONG lParam)
{
switch(iMessage)
{
CASE WM_CLOSE:
{
PostQuitMessage(0); //释放系统资源
break;
}
default:
{
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
}
return 0;
}