为什么首先调用 ShowWindow()?

2024-03-22

首先需要注意的是,我最近才开始学习 WinAPI。我确信这个问题以前已经被问过很多次了,但由于某种原因我在网上找不到它。问题很简单;为什么要费心最初的电话ShowWindow()在体内WinMain()在消息循环执行之前?为什么不简单地通过使用将窗口设置为最初可见WS_VISIBLE flag?

我也有一些关于机制的问题ShowWindow()功能。它实际发送哪些消息? MSDN 中指出:

如果一个窗口有WS_VISIBLE创建时的样式,窗口 收到此消息[WM_SHOWWINDOW]创建之后但之前 它被显示。窗口在其 可见性状态被改变ShowWindow or ShowOwnedPopups功能。

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

The WM_SHOWWINDOW在以下情况下消息不会发送 情况:

  • 当使用以下命令创建顶层重叠窗口时WS_MAXIMIZE or WS_MINIMIZE style.

  • 当。。。的时候SW_SHOWNORMAL调用中指定了标志 到ShowWindow功能。

MSDN 还指出:

应用程序第一次调用ShowWindow,它应该使用WinMain功能nCmdShow参数作为其nCmdShow范围。

佩措尔德指出,论点传递给了这个nCmdShow参数将是SW_SHOWNORMAL, SW_SHOWMAXIMIZED or SW_SHOWMINNOACTIVE。我是否可以从这件事中得出唯一的一次ShowWindow()函数不发送WM_SHOWWINDOW消息,是当我们第一次初始调用它时Winmain()?如果是这样,它如何让窗口显示?另外,所有这些与窗户的实际绘画有何关系?

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


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

我认为背后的逻辑WM_SHOWWINDOW是和不是发送是为了让你用它来接听来电ShowWindow (hWnd, SW_HIDE) and ShowWindow (hWnd, SW_SHOW)在您的窗口过程中,因为您可能想在那时采取一些操作(例如停止播放音频)。也许还有SW_MINIMIZE, SW_MAXIMIZE and SW_RESTORE,我想这一切都取决于。

这些帮助有用?

Edit

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么首先调用 ShowWindow()? 的相关文章

