【问题标题】:win32 notification Abt child control creationwin32 通知 Abt 子控件创建
【发布时间】:2019-04-21 16:11:39
【问题描述】:

所以我正在创建一个带有 CreateWindowEx() 函数的按钮,它的父 WM_CREATE 消息处理程序部分中的父(某个值)带有它自己的用户数据,即 CreateWindowEx() 的最后一个参数是指向一些任意数据的指针.

当创建根/主窗口时,我们会收到一个 WM_CREATE 或 WM_NCCREATE 消息允许我们通过 LPARAM 值使用 CREATESTRUCT 访问此日期,并通过 SetWindowPtr(user data) 将其分配给窗口

但是当一个子控件被创建并附加到这个父控件时,父窗口过程不会收到 WM_CREATE 消息和这个按钮的创建数据 传入CreateWindowEx()就丢失了

有没有办法知道子控件何时在父窗口过程中的这个父级中成功创建(或准备显示),以便我可以完成上述任务?

基本上我想创建一个控件的层次结构(例如在 Java 中带有面板和窗格),当父级收到 WM_CREATE 时创建它的子级(或其他一些消息,只是为了知道我何时可以开始为它分配子级)和这些孩子在收到他们的 WM_CREATE 消息并因此拥有自己的孩子时,依次创建自己的孩子。

【问题讨论】:

  • 按钮类的窗口过程由操作系统(user32.dll)提供,因此WM_CREATE 被发送到这里。您应该只在您注册的类类型的窗口上使用SetWindowPtr。但是这里没有问题,当CreateWindowEx 返回时,您知道您的子控件的创建已经完成。
  • 可以接收WM_CREATE子窗口,如果这是你想要的(使用GetClassInfo() / RegisterClass())。

标签: winapi


【解决方案1】:

父窗口接收 WM_PARENTNOTIFY 用于创建子窗口(以及一些其他事件)。确保不要设置 WS_EX_NOPARENTNOTIFY 扩展样式(默认情况下为对话框窗口类创建的控件设置)。

在创建窗口时作为 WM_PARENTNOTIFY 的一部分接收的数据包括在 WM_NCCREATE/WM_CREATE 期间发送到窗口的 LPCREATESTRUCT(WM_PARENTNOTIFY 仅在成功创建窗口时发生)。

【讨论】:

  • 是的,这完全符合我的目的。但是,如果我的父子层次结构的深度增加了,比如说父-->子-->孙-->曾孙怎么办?在父母收到孩子父母通知后,我将孙子分配给孩子,但随后我需要在父母中听取孙子 PARENTNOTIFY 以将曾孙分配给它。孙子 PARENTNOTIFY 会到达父程序吗? .一般来说,这个工作流程适用于组件树的任何深度吗?
  • 至于子类化和注册我自己的类,它工作得很好,但额外的工作往往会变得混乱
  • 关于在 WM_PARENTNOTIFY 文档中更改在窗口树中创建特定子窗口的位置:此消息还会发送到子窗口的所有祖先窗口,包括顶级窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多