将子控件移到顶部
Posted
技术标签:
【中文标题】将子控件移到顶部【英文标题】:Moving a child control to top 【发布时间】:2016-06-16 13:43:05 【问题描述】:当一个控件在 windows API 中重叠在一起时,我如何将它们移到另一个顶部。
例如我创建了 2 个按钮 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"button2", WS_CHILD | WS_VISIBLE | WS_TABSTOP,
50, 100, 250, 50, my_Window_handle, (HMENU)101, NULL, NULL);
我想将 b1 移动到 b2 或任何控件的顶部。 我使用函数 SetWindowPos 作为
SetWindowPos(b1, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
但 id 不能正常工作。
【问题讨论】:
【参考方案1】:您不希望子窗口位于最顶部,而是希望它位于 z 顺序的顶部。像这样:
SetWindowPos(b1, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
documentation 表示HWND_TOP
:
将窗口置于 Z 顺序的顶部。
【讨论】:
在这里工作得很好。你的代码和我的代码有什么区别? 当我在按钮'b2'上移动鼠标时,'b2'移动到b1的顶部。 所以问题出在您的代码中,而不是在大卫的回答中。当你调用 SetWindowPos?当然不在 WM_CREATE 消息处理程序中。 我在创建按钮后调用 SetWindowPos。 再次,您的代码有什么特别之处?请记住,我们看不到它。【参考方案2】:Topmost 在这里不起作用,因为子窗口必须与其父窗口保持相同的 z 顺序,并且 SetWindowPos 将 HWND_TOPMOST 作为 Hwnd_InsertAfter 将尝试更改它。您在这里只需要 WS_CLIPSIBLINGS,然后 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);
【讨论】:
【参考方案3】:除了设置 z 顺序之外,如果控件重叠,您还需要在控件上设置 WS_CLIPSIBLINGS
样式,以防止它们相互重叠。
【讨论】:
我在两个按钮上使用了 WS_CLIPSIBLINGS 样式,并将 b1 移到顶部。如果我在 b1 之前创建 b2,则 b2 在顶部移动。使用功能 SetWindowPos 我可以在顶部移动两个按钮。问题出在窗口的样式上。谢谢乔纳森·波特。以上是关于将子控件移到顶部的主要内容,如果未能解决你的问题,请参考以下文章
Android 11.0 GMS版本将Google搜索框移到顶部修改方法
Android 11.0 GMS版本将Google搜索框移到顶部修改方法