首先要注意的是,我最近才开始了解WinAPI。我确定此问题之前已被多次询问,但出于某种原因,我无法在网上找到它。问题只是这个;为什么在执行消息循环之前在ShowWindow()
的主体中初始调用WinMain()
?为什么不简单地通过使用WS_VISIBLE
标志将窗口设置为最初可见?
我对ShowWindow()
函数的机制也有一些疑问。它实际发送了哪些消息?在MSDN中,它声明:
如果窗口在创建时具有
WS_VISIBLE
样式,则为窗口 在创建之后,但在之前收到此消息[WM_SHOWWINDOW]
它显示。窗口也会收到此消息ShowWindow
或ShowOwnedPopups
更改了可见性状态 功能
这是否意味着ShowWindow()
功能与Windows之间的主要通信方式是通过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()
进行了第一次初始调用?如果是这样,它如何让窗口显示?此外,所有这些都与窗户的实际绘画有什么关系?
我很抱歉,如果我的问题有点混乱,但显示窗口的机制让我感到困惑,并且由于某种原因,很难在网上找到这些问题的明确答案(而不是仅仅是信息)。任何帮助澄清所有这些将非常感谢!
答案 0 :(得分:2)
WinMain的nCmdShow
参数背后的想法是,它让Windows有机会让您的应用程序知道Windows希望它如何显示窗口。该机制可能不再有用,但可能存在边缘情况。在任何情况下,您应该在创建它之后将其传递给您认为是主窗口的任何内容。隐藏创建它允许您创建任何没有闪烁的子窗口,这是大多数人所做的。
我认为WM_SHOWWINDOW
发送和未发送时的逻辑是允许您使用它来捕获窗口过程中对ShowWindow (hWnd, SW_HIDE)
和ShowWindow (hWnd, SW_SHOW)
的调用,因为它很可能是您可能希望在此时采取某些操作(例如停止播放音频)。也许还有SW_MINIMIZE
,SW_MAXIMIZE
和SW_RESTORE
,我猜这一切都取决于。
这有帮助吗?
修改强>
嗯,已经有很多信息发布到这个帖子中,所以我想我会尽量总结一下,我理解它。到此为止。
WinMain的nCmdShow参数似乎是历史性的。相反,第一次调用ShowWindow 就好像你已经传递了这个值,无论你喜不喜欢,所以最好调用你的主窗口。不过,也就是说,你也可以玩游戏并传递它,你永远不会知道。
阅读并理解Hans Passant对此帖的评论。这将告诉您在Windows UI中这个值最常来自哪里。
仅供参考,可以使用WS_VISIBLE设置创建子窗口。在显示主窗口之前,您不会看到它们。
答案 1 :(得分:1)
why bother with the initial call to ShowWindow() in the body of WinMain() before the execution of the message loop?
The answer is in the ShowWindow()
documentation:
nCmdShow
Controls how the window is to be shown. This parameter is ignored the first time an application calls
ShowWindow
, if the program that launched the application provides aSTARTUPINFO
structure. Otherwise, the first timeShowWindow
is called, the value should be the value obtained by theWinMain
function in itsnCmdShow
parameter.
If the app is started by the user, there is no STARTUPINFO
, and nCmdShow
from WinMain()
should be used to determine how your main UI should be displayed (or not).
If the app is started by the system, or by another app, there is likely to be a STARTUPINFO
, so you should ignore nCmdShow
from WinMain()
and use the nCmdShow
from the STARTUPINFO
instead.
Calling ShowWindow()
handles both conditions for you. But if you force the window visible with VS_VISIBLE
, you are not respecting how the caller wishes your app to appear (or not) at startup.