将子控件移到顶部

Posted

技术标签:

【中文标题】将子控件移到顶部【英文标题】:Moving a child control to top 【发布时间】:2016-06-16 13:43:05 【问题描述】:

当一个控件在 windows API 中重叠在一起时,我如何将它们移到另一个顶部。

例如我创建了 2 个按钮 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 作为

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搜索框移到顶部修改方法

在多行选项卡控件中将它们从底部移动到顶部时,标签页正在跳跃

android:gravity="top" 不将子视图对齐到顶部,但“中心”对齐到中心?

Android的FixScrollView自定义控件

Android ScrollView 滚动到顶部