【问题标题】:Purpose of WM_CREATE message?WM_CREATE 消息的目的?
【发布时间】:2020-04-21 19:43:22
【问题描述】:

当您可以创建没有 WM_CREATE 消息的窗口时,拥有 WM_CREATE 消息有什么意义。

在 WM_CREATE 之外调用 void CreateWindowA 可以工作,有什么关系?

【问题讨论】:

  • 你不能用它创建窗口
  • 希望您不要通过发布WM_DESTROY 消息而不是调用DestroyWindow 函数来破坏窗口。
  • DOCS?
  • 我的意思是对 CreateWindowA 的调用即使不在 WM_CREATE 中也能正常工作。显然不是真的用它来创建窗口。
  • 好的,但是在创建窗口之前您不会收到消息,所以为了在那里调用CreateWindow,您需要另一个窗口。

标签: c++ winapi


【解决方案1】:

WM_CREATE 消息在创建窗口但尚未显示时由窗口过程接收。您可以准备初始状态。例如,您可以创建控件(子窗口),设置控件的默认值等。如果出现问题,您可以取消创建窗口,它不会显示。换句话说,在WM_CREATE 中,您可以将自定义扩展添加到CreateWindow API。

【讨论】:

    【解决方案2】:

    应用程序想要/需要拦截WM_CREATE 消息的原因有很多。例如,您可能想要检查特定条件,并在该条件错误时阻止实际创建:您可以通过从处理消息 (see the documentation) 的 WndProc 返回 -1 来做到这一点:

    如果应用程序处理此消息,它应该返回零到 继续创建窗口。如果应用程序返回 –1,则 窗口被销毁并且 CreateWindowExCreateWindow 函数 返回一个 NULL 句柄。

    【讨论】:

    • 只在那里调用函数 CreateWindowA 还是应该在不同的地方创建窗口是一种好习惯?
    • WM_CREATE 处理程序是创建子窗口最常见的地方,但没有什么说你必须这样做。例如,除非设置了特定标志,否则属性表对话框会推迟单个页面对话框的创建,直到页面实际显示。 (虽然在这种情况下,用户代码不会调用 CreateWindow,但 CreateDialog 和 DialogBox 调用最终会导致这样的调用)。我曾经使用复选框来翻转是否实际创建了特定的子窗口。在 win16 的日子里,你更有可能在创建窗口时遇到系统限制。
    • 你不能只在那里调用它。因为在您调用 CreateWindow 之前,消息永远不会发送给您。
    • @Unknownguy 也许你还没有理解这个顺序——应用程序调用CreateWindow 来获取特定的窗口类,CreateWindow 准备了还不可见的窗口,在完成它的工作之前它发送WM_CREATE到窗口类函数。如果函数要处理WM_CREATE,它可以做到。否则该消息将被忽略并以默认方式创建窗口。
    【解决方案3】:

    当您可以创建时使用 WM_CREATE 消息有什么意义 没有它的窗户。

    如果你不显式处理WM_CREATE消息,它实际上是由系统通过DefWindowProc(hwnd, uMsg, wParam, lParam);隐式处理的。所以你看到了可见的窗口。

    WM_CREATE 消息在CreateWindowExCreateWindow 函数返回之前发送,让您有机会干预上述函数的结果。您可以allow(返回零以继续创建窗口)或prevent(返回–1,窗口被销毁)使窗口可见,以及它的外观喜欢。

    WM_NCCREATEWM_CREATE 消息在窗口之前发送 变得可见。这使它们成为初始化您的好地方 UI——例如,确定窗口的初始布局

    参考“Managing Application State”、“WM_CREATE message”。

    【讨论】:

      猜你喜欢
      • 2012-11-12
      • 1970-01-01
      • 2023-02-24
      • 2013-07-05
      • 1970-01-01
      • 2014-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多