原文地址:
http://www.directxtutorial.com/Lesson.aspx?lessonid=11-1-4
当我们调用CreateWindowEx()函数时,我们使用了500*400来设置窗口的大小。然而,这和客户区的大小是不一样的。客户区为窗口的一部分,游戏软件通常都在客户区完成游戏中的各种画面、功能与效果的实现。
当使用Direct3D时,我们需要确定图片的大小。如果客户区的大小与图片的大小不一致时,它将会被拉伸或收缩以适应客户区的大小。
Rendering With and Without AdjustWindowRect()的比较:
The AdjustWindowRect() Function
该函数依据所需客户矩形的大小,计算需要的窗口矩形的大小。计算出的窗口矩形随后可以传递给CreateWindow函数,用于创建一个客户区所需大小的窗口。
函数的原型如下:
BOOL AdjustWindowRect(LPRECT lpRect,
DWORD dwStyle,
BOOL bMenu);
第一个参数是指向RECT结构的指针,该结构包含所需客户区域的左上角和右下角的坐标。函数返回时,该结构容纳所需客户区域的窗口的左上角和右下角的坐标。
第二个参数dwStyle指定将被计算尺寸的窗口的窗口风格
第三个参数BOOL类型的bMenu,指示窗口是否有菜单。
在实用代码里是怎么使用的呢?看下面这个例子:
RECT wr = {0, 0, 500, 400}; // set the size, but not the position
AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE); // adjust the size
// create the window and use the result as the handle
hWnd = CreateWindowEx(NULL,
L"WindowClass1",
L"Our First Windowed Program",
WS_OVERLAPPEDWINDOW,
300, // x-position of the window
300, // y-position of the window
wr.right - wr.left, // width of the window
wr.bottom - wr.top, // height of the window
NULL,
NULL,
hInstance,
NULL);
RECT wr = {0, 0, 500, 400};
声明并初始化期望得到的客户区域。
AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE);
初始化RECT之后调用AdjustWindowRect()函数,我们把刚刚初始化的RECT的地址作为第一个参数传进去,以及设置窗口样式为WS_OVERLAPPEDWINDOW,没有菜单栏。
wr.right - wr.left,
wr.bottom - wr.top,
当AdjustWindowRect()被调用之后,窗口的指定宽度变成了指定矩形RECT wr的宽度,窗口的指定高度变成了指定矩形RECT wr的高度。通过这两个表达式可以为我们设置正确的窗口大小。