gpt4 book ai didi

c - 为什么要对 ShowWindow() 进行初始调用?

转载 作者:可可西里 更新时间:2023-11-01 13:37:00 26 4
gpt4 key购买 nike

首先要注意,我只是最近才开始学习 WinAPI。我敢肯定这个问题之前已经被问过很多次了,但是由于某种原因我无法在网上的任何地方找到它。问题很简单;为什么要在执行消息循环之前在 WinMain() 的主体中对 ShowWindow() 进行初始调用?为什么不简单地通过使用 WS_VISIBLE 标志将窗口设置为初始可见?

我对 ShowWindow() 函数的机制也有一些疑问。它实际上发送了哪些消息?在 MSDN 中它指出:

If a window has the WS_VISIBLE style when it is created, the window receives this message [WM_SHOWWINDOW] after it is created, but before it is displayed. A window also receives this message when its visibility state is changed by the ShowWindow or ShowOwnedPopups function.

这是否意味着 ShowWindow() 函数与 Windows 之间的主要通信方式是通过 WM_SHOWWINDOW 消息?它还指出:

The WM_SHOWWINDOW message is not sent under the following circumstances:

  • When a top-level, overlapped window is created with the WS_MAXIMIZE or WS_MINIMIZE style.

  • When the SW_SHOWNORMAL flag is specified in the call to the ShowWindow function.

MSDN 还指出:

The first time an application calls ShowWindow, it should use the WinMain function's nCmdShow parameter as its nCmdShow parameter.

Petzold 声明传递给此 nCmdShow 参数的参数将是 SW_SHOWNORMALSW_SHOWMAXIMIZEDSW_SHOWMINNOACTIVE。我是否认为 ShowWindow() 函数唯一不发送 WM_SHOWWINDOW 消息的时间是我们在 中首次调用它的时候>Winmain()?如果是这样,它如何让窗口显示?此外,所有这些与 window 的实际绘画有什么关系?

如果我的问题有点乱,我很抱歉,但是显示窗口的机制让我有点困惑,而且由于某种原因,很难在网上找到这些问题的明确答案(而不是仅仅零零碎碎的)信息片段)。任何有助于澄清所有这些的帮助将不胜感激!

最佳答案

WinMain 的 nCmdShow 参数背后的想法是,它让 Windows 有机会让您的应用程序知道 Windows 希望它如何显示窗口。该机制可能不再有用,但可能存在边缘情况。在任何情况下,您都应该在创建主窗口后将其传递给您认为是主窗口的任何内容。将其创建为隐藏允许您创建任何不闪烁的子窗口,这是大多数人所做的。

我认为发送和不发送 WM_SHOWWINDOW 背后的逻辑是让您使用它来捕获对 ShowWindow (hWnd, SW_HIDE) 的调用ShowWindow (hWnd, SW_SHOW) 在你的窗口过程中,因为你可能想在那个时候采取一些行动(例如停止播放音频)。也许还有 SW_MINIMIZESW_MAXIMIZESW_RESTORE,我想这一切都取决于。

这有什么帮助吗?

编辑

好吧,很多信息已经发布到这个线程,所以我想我会尽量总结一下我所理解的。开始吧。

  1. WinMain 的 nCmdShow 参数似乎是历史性的。相反,对 ShowWindow 的第一次调用 就像您已将此值传递给它 一样,无论您是否喜欢,因此该调用最好是对您的主窗口。不过,话虽如此,你还不如玩这个游戏并把它传下去,你永远不会知道。

  2. 阅读并理解 Hans Passant 对本文的评论。这将告诉您此值最常来自 Windows UI 中的哪个位置。

  3. 仅供引用,可以创 build 置了 WS_VISIBLE 的窗口。在显示主窗口之前,您不会看到它们。

好的,我完成了。有时少即是多。

关于c - 为什么要对 ShowWindow() 进行初始调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50562616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com