1. 程式人生 > >Lesson 4: 視窗大小和客戶區大小

Lesson 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的高度。通過這兩個表示式可以為我們設定正確的視窗大小。