【问题标题】: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 不能正常工作。

【问题讨论】:

    标签: c++ winapi


    【解决方案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 我可以在顶部移动两个按钮。问题出在窗口的样式上。谢谢乔纳森·波特。
      猜你喜欢
      • 2023-02-01
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 2013-12-08
      相关资源
      最近更新 更多