【问题标题】:Dynamically parented button steals parent's focus动态父级按钮窃取父级的焦点
【发布时间】:2012-06-08 00:19:57
【问题描述】:

我一直致力于创建一个跨平台的 GUI 库,但遇到了一个有趣的障碍。为了使界面美观,我试图创建一个没有父级的按钮,然后在构造函数完成后为其分配一个父级。我已经使代码大部分工作,但是单击按钮会导致父窗口失去焦点。 我正在使用 CreateWindowEx() 创建按钮并为其赋予样式 WS_POPUP | BS_PUSHBUTTON 和一个空父。我使用 WS_POPUP 的原因是为了避免标题栏大小影响按钮的尺寸;没有它,按钮就会被压扁。创建按钮后,我使用 SetParent() 并将 WS_POPUP 标志替换为 WS_CHILD。

【问题讨论】:

    标签: winapi


    【解决方案1】:

    Windows API 窗口没有这么灵活。正如on MSDN 记录的那样,您不能手动更改标志,除非使用 API 调用(例如,ShowWindow() 更改 WS_VISIBLE)。为什么不延迟对CreateWindowEx() 的调用,直到将库按钮对象分配给父窗口?

    WS_POPUP 意味着您想要创建一个外行人可能称之为窗口的东西。换句话说,可以包含小部件(WS_CHILD 窗口)的顶级框架。尽管您将标志更改为 WS_CHILD,但您随后设置为父窗口的窗口可能会失去焦点,因为按钮在系统中显示为单独的顶级窗口。

    除了当前设置的标志外,Windows 行为还有更多。如果 Windows 的设计合理,则两种类型的窗口(@98​​7654325@ 和 WS_CHILD)将在底层由两个完全不同的对象实现,根据传递给 CreateWindowEx 的标志进行选择。更改标志不会神奇地将底层对象从一种类型转变为另一种类型。

    如果 MSDN API 文档没有明确说明标志是要直接操作的,并且没有 API 调用来为您处理更改,那么窗口身份的这方面是不可变的。

    【讨论】:

    • 这是有道理的。 API 文档说在使用 SetParent() 时应该更改 WS_CHILD 和 WS_POPUP 标志,因此必须有一些方法来更改它们。不过,我猜 Get/SetWindowLongPtr() 不是答案。
    • 我必须承认,我发现 API 文档的那部分内容很奇怪。我无法想象为什么一个按钮会明智地具有WS_POPUP 样式。也许这仅适用于嵌套窗口,例如属性表和对话框,它们与顶级窗口一样快乐并嵌套在父窗口中。
    • 我想我可能只是像房子所说的那样每次都重新创建窗口。有时我开始认为 Windows API 并没有那么糟糕,但我很快就回到了现实......
    猜你喜欢
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多