一个Windows 的应用程序,要创建一个窗口我觉得可以分为6个步骤:
1. 创建窗口类
2. 注册窗口类
3. 建立窗口
4. 显示窗口
5. 更新窗口
6. 获取消息
下面我就对以上这些步骤做些简单的说明。
创建窗口类。其实这一步,就是声明一个WNDCLASS这个结构体,这个结构体里边包含了窗口的一些信息。如窗口样式,菜单,图标等信息,然后将这些成员一一进行赋值。
注册窗口类。这一步是调用RegisterClass这个API,将上面创建的窗口类进行注册。
建立窗口。这一步将调用一个CreateWindow这个API,来创建一个窗口出来,但并没有显示出来。
显示窗口。调用ShowWindow这个API,将创建出来的窗口显示出来。
更新窗口。调用UpdateWindow这个API,更新一下显示出来的窗口。
获取消息。整个Windows应用程序是以消息驱动的,此时要调用GetMessage,从消息队列里获取一个消息,进行分发给窗口。
下面是以上的一些代码:
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
TCHAR szAppClassName[] = L"MyFirstWindow";
HWND hWnd;
MSG msg;
{
TCHAR szAppClassName[] = L"MyFirstWindow";
HWND hWnd;
MSG msg;
//创建窗口类
WNDCLASS wndclass;
//窗口类对象的初始化
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppClassName;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
wndclass.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));
//注册窗口类
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, L"Register wnd class failed", L"Error", MB_OK);
return 0;
}
//建立窗口
hWnd = CreateWindow(szAppClassName,
L"My first win32 application",
WS_OVERLAPPEDWINDOW,
800,
500,
600,
400,
NULL,
NULL,
hInstance,
NULL
);
//窗口类对象的初始化
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppClassName;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
wndclass.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));
//注册窗口类
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, L"Register wnd class failed", L"Error", MB_OK);
return 0;
}
//建立窗口
hWnd = CreateWindow(szAppClassName,
L"My first win32 application",
WS_OVERLAPPEDWINDOW,
800,
500,
600,
400,
NULL,
NULL,
hInstance,
NULL
);
//显示窗口
ShowWindow(hWnd, SW_SHOW);
ShowWindow(hWnd, SW_SHOW);
//更新窗口
UpdateWindow(hWnd);
UpdateWindow(hWnd);
// 获取消息
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);//主要将一些虚拟键值转为一些字符消息,再传递给windows
DispatchMessage(&msg);//将消息发送给CreateWindow建立 的窗口
}
}
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);//主要将一些虚拟键值转为一些字符消息,再传递给windows
DispatchMessage(&msg);//将消息发送给CreateWindow建立 的窗口
}
}