C++ 将子控件移动到顶部

C++ 将子控件移动到顶部,c++,winapi,C++,Winapi,当控件在windows API中重叠时,如何将控件移到另一个控件的顶部 例如,我创建了两个按钮b1和b2 HWND b1 = CreateWindow(L"BUTTON", L"button1", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 100, 100, 200, 50, my_Window_handle, (HMENU)100, NULL, NULL); HWND b2 = CreateWindow(L"BUTTON", L"but

当控件在windows API中重叠时,如何将控件移到另一个控件的顶部

例如,我创建了两个按钮b1b2

     HWND b1 = CreateWindow(L"BUTTON", L"button1", WS_CHILD | WS_VISIBLE | WS_TABSTOP,
    100, 100, 200, 50, my_Window_handle, (HMENU)100, NULL, NULL);

    HWND b2 = CreateWindow(L"BUTTON", L"button2", WS_CHILD | WS_VISIBLE | WS_TABSTOP,
    50, 100, 250, 50, my_Window_handle, (HMENU)101, NULL, NULL);
我想将b1移动到b2或任何控件的顶部。 我使用函数SetWindowPos作为


但是id不能正常工作。

您不希望子窗口位于最顶部,而是希望它位于z顺序的顶部。像这样:

SetWindowPos(b1, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
对于
HWND\u TOP

将窗口放置在Z顺序的顶部


您不希望子窗口位于最顶部,而是希望它位于z顺序的顶部。像这样:

SetWindowPos(b1, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
对于
HWND\u TOP

将窗口放置在Z顺序的顶部


除了设置z顺序外,如果控件重叠,还需要在控件上设置
WS\u clipsing
样式,以阻止它们相互重叠。

以及设置z顺序,如果控件重叠,则需要设置控件上的
WS_2;clipsing
样式,停止它们相互重叠绘制。

此处最顶部不起作用,因为子窗口必须保持与其父窗口相同的z顺序,并且设置WindowPos,其中HWND_最顶部为HWND_InsertAfter将尝试更改它。这里唯一需要的是WS\u剪辑,然后b1将保持在b2之上

 b1 = CreateWindow(L"BUTTON", L"button1", WS_CHILD | WS_VISIBLE | WS_TABSTOP,
100, 100, 200, 50, hWnd, (HMENU)100, NULL, NULL);

 b2 = CreateWindow(L"BUTTON", L"button2", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPSIBLINGS, 50, 100, 250, 50, hWnd, (HMENU)101, NULL, NULL);

Topmost在此处不起作用,因为子窗口必须保持与其父窗口相同的z顺序,并且将HWND_Topmost设置为HWND_InsertAfter将尝试更改它。这里唯一需要的是WS\u剪辑,然后b1将保持在b2之上

 b1 = CreateWindow(L"BUTTON", L"button1", WS_CHILD | WS_VISIBLE | WS_TABSTOP,
100, 100, 200, 50, hWnd, (HMENU)100, NULL, NULL);

 b2 = CreateWindow(L"BUTTON", L"button2", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPSIBLINGS, 50, 100, 250, 50, hWnd, (HMENU)101, NULL, NULL);

这里很好用。你的代码和我的代码有什么区别?当我在按钮“b2”上移动鼠标时,“b2”会移动到b1的顶部。所以问题出在你的代码中,而不是大卫的答案中。当您调用SetWindowPos时?当然不在WM_创建消息处理程序中。我在创建按钮后调用SetWindowPos。同样,您的代码有什么特殊之处?请记住,我们看不到它。在这里效果很好。你的代码和我的代码有什么区别?当我在按钮“b2”上移动鼠标时,“b2”会移动到b1的顶部。所以问题出在你的代码中,而不是大卫的答案中。当您调用SetWindowPos时?当然不在WM_创建消息处理程序中。我在创建按钮后调用SetWindowPos。同样,您的代码有什么特殊之处?请记住,我们看不到它。我在两个按钮上使用了WS_CLIPSIBLINGS样式,b1在顶部移动。如果我在b1之前创建b2,b2将在顶部移动。使用函数SetWindowPos,我可以移动顶部的两个按钮。问题在于窗口的样式。谢谢Jonathan Potter。我在两个按钮上使用了WS_CLIPSIBLINGS样式,b1在顶部移动。如果我在b1之前创建b2,b2将在顶部移动。使用函数SetWindowPos,我可以移动顶部的两个按钮。问题在于窗口的样式。谢谢乔纳森·波特。