5

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

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

如果窗口在WS_VISIBLE创建时具有样式,则窗口[WM_SHOWWINDOW]在创建后但在显示之前收到此消息。ShowWindow当orShowOwnedPopups 函数更改其可见性状态时,窗口也会收到此消息。

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

以下WM_SHOWWINDOW情况不发送消息:

  • WS_MAXIMIZE 当使用orWS_MINIMIZE样式创建顶层重叠窗口时。

  • 在对函数SW_SHOWNORMAL的调用中指定标志时。ShowWindow

MSDN 还指出:

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

Petzold 声明传递给此nCmdShow参数的参数将是SW_SHOWNORMAL,SW_SHOWMAXIMIZEDSW_SHOWMINNOACTIVE。我是否可以从中得出该ShowWindow()函数唯一不发送WM_SHOWWINDOW消息的时间,是我们第一次对它进行初始调用的时候Winmain()吗?如果是这样,它如何让窗口显示?此外,所有这些与窗户的实际绘画有何关系?

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

4

2 回答 2

2

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

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

这些帮助有用?

编辑

好吧,这个帖子已经发布了很多信息,所以我想我会尽量总结它,因为我能理解它。开始。

  1. WinMain 的 nCmdShow 参数似乎是历史的。相反,对 ShowWindow 的第一次调用就像您已将 this value 传递给它一样,无论您喜欢与否,因此最好对您的主窗口进行调用。尽管如此,你还是可以玩游戏并将其传递下去,你永远不会知道。

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

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

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

于 2018-05-28T10:11:37.320 回答
1

为什么要在执行消息循环之前在 WinMain() 的主体中对 ShowWindow() 进行初始调用?

答案在ShowWindow()文档中:

nCmdShow

控制窗口的显示方式。ShowWindow如果启动应用程序的程序提供了 STARTUPINFO 结构,则该参数在应用程序第一次调用时被忽略。否则,第一次 ShowWindow调用时,该值应该是 WinMain 函数在其 nCmdShow 参数中获取的值。

如果应用程序是由用户启动的,则没有STARTUPINFO,并且应该使用nCmdShowfrom来确定您的主 UI 应该如何显示(或不显示)。WinMain()

如果应用程序是由系统启动的,或者由另一个应用程序启动,则可能有 a STARTUPINFO,因此您应该忽略nCmdShowfromWinMain()并改用nCmdShowfrom STARTUPINFO

呼叫ShowWindow()会为您处理这两种情况。但是如果你用 强制窗口可见VS_VISIBLE,你就是不尊重调用者希望你的应用程序在启动时出现(或不出现)的方式。

于 2018-05-28T18:51:55.043 回答