随机推荐

  • SQL Server 如何将 5 分钟的间隔重新组合为 15 分钟的间隔?

    我正在建立一个网站 您可以在其中在线预约 我不会详细解释所有内容 但我有一张桌子 上面有我可以预约的时间 以 5 分钟为间隔进行分配 这是一个例子 ID StartDate EndDate 492548 2016 12 16 08 00 0
  • 这是在关系数据库中对地址信息进行建模的好方法吗?

    我想知道这是否是一个好的设计 我有许多需要地址信息的表 例如街道 邮政编码 邮政编码 国家 地区 传真 电子邮件 有时同一个地址会重复多次 例如 可以针对供应商存储地址 然后在发送给他们的每个采购订单上存储地址 然后 供应商可以更改其地址
  • 如何对二维numpy数组的所有列进行逻辑运算

    假设我有以下内容2D NumPy由四行三列组成的数组 gt gt gt a numpy array True False False False True False gt gt gt array True False False Fals
  • 在数据库中存储从客户收到的 hl7 消息的最佳方法

    大家好 我是新欢 我想知道将 hl7 消息存储在 mysql 数据库中的表中的最佳方法 该表仅将一列存储为 hl7 消息 或者存储在行和列中 例如发送应用程序列 接收应用程序列等 我无法找到合适的答案 所以请帮助我 提前致谢 解析 HL7
  • 如何解决“恐慌:sql:未知驱动程序“postgres”(忘记导入?)»?

    我正在尝试使用 GO 将 csv 预先固定宽度 表格 中的数据插入到 POSTGRES 中 我做了什么 package main import bufio database sql encoding csv encoding json fm
  • 在运行时创建委托类型

    我尝试使用 Expression 类创建委托类型 但是当我尝试从 MethodInfo 实例创建委托时 我遇到了 ArgumentException 我使用 NET 4 0 这里的代码 var method List
  • jsf 中每个 SelectOneMenu 项的工具提示

    我的要求是提供一个tooltip对于每个选项SelectOneMenu因为选项标签太大 不可能提供这么大尺寸的 SelectOneMenu 所以 标签正在切割 这就是为什么我需要工具提示来显示 鼠标悬停在 SelectOneMenu 中的选
  • 使用discord.js 加入discord 服务器时的欢迎消息

    我正在使用node js 和discord js 制作一个discord 机器人 目前我正在尝试制作它 以便当用户加入discord 服务器时 会发送自定义欢迎消息 这是我的代码 bot on guildMemberAdd message
  • 用于转录音频文件中的语音的开源软件[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 谁能推荐可靠的开源软件来在 wav 文件中转录英语语音 我研究过的两个主要程序是Sphinx http
  • 单独文件中的函数实现

    在单独的文件中实现函数的正确语法是什么 例如 foo h int Multiply const int Number foo cpp include foo h int Multiply const int Number return Nu
  • Mysql自动为字段添加前缀

    示例表1 id field1 field2 table2 id id1 field1 field2 是否有可能做到这一点 select t1 t2 from table1 t1 inner join table2 t2 on t1 id t
  • 在端口 3000 上对 Node.js 应用程序进行 AWS 负载平衡

    我有一个 Node js Express Web 应用程序 它使用默认端口 3000 并通过弹性 IP 在 Ubuntu EC2 实例上响应良好 我正在尝试设置 AWS 内置的负载平衡 但似乎无法通过良好的运行状况检查 设置 2 个 ubu
  • 本地主机上的 socket.io 出现 404 错误 - XAMPP - Laravel 5.5

    我在本地主机上使用 XAMPP Window 8 1 Laravel 5 5 我使用 Pusher 在 Laravel 中编写了广播代码 并且工作正常 由于 Pusher 非常昂贵 所以我打算转向 socket io 在主刀片中添加了以下链
  • 如何使用批处理文件迭代 .ini 文件中的项目?

    我目前正在尝试循环遍历 a 中的每个项目 ini文件并稍后使用这些值 但我不知道怎么做 我的config ini文件看起来像这样 items item 1 XXXXX item 2 XXXXX item 3 XXXXX item 4 XXX
  • JHipster 微服务 CORS

    有没有一种方法可以通过网关访问微服务API而无需身份验证 例如 如果我有一个公共登录页面需要从微服务 API 读取数据 我启用了 CORS 并通过 Swagger 测试了 API 它在网关应用程序中运行良好 但是 如果我使用 CURL 调用
  • 在 C# 中(可能在不安全模式下)读取锁定文件的侵入性最小的方法是什么?

    我需要读取可能被锁定的 Windows 文件 但我不想创建任何类型的锁来阻止其他进程写入该文件 另外 即使文件被锁定为独占使用 我也想看看里面有什么 尽管这不是我的确切用例 但请考虑如何在使用和安装时读取 SQL Exchange 日志或数
  • 使用hibernate返回查询的计数值

    这是我的 mysql 查询 SELECT count FROM bw jobs WHERE year job date year curdate AND month job date month curdate 如何在休眠中使用它来获取计数
  • 构建带有复选标记的 NSOutline 视图

    我希望使用正确的 Apple 推荐方法向 NSOutlineview 添加复选框 但文档中尚不清楚 如何添加行为以允许用户如果单击父复选框 则它将选择子项 如果我单击它 它将取消选择该项目的子项 编辑 我简化了我的问题并添加了图像以使其更清
  • 如何从 DragEventArgs 确定数据类型

    我已经在我的应用程序中实现了拖放 但在确定被拖动对象的类型时遇到一些困难 我有一个基类Indicator以及从它派生的几个类 拖动的对象可以是这些类型中的任何一种 下面的代码片段看起来不太优雅 并且容易出现维护问题 每次我们添加一个新的派生
  • 为什么首先调用 ShowWindow()?

    首先需要注意的是 我最近才开始学习 WinAPI 我确信这个问题以前已经被问过很多次了 但由于某种原因我在网上找不到它 问题很简单 为什么要费心最初的电话ShowWindow 在体内WinMain 在消息循环执行之前 为什么不简单地通过使用