4

私はMSDNを見ます、それは言います:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms632680(v=vs.85).aspx

作成されたウィンドウが子ウィンドウの場合、その既定の位置は Z オーダーの一番下になります。作成されたウィンドウが最上位のウィンドウである場合、その既定の位置は Z オーダーの一番上になります (ただし、作成されたウィンドウ自体が最上位でない限り、最上位のすべてのウィンドウの下になります)。

ただし、別のドキュメントには次のように記載されています。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms632599(v=vs.85).aspx

アプリケーションがウィンドウを作成すると、システムはそれを同じタイプのウィンドウの z オーダーの一番上に配置します

私はこのようにそれをテストしました:

btn1 = ::CreateWindow(L"button", L"OK", WS_TABSTOP|BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD
                    , 10, 10, 50, 30, hWnd, (HMENU)51, hInst, NULL);
btn2 = ::CreateWindow(L"button", L"Cancel", WS_TABSTOP|WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE
                    , 20, 20, 70, 30, hWnd, (HMENU)52, hInst, NULL);

ウィンドウに 2 つのボタンを作成しましたが、それらが重なり合っていました。後で作成したボタンが、最初に作成したボタンを覆っていることがわかります。

MSDN の最初のステートメントは、私のテストと矛盾していますか?

4

2 に答える 2

3

子ウィンドウがどのように表示されるか、またどの子ウィンドウが最後に描画されるかにあまり依存しないでください。サンプル コードを実行すると、[キャンセル] ボタンが重なっている [OK] ボタンが表示されます。ボタンの上にマウスを移動すると、[OK] ボタンが前面に表示され、[キャンセル] ボタンの上に描画されます。

私はかつて、子コントロールの重複で同様の問題を抱えていました。その後、Microsoft がOverlapping Controls Are Not Supported by Windowsと言っていることを知りました。

ところで、本当に Z オーダーを確認したい場合は、 and を使用GetTopWindowしてGetNextWindowください。または、より簡単な方法: run Microsoft Spy++

于 2013-07-18T12:10:55.557 に答える