9

設定されたサイズのクライアント領域を作成する際に問題が発生します。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であることがわかりました。どうして正しく表示されないのですか?


私が窓全体を描いたとき、それはすべて測定されたようです。理由?知らない。

たぶん、他の誰かがこれに光を当てることができます。

4

2 に答える 2

25

最初の問題は、間違ったメトリックを使用していることです。サイズ変更可能な境界線の幅を取得するには、SM_CXSIZEFRAMEを使用する必要があります。

2番目の問題は、Windowsが正しい値を提供しないことです。Aeroのウィンドウの太い境界線は、深刻なappcompatの問題です。ウィンドウは、ウィンドウの長方形と境界線のサイズについて意図的に配置されています。古いプログラムが引き続き正しく動作できるようにするために必要であり、CreateWindow()呼び出しでウィンドウのサイズを指定します。しかし、それは境界線を含むフレームのサイズです。嘘がなければ、ウィンドウは小さすぎるクライアント領域になってしまいます。

嘘を消すには、Aeroの動作について知っているので、嘘をつく必要がないことをWindowsに伝える必要があります。プロジェクト+プロパティ、リンカー、コマンドライン、追加オプションボックス、および追加:

/SUBSYSTEM:CONSOLE,6.0

バージョン6.0はVistaのバージョン番号であり、Aeroを搭載したWindowsの最初のバージョンです。これを行うと、プログラムがXPで実行されなくなることに注意してください。

于 2012-07-29T06:54:33.023 に答える
2

AdjustWindowRect()の代わりにAdjustWindowRectEx()を試しましたか?正しいスタイル(および拡張スタイル)を渡している限り、それが正しく機能しないことを私が知っている理由はありません。

于 2012-07-29T03:26:04.233 に答える