win32 创建指定客户区大小的窗口

CreateWindow(TEXT(""), TEXT(""), WS_OVERLAPPEDWINDOW,
	CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

上面是创建一个窗口,位置和大小都有系统随意指定。

一般来说,如果写一个win32窗口,想指定其大小,往往第一感觉应该是客户区大小才对,因为鼠标等消息返回的坐标是客户区坐上叫为原点的。但事实却是:创建的窗口大小是包括标题栏等表框的,这让很多想要有指定客户区大小的初学者苦恼了(^_^包括我)。

下面介绍一种比较方便的方法来创建一个指定客户区大小的窗口:

RECT rect;
rect.right = w;
rect.bottom = h;
rect.left = 0;
rect.top = 0;
AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, false);
CreateWindow(TEXT(""), TEXT(""), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, rect.right - rect.left, rect.bottom - rect.top,
NULL, NULL, hInstance, NULL);

AdjustWindowRect的三个参数分别是客户区区域、窗口风格、是否包含菜单(窗口风格要和将要创建的窗口风格一致)。

该函数将调整rect的位置及大小,使其能创建出客户区大小为w、h的窗口。

有指定客户区大小需求的人,往往也不希望窗口大小是可调节的,顺便再说一下如何让窗口不可调节大小:

#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | \
	WS_CAPTION | \
	WS_SYSMENU | \
	WS_THICKFRAME | \
	WS_MINIMIZEBOX | \
	WS_MAXIMIZEBOX)

上面是WinUser.h头文件中关于 WS_OVERLAPPEDWINDOW 的宏定义。

只要把 WS_THICKFRAME 和 WS_MAXIMIZEBOX 风格去掉就行了:

AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW^WS_THICKFRAME^WS_MAXIMIZEBOX, false);
CreateWindow(TEXT(""), TEXT(""), WS_OVERLAPPEDWINDOW^WS_THICKFRAME^WS_MAXIMIZEBOX,
	CW_USEDEFAULT, 0, rect.right - rect.left, rect.bottom - rect.top,
	NULL, NULL, hInstance, NULL);

这样就可以创建一个指定客户区大小为w、h的窗口了

发表评论?

0 条评论。

发表评论