这一篇我们来讲解一下如何创建一个简单的窗口。在创建窗口之前,我们需要知道它的创建过程具体怎么样,不然直接看代码也会一头雾水。
我就简单的说了:
1.定义一个窗口类(WNDCLASS);
2.注册这个窗口类(RegisterClass);
2.根据刚刚定义的窗口类来创建窗口(CreateWindow);
3.更新显示窗口(UpdateWindow、ShowWindow);
4.实现窗口的事件的驱动
以上是创建一个窗口的具体过程,现在我们直接来操作实践一下,创建一个win32项目(这里就不具体列出怎么创建了,如果不知道怎么创建的,看回《windows基础知识--------第一篇(项目的创建)》这一篇进行查看);
然后新建一个main.cpp,具体实现如下:
#include<windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //过程处理函数的声明
int WINAPI WinMain
(
HINSTANCE hInstance, //当前实例句柄
HINSTANCE hPreInstance, //以前实例句柄,一般为NULL
LPSTR lpszCmdLine, //命令行参数的指针
int nCmdLine) //当前应用程序窗口显示的状态
{
static TCHAR szClassName[] = TEXT("windows");//窗口类的名字
//WNDCLASS是一个结构体,所以定义窗口类就是设计这个窗口是一个怎么样的窗口进行赋值
WNDCLASS wndclass;
wndclass.hbrBackground = NULL; //窗口背景:无
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); //窗口光标:箭头
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //窗口图标:应用程序图标
wndclass.hInstance = hInstance; //窗口实例句柄:为主函数的第一个参数,当前实例句柄
wndclass.lpfnWndProc = WndProc; //窗口的处理函数:上面声明的WndProc
wndclass.lpszClassName = szClassName; //窗口类的名字:szClassName,这在创建窗口是需要用到,作为一个参数传入
wndclass.lpszMenuName = NULL; //窗口菜单:无
wndclass.style = 0; //窗口类型:无
wndclass.cbClsExtra = NULL; //窗口类内存:不使用
wndclass.cbWndExtra = NULL; //窗口内存:不使用
//注册窗口类,如果失败,弹出失败对话框
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("Wndclass fail!"), NULL, MB_OK);
return 0;
}
//根据窗口类创建窗口
HWND hwnd = CreateWindow(
szClassName, //窗口类名字
TEXT("HelloWindows"), //窗口标题
WS_OVERLAPPEDWINDOW, //窗口类型
100, //窗口位置:x=100
100, //窗口位置:y=100
480, //窗口宽度:width=960
320, //窗口高度:height=640
NULL, //父类窗口:无
NULL, //窗口菜单:无
hInstance, //应用程序实例句柄
NULL); //窗口创建时的数据:无
//如果窗口创建失败,弹出对话框
if (!hwnd)
{
MessageBox(NULL, TEXT("hwnd fail!"), NULL, MB_OK);
return 0;
}
//更新显示窗口
UpdateWindow(hwnd);
ShowWindow(hwnd, nCmdLine);
//事件驱动的实现
//具体流程就是:
//在窗口中,对每次用户输入的进行获取,如果获取成功,就翻译这个消息,然后把这个消息分发给过程出来函数进行处理
//我们通过while循环不断的对窗口所获取的消息进行处理,直到系统得到窗口摧毁这个消息,便会退出循环,结束程序
MSG msg;
BOOL isMessage;
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
while(msg.message != WM_QUIT)
{
isMessage = PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
if (isMessage)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
//过程处理函数的实现
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY: //关闭应用程序的命令消息
PostQuitMessage(0);
return 0;
}
return DefWindowProcW(hwnd, msg, wParam, lParam);//其他的传给系统默认的窗口过程处理函数处理
}
好了,把上面的代码写一遍后,便可以运行,结果如下:
这就是整个创建窗口的过程。windows程序代码的编写都需要基于此。