子窗口

【勇芳软件工作室】汉化HomePreviousNext

A 【子窗口】具有WS_CHILD样式,仅限于其父窗口的客户端区域。应用程序通常使用子窗口将父窗口的客户区划分为功能区。您可以通过在CreateWindowEx函数中指定WS_CHILD样式来创建子窗口。

子窗口必须有父窗口。父窗口可以是重叠窗口,弹出窗口,甚至是另一个子窗口。您在调用CreateWindowEx时指定父窗口。如果您在CreateWindowEx中指定WS_CHILD样式,但不指定父窗口,则Windows不会创建窗口。

子窗口具有客户区,但没有其他功能,除非明确请求。应用程序可以请求标题栏,窗口菜单,最小化和最大化按钮,边框和子窗口的滚动条,但子窗口不能有菜单。如果应用程序指定了菜单句柄,当注册子窗口类或创建子窗口时,菜单句柄将被忽略。

定位

Windows总是将子窗口相对于父窗口的客户区域的左上角定位。子窗口的任何部分都不会出现在其父窗口的边界之外。如果应用程序创建一个大于父窗口的子窗口或定位子窗口,以使部分或全部子窗口扩展到父窗口的边框之外,Windows会剪切子窗口;也就是说,不显示父窗口的客户区域之外的部分。影响父窗口的操作也可以影响子窗口,如下所示。

父窗口子窗口
摧毁在父窗口被破坏之前被破坏。
在父窗口隐藏之前隐藏。子窗口只有在父窗口可见时才可见。
移动与父窗口的客户区移动。孩子的窗户负责在移动之后绘制客户区域。
显示显示在父窗口之后。

剪裁

Windows不会自动将子窗口从父窗口的客户区中剪辑出来。这意味着如果父窗口在与子窗口相同的位置执行任何绘图,则父窗口将绘制在子窗口上。但是,如果父窗口具有WS_CLIPCHILDREN样式,则Windows会从父窗口的客户端区域剪切子窗口。如果子窗口被剪切,则父窗口无法绘制。

子窗口可以与同一客户区中的其他子窗口重叠。与一个或多个其他子窗口共享同一父窗口的子窗口称为【兄弟窗口】.兄弟窗口可以绘制对方的客户区域,除非其中一个子窗口具有WS_CLIPSIBLINGS样式。如果子窗口确实有这样的风格,那么其子窗口中位于子窗口内的任何部分将被剪切。

如果窗口具有WS_CLIPCHILDREN或WS_CLIPSIBLINGS样式,则会出现性能轻微的损失。每个窗口占用系统资源,所以应用程序不应该不加区别地使用子窗口。为了获得最佳性能,需要逻辑上划分主窗口的应用程序应该在主窗口的窗口过程中进行,而不是使用子窗口。

与父窗口的关系

应用程序可以通过调用SetParent函数来更改现有子窗口的父窗口。在这种情况下,Windows将从旧父窗口的客户区删除子窗口,并将其移动到新父窗口的客户区。如果SetParent指定一个NULL句柄,则桌面窗口将成为新的父窗口。在这种情况下,子窗口会在任何其他窗口的边框外面的桌面上绘制。GetParent函数检索子窗口的父窗口的句柄。

父窗口将其客户区域的一部分放弃到子窗口,子窗口接收该区域的所有输入。父窗口的每个子窗口的窗口类不一定相同。这意味着一个应用程序可以使用看起来不同的子窗口来填充父窗口并执行不同的任务。例如,一个对话框可以包含许多类型的控件,每个控件都有一个子窗口,用于接受来自用户的不同类型的数据。

子窗口只有一个父窗口,但父窗口中可以有任何数量的子窗口。反过来,每个子窗口都可以有子窗口。在这个窗口链中,每个子窗口被称为原始父窗口的后代窗口。应用程序使用IsChild函数来发现给定的窗口是否是给定父窗口的子窗口或后代窗口。

EnumChildWindows函数枚举父窗口的子窗口。然后,EnumChildWindows将每个子窗口的句柄传递给应用程序定义的回调函数。给定父窗口的子窗口也被列举。

消息

Windows将子窗口的输入消息直接传递到子窗口;消息不会通过父窗口传递。唯一的例外是如果子窗口被EnableWindow功能禁用。在这种情况下,Windows会将任何已经转到子窗口的输入消息传递给父窗口。这允许父窗口检查输入消息,并在必要时启用子窗口。

子窗口可以有唯一的整数标识符。子窗口标识符在使用控制窗口时很重要。应用程序通过发送消息来指导控件的活动。应用程序使用控件的子窗口标识符将消息引导到控件。此外,控件向其父窗口发送通知消息。通知消息包括控件的子窗口标识符,父标识符用于标识发送消息的控件。通过将CreateWindowEx函数的【HMENU】参数设置为值而不是菜单句柄,应用程序将指定其他类型的子窗口的子窗口标识符。