我一直致力于创建一个跨平台的GUI库,我遇到了一个有趣的障碍。为了使界面更好,我试图创建一个没有父项的按钮,然后在构造函数完成后为它指定一个父项。我已经获得了大部分工作的代码,但是单击该按钮会导致父窗口失去焦点。 我正在使用CreateWindowEx()创建按钮,并为其提供样式WS_POPUP | BS_PUSHBUTTON和null父级。我使用WS_POPUP的原因是为了避免标题栏大小影响按钮的尺寸;没有它,按钮被压扁。创建按钮后,我使用SetParent()并用WS_CHILD替换WS_POPUP标志。
答案 0 :(得分:2)
Windows API窗口不灵活。记录on MSDN除非使用API调用(例如ShowWindow()
更改WS_VISIBLE
),否则无法手动更改标记。为什么不将调用延迟到CreateWindowEx()
,直到将库按钮对象分配给父窗口?
WS_POPUP意味着您要创建一个外行可能称之为窗口的内容。换句话说,可以包含小部件的顶级框架(WS_CHILD窗口)。然后,您设置为父级的窗口可能会失去焦点,因为尽管您将标志更改为WS_CHILD,但按钮在系统中显示为单独的顶级窗口。
Windows行为比当前设置的标志更多。如果Windows设计得很敏感,那么两种类型的窗口(WS_POPUP
和WS_CHILD
)将由两个完全不同的对象实现,根据传递给CreateWindowEx的标志选择。更改标志不会神奇地将底层对象从一种类型转换为另一种类型。
如果MSDN API文档没有明确说明某个标志是直接操作的,并且没有API调用来为您处理更改,那么窗口标识的那个方面是不可变的。