要创建一个新的窗口,需要先使用 RegisterClassEx 注册一个新的窗口类型,然后调用CreateWindow宏创建一个已注册的窗口
#include <windows.h>
#include <stdio.h>
// Global variable
HINSTANCE hinst;
// 回掉函数
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM)
{
while(true);
return 0;
}
// 函数入口点
int WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wcx;
//初始化窗口结构体
wcx.cbSize = sizeof(WNDCLASSEX);
wcx.style = CS_HREDRAW | CS_VREDRAW;
wcx.lpfnWndProc = MainWndProc;
wcx.cbClsExtra = 0;
wcx.cbWndExtra = 0;
wcx.hInstance = hinstance;
wcx.hIcon = LoadIcon(0, IDI_APPLICATION);
wcx.hCursor = LoadCursor(0, IDC_ARROW);
wcx.hbrBackground = 0;
wcx.lpszMenuName = "MainMenu";
wcx.lpszClassName = "MainWindow";
wcx.hIconSm = 0;
//注册一个窗口
ATOM wc = RegisterClassEx(&wcx);
if (!wc)
{
printf("Register error!\n");
return -1;
}
//创建一个窗口,只能创建已经注册到系统的窗口类型
HWND hWnd = CreateWindow("MainWindow","Window exp",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinstance, NULL);
if (!hWnd)
{
printf("Create error\n");
return -1;
}
//显示窗口
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return 0;
}
CreateWindow是一个宏定义
#ifdef UNICODE
#define CreateWindow CreateWindowW
#else
#define CreateWindow CreateWindowA
#endif
他们最终调用的函数是
#define CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
CreateWindowExA(0L, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
#define CreateWindowW(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
CreateWindowExW(0L, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
CreateWindowW使用Unicode编码
CreateWindowA使用ANSI编码