1、WinMain函数
(1)Windows程序入口。
(2)创建一个窗口,并在给窗口中响应键盘及鼠标消息,步骤:
(3)函数原型
int WINAPI WinMain(
HINSTANCE hInstance, //当前运行实例的句柄
HINSTANCE hPrevInstance, //当前实例的前一个实例的句柄,一般为NULL
LPSTR lpCmdLine, //空终止符,指定传递给应用程序的命令行参数
int nCmdShow //指定程序窗口如何响应
);
2、窗口特征WNDCLASS结构体
a、style:
b、lpfnWndProc:
函数指针,指向窗口过程函数,窗口过程函数是一个回调函数,回调函数在特定事件或条件发生时由另一方调用。回调函数实现机制:
例如Windows的消息处理机制,窗口过程函数被调用的过程:
1)在设计窗口类的时候,将窗口过程给你函数的地址赋值给lpfnWndProc成员变量
2)调用ResgiterClass(&wndclass)注册窗口类,那么系统就有了我们所编写的窗口过程函数的地址。
3)当应用程序接收到某一窗口的消息是,调用DispatchMessage(&msg)将消息回传给系统。系统则利用先前注册窗口类时得到的函数指针,调用过程函数对消息进行处理。
c、cbClsExtra:
附加内存空间,用于存储类的附加信息,Windows把这部分内存初始化为0,故一般设为0
d、cbWndExtra:
附加内存空间,一般设为0
e、hInstance:
指定包含窗口过程的程序的实例句柄
f、hIcon:
窗口图标,NULL则为默认
g、hCusor:
窗口类的光标句柄,如果为NULL,那么无论然后是鼠标进入到应用程序窗口中,应用程序都必须明确的设置光标的形状。可以调用LoadCursor函数来加载光标资源,返回系统分配给光标的句柄。
h、hbrBackground:
背景画刷句柄
i、lpszMenuName:
一个以空终止的字符串,指定菜单资源的名字,NULL则没有默认菜单
j、lpszClassName
一个以空终止的字符串,指定窗口类的名字
3、注册窗口
ATOM RegisterClass(CONST WNDCLASS *lpWndClass);
lpWndClass:窗口类对象指针
4、创建窗口
返回值:成功,返回系统为该窗口分配的句柄。失败,返回NULL
a、zClassName:指定窗口类的名称,与窗口的结构体中定义的一致
b、WindowName:指定窗口名字,显示在标题栏
c、dwStyle:指定创建的窗口样式WS_OVERLAPPEDWINDOW
■WS_ OVERL APPED:产生一个层叠的窗口,一个层叠的窗口有一个标题栏和一个边框。
■ws CAPTION: 创建一一个有标题栏的窗口。
■Ws_ SYSMENU:创建一个在标题栏上带有系统菜单的窗口,要和WS_ CAPTION类型一起使用。
■ws_ THICKFRAME: 创建一个具有可调边框的窗口。
■ws _MINIMIZEBOX: 创建一个具有最小化按钮的窗口,必须同时设定WS_ SYSMENU类型。
■WS_ MAXIMIZEBOX: 创建一个具有最大化按钮的窗口,必须同时设定WS_ SYSMENU类型。
d、x、y:
窗口左上角的x、y坐标
e、nWidth、nHeight:
窗口的宽、高
f、hWndParent:
指定被创建窗口的父窗口句柄
i、hMenu:指定窗口菜单句柄
j、hIstance:指定窗口所属的应用程序实例的句柄
k、lParam:作为WM_CREATE消息的附加参数lParam传入的数据指针,一般为NULL
5、显示及更新窗口
(1)显示使用ShowWindow
BOOL ShowWindow{
HWND hwnd,
int nCmdShow
};
hwnd:窗口句柄
nCmdShow:窗口显示状态,一下几种状态
■SW_HIDE:隐藏窗口并激活其他窗口。
■SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口。SW_ SHOWMAXIMIZED: 激活窗口并将其最大化显示。
■sw_ SHOWMINIMIZED:激活窗口并将其最小化显示。
■SW_ SHOWNORMAL:激活并显示窗口。如果窗口是最小化或最大化的状态,系统将其恢复
到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。
(2)更新用UpdateWindow
BOOL UpdateWindow{
HWND hwnd
};
hwnd:窗口句柄
6、消息循环
在创建窗口、显示窗口、更新窗口后需要消息循环不断从消息对列找那个取出消息。使用GetMessage()从消息队列中取出消息。
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax,
)
返回值:除了接收到WM_QUIT外的消息均返回非零值。错误,返回-1。
例:
MSG msg;
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessae(&msg);
}
7、实例
#include
#include
// 过程函数的定义
LRESULT CALLBACK WinSunProc(
HWND hwnd, //窗口句柄
UINT uMsg, //消息常量标识符
WPARAM wParam, //特定附加消息
LPARAM lParam //特定附加消息
)
{
switch (uMsg)
{
case WM_CHAR:
char szChar[20];
sprintf_s(szChar, "char code is %d", wParam);
MessageBox(hwnd, szChar, "char", 0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd, "mouse clicked", "message", 0);
HDC hdc;
hdc = GetDC(hwnd); //不能在响应WM_PAINT消息时调用
TextOut(hdc, 0, 50, "你好", strlen("你好"));
//ReleaseDC(hwnd);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC = BeginPaint(hwnd, &ps); //只能在WM_PAINT消息时调用
TextOut(hDC, 0, 0, "www.baidu.com", strlen("www.baid.com"));
EndPaint(hwnd, &ps);
break;
case WM_CLOSE:
if (IDYES == MessageBox(hwnd, "是否结束?", "message", MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
// 主函数入口
int WINAPI WinMain(
HINSTANCE hInstance, //当前实例句柄
HINSTANCE hPrevInstance, //当前实例前一个实例句柄
LPSTR lpCmdLine, //命令行
int nCmdShow //显示方式
)
{
// 设计一个窗口类
WNDCLASS wndcls;
wndcls.cbClsExtra = 0; //附加内存空间
wndcls.cbWndExtra = 0; //附加内存空间
wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); //背景色
wndcls.hCursor = LoadCursor(NULL, IDC_CROSS); //光标
wndcls.hIcon = LoadIcon(NULL, IDI_ERROR); //图标
wndcls.hInstance = hInstance; //当前实例句柄
wndcls.lpfnWndProc = WinSunProc; //消息处理函数
wndcls.lpszClassName = "baidu"; //窗口类名称
wndcls.lpszMenuName = NULL; //菜单名
wndcls.style = CS_HREDRAW | CS_VREDRAW; //窗口长/宽改变时重绘
RegisterClass(&wndcls); //注册窗口类
// 创建窗口,定义一个变量来保存创建窗口后返回的句柄
HWND hwnd;
hwnd = CreateWindow("baidu", "标题",
WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL);
// 显示及刷新窗口
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
// 定义消息结构体,开始消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg); //将消息回传给系统
}
return msg.wParam; //返回特定附加标识
}
输出