首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么对ShowWindow()进行初始调用?

为什么对ShowWindow()进行初始调用?
EN

Stack Overflow用户
提问于 2018-05-28 08:59:31
回答 2查看 1.8K关注 0票数 5

首先,我只是在最近才开始了解WinAPI。我相信这个问题已经问过很多次了,但出于某种原因,我在网上找不到它。问题很简单:为什么要在执行消息循环之前先在ShowWindow()正文中调用WinMain()呢?为什么不简单地通过使用WS_VISIBLE标志将窗口设置为最初可见呢?

我也有一些关于ShowWindow()函数的力学的问题。它实际上发送了哪些信息?在MSDN中,它指出:

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

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

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

  • 当使用WS_MAXIMIZEWS_MINIMIZE样式创建顶层重叠窗口时.
  • 当在调用SW_SHOWNORMAL函数时指定了ShowWindow标志。

MSDN还指出:

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

Petzold声明传递给这个nCmdShow参数的参数将是SW_SHOWNORMALSW_SHOWMAXIMIZEDSW_SHOWMINNOACTIVE。我是否认为ShowWindow()函数唯一一次没有发送WM_SHOWWINDOW消息,是当我们第一次在Winmain()中对它进行初始调用时?如果是这样的话,它又如何使窗口显示呢?另外,所有这些与实际的窗口绘画有什么关系呢?

如果我的问题有点杂乱无章,我很抱歉,但是显示窗口的机制让我有点困惑,而且由于某些原因,很难在网上找到这些问题的明确答案(相对于一些零碎的信息)。任何帮助澄清这一切都将是非常感谢的!

EN

回答 2

Stack Overflow用户

发布于 2018-05-28 10:11:37

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

我认为发送WM_SHOWWINDOW和不发送它的逻辑是让您使用它来捕捉窗口proc中对ShowWindow (hWnd, SW_HIDE)ShowWindow (hWnd, SW_SHOW)的调用,因为很可能您可能需要在那个时候采取一些行动(例如停止播放音频)。也许还有SW_MINIMIZESW_MAXIMIZESW_RESTORE,我想这都要看情况了。

这有帮助吗?

编辑

嗯,相当多的信息已经被张贴到这个帖子,所以我想我会尝试总结它的最好的我理解它。开始吧。

  1. nCmdShow参数到WinMain似乎是历史的。相反,对ShowWindow的第一个调用就好像您已经传递了这个值一样,不管您喜欢与否,所以这个调用最好是传递到主窗口。不过,话虽如此,你最好还是玩这个游戏,然后把它传下去,你永远不会知道。
  2. 阅读并理解汉斯·帕桑对这篇文章的评论。这将告诉您这个值在Windows中最常见的来源。
  3. 只是FYI,可以用WS_VISIBLE设置创建您的子窗口。除非你展示主窗,否则你是看不到它们的。

好了,我不干了。有时候少就是多。

票数 2
EN

Stack Overflow用户

发布于 2018-05-28 18:51:55

为什么要费心在消息循环执行之前先调用ShowWindow()主体中的ShowWindow()呢?

答案在ShowWindow()文档中:

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

如果应用程序是由用户启动的,则不存在STARTUPINFO,应该使用来自WinMain()nCmdShow来确定您的主UI应该如何显示(或不显示)。

如果应用程序是由系统启动的,或者是由另一个应用程序启动的,那么可能会有一个STARTUPINFO,所以您应该忽略来自WinMain()nCmdShow,而应该使用来自STARTUPINFOnCmdShow

调用ShowWindow()为您处理这两种情况。但是,如果您强制使用VS_VISIBLE显示窗口,则不尊重调用方希望您的应用程序在启动时出现(或不出现)的方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50562616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档