Winapi 动态父按钮窃取父项';s焦点

Winapi 动态父按钮窃取父项';s焦点,winapi,Winapi,我一直在努力创建一个跨平台的GUI库,我遇到了一个有趣的障碍。为了使界面更美观,我尝试创建一个没有父按钮的按钮,然后在构造函数完成后为其分配一个父按钮。我已经让代码大部分工作,但点击按钮会导致父窗口失去焦点。 我正在使用CreateWindowEx()创建按钮,并为其提供样式WS|u POPUP | BS|u butdown和空父按钮。我使用WS_弹出窗口的原因是为了避免标题栏大小影响按钮的尺寸;没有它,按钮就会被压扁。创建按钮后,我使用SetParent()并用WS\u CHILD替换WS\u

我一直在努力创建一个跨平台的GUI库,我遇到了一个有趣的障碍。为了使界面更美观,我尝试创建一个没有父按钮的按钮,然后在构造函数完成后为其分配一个父按钮。我已经让代码大部分工作,但点击按钮会导致父窗口失去焦点。
我正在使用CreateWindowEx()创建按钮,并为其提供样式WS|u POPUP | BS|u butdown和空父按钮。我使用WS_弹出窗口的原因是为了避免标题栏大小影响按钮的尺寸;没有它,按钮就会被压扁。创建按钮后,我使用SetParent()并用WS\u CHILD替换WS\u弹出标志。

Windows API窗口没有这么灵活。如前所述,除非使用API调用(例如
ShowWindow()
更改
WS\u VISIBLE
),否则无法手动更改标志。为什么不延迟调用
CreateWindowEx()
,直到库按钮对象被指定给父窗口

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

windows行为不仅仅是其当前设置的标志。如果Windows的设计是感性的,则两种类型的窗口(
WS_POPUP
WS_CHILD
)将由引擎盖下的两个完全不同的对象实现,具体取决于传递给CreateWindowEx的标志。更改标志不会神奇地将底层对象从一种类型变形为另一种类型


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

这是有道理的。API文档说,在使用SetParent()时,应该更改WS_CHILD和WS_POPUP标志,因此必须有某种方法来更改它们。不过,我想Get/SetWindowLongPtr()并不是答案。我必须承认,我发现API文档中的这一点非常奇怪。例如,我无法想象为什么一个按钮会有
WS\u弹出式
风格。也许这只适用于嵌套窗口,如属性表和对话框,它们与顶级窗口一样快乐,嵌套在父窗口中。我想我可能只是像House所说的那样每次重新创建窗口。有时我开始觉得Windows API没有那么糟糕,但我很快就回到了现实。。。