在 Windows 程序中加载图标

Sur*_*ine 5 c++ windows winapi icons visual-studio

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

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

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

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

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

Cod*_*ray 6

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

所以问题只是你没有看到图标?您在编辑器中创建了多大尺寸的图标?该LoadIcon功能非常陈旧,只能加载默认大小的图标,一般为 32x32。如果要加载不同大小的图标,则需要使用该LoadImage功能。在超过 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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • @Survival 当您在图标编辑器中打开图标时,有哪些尺寸可用?LoadImage 只能加载文件中的图标大小。ICO 文件有点令人困惑。他们实际上将一堆位图资源打包到一个文件中。但LoadIcon/LoadImage 只加载这些位图资源中的一个(即单个大小的图标)。他们不会加载所有大小的整个 ICO 文件。 (2认同)