設定されたサイズのクライアント領域を作成する際に問題が発生します。AdjustWindowRect()が正しく機能しないため、ウィンドウの幅と高さを手動で計算してみることにしました。
それもうまくいかなかったので、なぜだろうと思ったので、境界線などを考慮して使用した値を確認しました。
#include <iostream>
#include <Windows.h>
int main(void)
{
std::cout << "GetSystemMetrics(SM_CYEDGE) = " << GetSystemMetrics(SM_CYEDGE) << std::endl;
std::cout << "GetSystemMetrics(SM_CXEDGE) = " << GetSystemMetrics(SM_CXEDGE) << std::endl;
std::cout << "GetSystemMetrics(SM_CYBORDER) = " << GetSystemMetrics(SM_CYBORDER) << std::endl;
std::cout << "GetSystemMetrics(SM_CXBORDER) = " << GetSystemMetrics(SM_CXBORDER) << std::endl;
std::cout << "GetSystemMetrics(SM_CYCAPTION) = " << GetSystemMetrics(SM_CYCAPTION);
std::cin.get();
}
これは私に与えます:
GetSystemMetrics(SM_CYEDGE) = 2
GetSystemMetrics(SM_CXEDGE) = 2
GetSystemMetrics(SM_CYBORDER) = 1
GetSystemMetrics(SM_CXBORDER) = 1
GetSystemMetrics(SM_CYCAPTION) = 22
私の窓の境界線はそれほど薄くないと確信しています。私は何が間違っているのですか?
編集1:
当初、私のウィンドウはWS_OVERLAPPEDスタイルを使用していました。AdjustWindowRectではそのスタイルを一緒に使用できないため、必要なのと同じタイプのウィンドウを作成しました:(WS_BORDER | WS_CAPTION | WS_SYSMENU)。これは、AdjustWindowRectおよびAdjustWindowRectExの呼び出し中に使用するスタイルと同じです(これは、使用しないため、拡張スタイルとしてNULLを使用します)。これにより正しい幅が得られますが、高さが数ピクセル欠落しています。
RECT rect = { 0, 0, 800, 600};
AdjustWindowRectEx( &rect, (WS_BORDER | WS_CAPTION | WS_SYSMENU), FALSE, NULL);
CreateWindowEx( ..., rect.right - rect.left, rect.bottom - rect.top, ...);
これにより、クライアント領域の幅は800ピクセルになりますが、高さは582ピクセルになります。
編集2:
CURIOUS、GetClientRect();を使用しました。幅が800、高さが600であることがわかりました。どうして正しく表示されないのですか?
私が窓全体を描いたとき、それはすべて測定されたようです。理由?知らない。
たぶん、他の誰かがこれに光を当てることができます。