天天看点

在win32api中新建空白窗口

创建一个空白窗口的步骤

  1. 申明一个窗口类
  2. 官方说法是注册类,个人理解就是将类中的各个参数初始化,例如窗口的起始位置、窗口大小、有无菜单等。
  3. 使用RegisterClass api向计算机进行注册
  4. 使用CreateWindow api 生成一个窗口句柄
  5. 在UpdateWindow、ShowWindow api中使用第四步生成的窗口句柄来生成窗口
  6. 创建消息处理函数
  7. 创建窗口处理函数,即在窗口运行中,产生的各个事件的入口函数。

整体代码如下

/* *********************************************
*功能:注册窗口
*参数:hInstance包含该类的窗口过程的实例的句柄。
*返回值:是否注册成功
**********************************************/
BOOL RegisterWindows(HINSTANCE hInstance)
{
	WNDCLASSEXA wcx;
	//初始化参数
	wcx.cbSize = sizeof(wcx);
	wcx.style = CS_HREDRAW | CS_VREDRAW;//窗口大小改变,重画窗口
	wcx.lpfnWndProc = MainWndProc;//重点:指定窗口消息的处理函数
	wcx.lpszClassName = "MainWndClass";
	wcx.cbClsExtra = 0;
	wcx.cbWndExtra = 0;
	wcx.lpszMenuName = NULL;
	wcx.hInstance = hInstance;
	wcx.hIcon = LoadIconA(NULL, IDI_APPLICATION);
	wcx.hCursor = LoadCursorA((HINSTANCE)NULL, IDC_ARROW);
	wcx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//自带的画刷
	wcx.hIconSm = (HICON)LoadImageA(hInstance, MAKEINTRESOURCEA(5), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
	//注册并检测是否成功注册
	if (!RegisterClassExA(&wcx)) {
		MessageBox(NULL, "注册失败", "Infor", MB_OK);
		return 0;
	}
}
/* *********************************************
*功能:创建窗口
*参数:hInstance包含该类的窗口过程的实例的句柄。
*返回值:创建窗口的句柄
**********************************************/
HWND CreateWindows(HINSTANCE hInstance)
{
	hParentWnd = CreateWindowA("MainWndClass",
		"window",
		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		NULL);
	//检测是否成功创建句柄
	if (!hParentWnd)
		MessageBox(NULL, "生成失败", "Infor", MB_OK);
	//生成窗口
	return hParentWnd;
}
/* *********************************************
*功能:显示窗口
*参数:nCmdShow 窗口的显示方式,最大化、最小化那种
**********************************************/
void displaywindows(int nCmdShow)
{
	nCmdShow = SW_SHOWDEFAULT;
	UpdateWindow(hParentWnd);
	ShowWindow(hParentWnd, nCmdShow);
}
/* *********************************************
*功能:消息函数,不断的通过GetMessage捕捉着窗口的消息,
再通过TranslateMessage将虚拟键消息转换为字符消息,
然后通过DispatchMessage将消息分派给我们的窗口程序进行处理
(所谓处理就是调用我们定义的窗口处理函数WinProc)
**********************************************/
void Message()
{
	MSG msg;
	while (GetMessageA(&msg, NULL, 0, 0)) 
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	
	RegisterWindows(hInstance);
	CreateWindows(hInstance);
	displaywindows(nCmdShow);
	CreateATreeView(hParentWnd);
	Message();
	return 0;
}
           

窗口处理函数:

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	switch (uMsg)
	{
	case WM_DESTROY://窗口关闭事件
		PostQuitMessage(0);
		return 0;
		break;
    default:
		return DefWindowProc(hwnd, uMsg, wParam, lParam);
		break;
	}
}
           

继续阅读