1

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

4

1 回答 1

2

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

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

Windows 行为比其当前设置的标志更多。如果 Windows 的设计合理,这两种类型的窗口 (WS_POPUPWS_CHILD) 将由引擎盖下的两个完全不同的对象实现,这取决于传递给 CreateWindowEx 的标志。更改标志不会神奇地将底层对象从一种类型转变为另一种类型。

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

于 2012-06-08T00:59:53.040 回答