首先,我只是在最近才开始了解WinAPI。我相信这个问题已经问过很多次了,但出于某种原因,我在网上找不到它。问题很简单:为什么要在执行消息循环之前先在ShowWindow()正文中调用WinMain()呢?为什么不简单地通过使用WS_VISIBLE标志将窗口设置为最初可见呢?
我也有一些关于ShowWindow()函数的力学的问题。它实际上发送了哪些信息?在MSDN中,它指出:
如果窗口在创建时具有
WS_VISIBLE样式,则该窗口在创建后但在显示之前收到此消息[WM_SHOWWINDOW]。当ShowWindow或ShowOwnedPopups函数更改其可见性状态时,窗口也会收到此消息。
这是否意味着ShowWindow()函数和WM_SHOWWINDOW之间的主要通信方式是通过WM_SHOWWINDOW消息?它还指出:
在下列情况下不发送
WM_SHOWWINDOW消息:
WS_MAXIMIZE或WS_MINIMIZE样式创建顶层重叠窗口时.SW_SHOWNORMAL函数时指定了ShowWindow标志。MSDN还指出:
当应用程序第一次调用
ShowWindow时,它应该使用WinMain函数的nCmdShow参数作为nCmdShow参数。
Petzold声明传递给这个nCmdShow参数的参数将是SW_SHOWNORMAL、SW_SHOWMAXIMIZED或SW_SHOWMINNOACTIVE。我是否认为ShowWindow()函数唯一一次没有发送WM_SHOWWINDOW消息,是当我们第一次在Winmain()中对它进行初始调用时?如果是这样的话,它又如何使窗口显示呢?另外,所有这些与实际的窗口绘画有什么关系呢?
如果我的问题有点杂乱无章,我很抱歉,但是显示窗口的机制让我有点困惑,而且由于某些原因,很难在网上找到这些问题的明确答案(相对于一些零碎的信息)。任何帮助澄清这一切都将是非常感谢的!
发布于 2018-05-28 10:11:37
nCmdShow参数到WinMain的思想是,它给了WinMain一个机会,让您的应用程序知道Windows希望它如何显示窗口。这种机制可能不再有用,但可能存在边缘情况。在任何情况下,在创建主窗口之后,您都应该将其传递给任何您认为的主窗口。创建隐藏允许您创建没有闪烁的任何子窗口,所以这是大多数人所做的。
我认为发送WM_SHOWWINDOW和不发送它的逻辑是让您使用它来捕捉窗口proc中对ShowWindow (hWnd, SW_HIDE)和ShowWindow (hWnd, SW_SHOW)的调用,因为很可能您可能需要在那个时候采取一些行动(例如停止播放音频)。也许还有SW_MINIMIZE,SW_MAXIMIZE和SW_RESTORE,我想这都要看情况了。
这有帮助吗?
编辑
嗯,相当多的信息已经被张贴到这个帖子,所以我想我会尝试总结它的最好的我理解它。开始吧。
好了,我不干了。有时候少就是多。
发布于 2018-05-28 18:51:55
为什么要费心在消息循环执行之前先调用ShowWindow()主体中的ShowWindow()呢?
答案在ShowWindow()文档中:
nCmdShow 控制窗口的显示方式。当应用程序第一次调用
ShowWindow时,该参数将被忽略,如果启动应用程序的程序提供了另一种STARTUPINFO结构。否则,当第一次调用ShowWindow时,该值应该是WinMain函数在其nCmdShow参数中获得的值。
如果应用程序是由用户启动的,则不存在STARTUPINFO,应该使用来自WinMain()的nCmdShow来确定您的主UI应该如何显示(或不显示)。
如果应用程序是由系统启动的,或者是由另一个应用程序启动的,那么可能会有一个STARTUPINFO,所以您应该忽略来自WinMain()的nCmdShow,而应该使用来自STARTUPINFO的nCmdShow。
调用ShowWindow()为您处理这两种情况。但是,如果您强制使用VS_VISIBLE显示窗口,则不尊重调用方希望您的应用程序在启动时出现(或不出现)的方式。
https://stackoverflow.com/questions/50562616
复制相似问题