为什么要初始调用ShowWindow()?

Pvt*_*itt 5 c windows winapi showwindow

首先要注意的是,我最近才开始了解WinAPI.我确定此问题之前已被多次询问,但出于某种原因,我无法在网上找到它.问题只是这个; 为什么要ShowWindow()WinMain()执行消息循环之前在体内初始调用呢?为什么不简单地通过使用WS_VISIBLE标志将窗口设置为最初可见?

我对ShowWindow()函数的机制也有一些疑问.它实际发送了哪些消息?在MSDN中,它声明:

如果窗口在WS_VISIBLE创建时具有样式,则窗口[WM_SHOWWINDOW]在创建之后但在显示之前接收此消息.当ShowWindowor或ShowOwnedPopups function 更改其可见性状态时,窗口也会收到此消息.

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

WM_SHOWWINDOW下列情况下不发送消息:

  • 使用WS_MAXIMIZEWS_MINIMIZE样式创建顶级重叠窗口时.

  • 在函数SW_SHOWNORMAL调用中指定标志时ShowWindow.

MSDN还声明:

应用程序第一次调用时ShowWindow,应该使用 WinMain函数的nCmdShow参数作为nCmdShow参数.

彼佐尔德指出,传递给此参数nCmdShow参数将是要么SW_SHOWNORMAL,SW_SHOWMAXIMIZEDSW_SHOWMINNOACTIVE.我是否可以从中获取该ShowWindow()函数唯一没有发送WM_SHOWWINDOW消息的时间,那就是当我们对它进行第一次初始调用时Winmain()?如果是这样,它如何让窗口显示?此外,所有这些都与窗户的实际绘画有什么关系?

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

Pau*_*ers 2

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

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

这些帮助有用?

编辑

嗯,相当多的信息已经发布到这个线程,所以我想我会尽力总结它,因为我理解它。开始。

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

  2. 阅读并理解 Hans Passant 对这篇文章的评论。这将告诉您该值在 Windows UI 中最常见的来源。

  3. 仅供参考,可以使用 WS_VISIBLE 设置创建窗口。在显示主窗口之前您不会看到它们。

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