我一直致力于创建一个跨平台的 GUI 库,但遇到了一个有趣的障碍。为了使界面更好,我试图让创建一个没有父级的按钮成为可能,然后在构造函数完成后为其分配一个父级。我已经让代码大部分工作,但是单击按钮会导致父窗口失去焦点。我正在使用 CreateWindowEx() 创建按钮并为其赋予样式 WS_POPUP | BS_PUSHBUTTON 和一个空父。我使用 WS_POPUP 的原因是为了避免标题栏大小影响按钮的尺寸;没有它,按钮就会被压扁。创建按钮后,我使用 SetParent() 并将 WS_POPUP 标志替换为 WS_CHILD。
问问题
518 次
1 回答
2
Windows API 窗口没有这么灵活。正如MSDN 上所记录的,您不能手动更改标志,除非使用 API 调用(例如ShowWindow()
更改WS_VISIBLE
)。为什么不将调用延迟CreateWindowEx()
到将库按钮对象分配给父窗口?
WS_POPUP 意味着你想创建一个外行人可能称之为窗口的东西。换句话说,可以包含小部件(WS_CHILD 窗口)的顶级框架。尽管您将标志更改为 WS_CHILD,但您随后设置为父窗口的窗口可能会失去焦点,因为按钮在系统中显示为单独的顶级窗口。
Windows 行为比其当前设置的标志更多。如果 Windows 的设计合理,这两种类型的窗口 (WS_POPUP
和WS_CHILD
) 将由引擎盖下的两个完全不同的对象实现,这取决于传递给 CreateWindowEx 的标志。更改标志不会神奇地将底层对象从一种类型转变为另一种类型。
如果 MSDN API 文档没有明确说明标志是要直接操作的,并且没有 API 调用来为您处理更改,那么窗口身份的这一方面是不可变的。
于 2012-06-08T00:59:53.040 回答