【问题标题】:Loading an icon in Windows program在 Windows 程序中加载图标
【发布时间】:2014-07-14 05:00:14
【问题描述】:

我正在尝试在我的程序中设置自定义图标,但没有任何反应。

  1. 我使用this tool 创建了一个图标。
  2. 我创建了一个包含内容的资源文件:

    MYICON1 ICON  "glider.ico"
    
  3. 我将资源文件添加到我的 Visual Studio 2013 项目中,并将其类型设置为“资源编译器”。类型“资源”不起作用(“无效或损坏的文件:无法在 0x1A 读取”)

  4. 我在创建窗口时使用以下代码加载图标:

    wc.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( MYICON1 ) ); // MYICON1 is defined in Resource.h as 101.
    

【问题讨论】:

  • 您指的是哪个图标,标题栏、系统托盘或资源管理器中的一个?你检查 LoadIcon 调用是否成功?

标签: c++ windows visual-studio winapi icons


【解决方案1】:

只是为了确保我正确理解了您的问题……当您将资源文件的类型设置为“资源编译器”时,一切都可以正常编译,对吗?那是正确的设置,把它放在那里。其他东西用于 .NET 应用程序。

所以问题只是你没有看到图标?您在编辑器中创建了多大尺寸的图标? LoadIcon 功能非常老旧,只能加载默认大小的图标,一般为 32x32。如果要加载不同大小的图标,则需要改用LoadImage function。超过 99% 的时间,您应该调用该函数来加载图标。我已经好几年没用过LoadIcon了。

HICON hIcon = static_cast<HICON>(::LoadImage(hInstance,
    MAKEINTRESOURCE(MYICON1),
    IMAGE_ICON,
    48, 48,    // or whatever size icon you want to load
    LR_DEFAULTCOLOR);

就像 Retired Ninja 在他的评论中建议的那样,当代码不能按预期工作时,一定要测试函数的返回值。例如,测试hIcon 是否为NULL。如果是这样,LoadImage 函数失败了,你需要找出原因。很可能,您传递的参数不正确。您的应用程序模块中没有具有该 ID 的资源,或者图标文件中没有相应大小的图标。

另一个调试技巧是使用内置系统图标之一。如果你能看到那个图标,你就知道一切正常,你可以开始换掉东西来加载你的自定义图标。例如:

HICON hIcon = static_cast<HICON>(::LoadImage(NULL,
    MAKEINTRESOURCE(IDI_WARNING),
    IMAGE_ICON,
    0, 0,
    LR_DEFAULTCOLOR | LR_SHARED | LR_DEFAULTSIZE));

这应该会显示标准警告图标,就像您在消息框中看到的那样。如果 that 有效,但无法加载您的 自己的 图标,则问题很可能出在您创建的 .ico 文件上。

【讨论】:

  • 我用我自己的图标和一个已知的好图标 (directx.ico) 尝试了 LoadImage(),但返回值为 NULL。警告图标有效。
  • @Survival 当您在图标编辑器中打开图标时,可以使用哪些尺寸? LoadImage 只能加载文件中的图标大小。 ICO 文件有点令人困惑。他们实际上将一堆位图资源打包到一个文件中。但 LoadIcon/LoadImage 仅加载其中一个位图资源(即单个大小的图标)。它们不会加载所有大小的整个 ICO 文件。
【解决方案2】:

您可以像这样设置您的图标资源,并将 Load Icon' 与 w c ex h Icon 和 w c ex h Icon Sm 一起使用。同时设置项目输出图标和程序图标。

'IDI_MAIN_ICON           ICON                    "cellphone.ico"
'Load Icon( h Instance, MAKEINTRESOURCE(IDI_MAIN_ICON));'

【讨论】:

    猜你喜欢
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多