【问题标题】:vb6 icon location on windowsWindows上的vb6图标位置
【发布时间】:2011-07-28 09:46:40
【问题描述】:

在哪里可以找到原始 vb6(或 windows)图标? (.ico 文件)

消息框上出现的我需要、错误、警告、问题和信息图标。

非常感谢。

【问题讨论】:

  • 你在说什么?您想要 VB 6 应用程序的默认图标——看起来像一个小表格的图标吗?或者您正在寻找 Windows 标志图标?或者您是否正在寻找 VB 6 代码 来显示带有标准图标(错误、警告、问题、信息)的消息框?
  • 我正在制作一个自定义消息框表单和 vs 2008,客户希望它带有我提到的旧图标。
  • 非常感谢投反对票,请问图标在哪里有错吗?
  • 向下投票箭头上的工具提示显示“这个问题没有显示任何研究工作;它不清楚或没有用。”我觉得我原来的评论很清楚地解释了为什么我认为这个问题不清楚(因此没有用)。我的一般政策是在针对我的 cmets 编辑问题并且澄清所问的内容时删除此类反对票。这个问题需要很多帮助。但是我不太喜欢抱怨投票失败,而且我认为这个问题实际上并没有得到足够的改进,所以我会把 -1 留在那里。感谢您的参与。
  • 问题的哪一部分不清楚?我不明白你的评论

标签: windows vb6 icons


【解决方案1】:

由于每个操作系统版本的图标可能不同,您可以使用 LoadIcon() 传递标准图标 ID 之一从 Windows 获取图标。
详情请见http://msdn.microsoft.com/en-us/library/ms648072.aspx
如果您希望它们作为 .ico 文件,您可以使用资源编辑器从 user32.dll 中提取它们(在您的开发机器上)。

(更新了来自 Cody Gray 的更正信息)

【讨论】:

  • 不,不,不,不。不要这样做。它不仅不一定合法,而且极有可能在未来版本的 Windows 上崩溃。即使在 service pack 中,也无法保证图标始终具有相同的资源 ID,更不用说完整版本了。为此目的,有一个专门的 API。它被方便地命名为LoadIcon function,并且您传入要加载的系统图标的标识符。所有标准的都可用。当然,这在 VB 中比调用 Win32 API 函数更容易。
  • 啊,是的,我忘记了这些。如果你想做一个更完整的答案,我可以删除我的(或者只是更新它)。谢谢。
  • 我仍在等待提问者的回复,了解这里的实际问题。更新你的答案对我来说很酷。
【解决方案2】:

标准 Windows 消息框图标在不同版本的 Windows 中已多次更改。它们包含在几个系统 DLL 文件中,但您不应该尝试自己动态提取它们。正如我在对另一个答案的评论中提到的那样,ID 号没有记录是有原因的:即因为它们有可能在未来的 Windows 版本甚至未来的 Windows 更新中发生变化。也绝对没有理由去尝试提取它们。如果您问得好,Windows 已经为您检索它们。

询问的好方法是使用LoadIcon function,并指定您想要的图标的IDI 标识符。 Windows 将返回一个HICON 值,或一个图标资源的句柄。

既然您提到您使用的是 VB.NET,您还可以使用 SystemIcons class,它具有返回任何常用图标的静态属性。这是一个 .NET 包装器,让您不必自己从 Windows API P/Invoke LoadIcon 函数。

更好的是,如果您只想显示一个包含其中一个图标的消息框,您只需拨打MessageBox API function。告诉 Windows 你想要的 MB_ICON 值,然后你就走了。和以前一样,.NET Framework 已经为您包装了同名的 MessageBox class

这两个函数的好处是无论当前的 Windows 版本如何,它们都将始终返回正确的图标。试图澄清问题的评论似乎表明您想在当前版本的 Windows 上使用 old 图标。但是,当然,您不想这样做。图标已在整个 Windows shell 中进行了更新,这是有充分理由的,您的应用程序应该利用它们。新图标更清晰,更适合整体系统主题。此外,如果您的应用程序仍然使用旧图标,它会让用户感到困惑并且看起来非常不合适。 总是最好遵循标准的平台约定,而不是尝试做“其他事情”,即使您认为您的“其他事情”出于某种原因比平台默认设置“更好”。您的用户不会同意,您的应用程序将反映您的劣质工艺。

由于提出此类问题的人不可避免地不同意我的观点,并坚持他们必须无论如何都必须这样做,并且这是一个“要求”(无论是什么意思),我会指出旧图标在较新版本的 Windows 中不可用。出于某种原因,整个系统中的图标已被完全替换。许可协议也严格禁止从系统 DLL 文件中提取图标并将它们与您的应用程序一起重新分发。不要这样做。

此外,在决定应该在消息框中显示 哪个 图标之前,请务必查阅 Microsoft 的 Windows 用户体验交互指南,该指南提供了一些非常方便的规则来选择正确的图标来传达正确的信息并符合 Windows 语气。我在my answer here 中提供了更多信息;非常推荐任何 Windows 应用程序开发人员阅读。

编辑:这就像拔牙来了解这个问题的更多细节。我不确定你为什么对你想要完成的事情如此保密,但请注意,在未来,你将有更好的运气在你的问题中包括这些事情,而不是希望人们会把它从你身上拉出来。大多数人都没有我那么执着。

无论如何,您最后提到您正在 VB 6 代码和 .NET 代码之间进行某种类型的互操作。这与使用的消息框图标无关。 VB 6 MsgBox 函数 100% 等效于我之前讨论过的 Win32 API MessageBox 函数和 .NET MessageBox 类。它们都将使用当前的系统图标,并且不需要任何额外的工作来使它们看起来相同。确保您已将相同的图标说明符传递给所有函数。为方便起见,这里有一个表格:

VB 6 "MsgBox" Icon Constant | VB.NET "MessageBox" Icon Identifier
---------------------------------------------------------------------------------
vbCritical                  | MessageBoxIcon.Error                
vbQuestion                  | MessageBoxIcon.Question  (DEPRECATED -- do not use)
vbExclamation               | MessageBoxIcon.Warning
vbInformation               | MessageBoxIcon.Information

请注意,“问题”样式图标已被弃用,您不应使用此值。如果您仍在 VB 6 代码中使用它,您应该更改该代码以使用不同的图标(或根本没有图标)。上面链接的 Windows 用户体验交互指南提供了有关此图标已被弃用的原因以及如何选择合适的替代品的更多详细信息。

【讨论】:

  • 我不太明白我在隐瞒哪一点。我想做的就是让图标在整个应用程序中看起来都一样,因为该应用程序从 vb6 开始并启动 .net Tabs。希望你明白我现在要做什么。再说一次,仍然没有改变我最初的目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
相关资源
最近更新 更多