C++ 无父按钮

C++ 无父按钮,c++,winapi,C++,Winapi,我可以在WINAPI中创建没有父级的按钮吗 我试着做: CreateWindowEx(0, "Button", "BTN", WS_POPUP | BS_PUSHBUTTON, 0, 0, 15, 15, nullptr, nullptr, nullptr, nullptr); 然后,稍后将父窗口设置为指定窗口,并使用ShowWindow显示按钮。这确实创造了一个好看的按钮 但是,该按钮没有ID,无法在WM_命令中识别,因为ID为0。。如果两个按钮没有父母,就没有办法区分它们。现在,如果我通过

我可以在WINAPI中创建没有父级的按钮吗

我试着做:

CreateWindowEx(0, "Button", "BTN", WS_POPUP | BS_PUSHBUTTON, 0, 0, 15, 15, nullptr, nullptr, nullptr, nullptr);
然后,稍后将父窗口设置为指定窗口,并使用ShowWindow显示按钮。这确实创造了一个好看的按钮

但是,该按钮没有ID,无法在WM_命令中识别,因为ID为0。。如果两个按钮没有父母,就没有办法区分它们。现在,如果我通过Humenu参数给它一个ID:

CreateWindowEx(0, "Button", "BTN", WS_POPUP | BS_PUSHBUTTON, 0, 0, 15, 15, nullptr, 15, nullptr, nullptr);
GetLastError()打印“无效菜单句柄”,将不会创建按钮

如果我没有给它父母和WS_孩子,它会说不能创建一个顶级的孩子窗口,这是可以理解的

因此,我所做的是将父项设置为GetDesktopWindow(),并为按钮提供一个ID。这是可行的,但按钮并非无父项

那么,有没有一种方法可以给一个按钮一个ID(以便在WM_命令中识别它),同时让它的父项为NULL,以便我以后可以设置父项?Windows窗体是如何实现的?在您执行Form.add(ButtonName)之前,按钮可以是无父的

在WINAPI中可以实现同样的效果吗


我解决了。我必须将HWND_消息作为父参数传递。什么时候 调用SetParent时,该参数将更改为父级的句柄 一切都很好

不,您没有得到“无父按钮”:仅消息按钮的父窗口是“主”仅消息窗口(类“消息”)


我解决了。我必须将HWND_消息作为父参数传递。什么时候 调用SetParent时,该参数将更改为父级的句柄 一切都很好


不,您没有得到“无父按钮”:仅消息按钮的父窗口是“主”仅消息窗口(类“消息”)。

从表面上看,这是一个非常愚蠢的问题

按钮控件根据定义是子控件,因此对用于创建按钮的
CreateWindowEx
函数的调用也应该指定
WS\u child
样式

当然,正如您所提到的,您不能创建没有父控件的子控件;你会得到一个错误。没有顶级子窗口这样的东西

那么,第一个问题的答案是什么

我可以在WINAPI中创建没有父级的按钮吗

显然不是。按钮是子控件,所有子控件都必须有父控件

仅仅因为Windows允许您在创建按钮控件时指定
WS\u POPUP
标志,并不意味着它是一个有效的组合

我强烈建议重新阅读
CreateWindowEx
函数。特别要注意的是,
humenu
参数的含义是重载的。如果您正在创建重叠或弹出窗口(
WS_overlapped
WS_POPUP
),它将指定菜单的句柄。如果要创建子窗口(
WS\u child
),它将指定子窗口的标识符。根据窗口的样式,这两件事都使用相同的参数,这一事实应该告诉您一些事情

Windows窗体是如何实现的?在您执行Form.add(ButtonName)之前,按钮可以是无父的

他们当然不能。在将按钮控件添加到窗体或其他父控件之前,不会创建它们。
System.Windows.Forms.Button
类构造函数不创建Win32窗口。它只包含一组必要的样式,在适当的时候用于创建基础Win32窗口

当然,你也可以通过写一个C++ <代码>按钮< /Cord>类来做同样的事情。一个简单的实现只有与
CreateWindowEx
参数对应的成员变量和
Create
成员函数,一旦设置了所有成员,该函数将实际调用
CreateWindowEx
来创建Win32窗口。如果必要的成员之一尚未设置为有效值,则创建方法可能引发异常


我解决了。我必须将HWND_消息作为父参数传递。调用SetParent时,该参数将更改为父级的句柄,一切正常

不,这真的不是问题的“解决方案”。如前所述,您只需将按钮控件的父控件设置为。同样,这似乎是可行的,但这是一件相当奇怪的事情,我几乎不推荐它作为解决方案


如果您真的想破解它,我建议您创建自己的隐藏顶级窗口,用作“未加密”子控件的父控件。然后,您可以使用调用
SetParent
的相同技巧来重新分配它们

从表面上看,这是一个非常愚蠢的问题

按钮控件根据定义是子控件,因此对用于创建按钮的
CreateWindowEx
函数的调用也应该指定
WS\u child
样式

当然,正如您所提到的,您不能创建没有父控件的子控件;你会得到一个错误。没有顶级子窗口这样的东西

那么,第一个问题的答案是什么

我可以在WINAPI中创建没有父级的按钮吗

显然不是。按钮是子控件,所有子控件都必须有父控件

仅仅因为Windows允许您在创建按钮控件时指定
WS\u POPUP
标志,并不意味着它是一个有效的组合

我强烈建议重新阅读
CreateWindowEx
函数。特别要注意的是,
humenu
参数的含义是重载的。如果您正在创建重叠或弹出窗口(
WS_overlapped
WS_POPUP
),它将指定菜单的句柄。如果要创建子窗口(
WS\u child
),它将指定子窗口的标识符。这两件事都使用相同的参数,这取决于