gpt4 book ai didi

winapi - 如何使用 LoadImage 选择图标颜色深度?

转载 作者:行者123 更新时间:2023-12-01 14:08:50 27 4
gpt4 key购买 nike

我想加载并显示 explorer.exe 的图标之一。

我使用以下代码(缩写):

// resource id definition    

EXP_ICON = MAKEINTRESOURCE(101); { Explorer's Icon resource ID }

// load explorer.exe

ExpInstance := LoadLibraryEx(ExpDirectory,
0,
LOAD_LIBRARY_AS_IMAGE_RESOURCE);

// load the icon from it

ExpIcon := LoadImage(ExpInstance,
MAKEINTRESOURCE(EXP_ICON),
IMAGE_ICON, { load the icon }
32,
32,
LR_LOADREALSIZE);

该代码加载它找到的第一个图标,它恰好是一个 16 色图标。该组中还有其他颜色更多的图标(256 和 1600 万)。

我的问题是: 是否可以告诉 LoadImage() 加载其中一个图标(那些使用更多颜色的图标),如果可以,如何加载?

我已经尝试将 EXP_ICON 更改为图标序号 ID 之一,但如果 ID 不是图标 group 的 ID,则 LoadImage() 没有成功。

我想不出让 LoadImage() 加载一个具有我想要的颜色数量的图标。

最佳答案

LoadImage旨在自动加载具有您要求的大小的最合适颜色位深度的图标。 “最合适”是指最适合您当前显示设置的那个。这几乎总是你想要的,所以这个功能是“Just Works”的功能之一。告诉它你想要什么大小(像素尺寸)的图标,它会处理其余的。无法告诉它您想使用哪种颜色位深度。

如果没有那个大小的图标,它会放大一个较小的图标。由于这并不理想,最新版本的 Windows 提供了 LoadIconWithScaleDown API ,它完全按照锡 jar 上的说明进行操作。这会产生更好看的结果。参见 David Heffernan's answer here一个用法示例。

无论如何。您的问题与 LoadImage 无关功能。问题是 LR_LOADREALSIZE标记您要传递给该函数。我在 Windows SDK 头文件中找不到该常量的定义,但看起来它是由 Delphi 或 C++ Builder 库定义的。定义类似于:

LR_LOADREALSIZE = $80;

#define LR_LOADREALSIZE (Byte)(128)

它是一个常量,十六进制值为0x80。问题是,当你查看 the documentation for the LoadImage function 时,您会看到 0x80 的十六进制值 实际上 常量 LR_VGACOLOR :

LR_VGACOLOR
0x00000080

Uses true VGA colors.

这里的描述有点拐弯抹角——您必须知道什么是“真正的 VGA 颜色”。最初的 VGA 是一个 16 色显示系统,这就是这里的意思。所以,您会得到一个 16 色版本的图标,因为您特别要求它。删除 LR_LOADREALSIZE标志(实际上是 LR_VGACOLOR 标志),一切都会正常工作。只需通过 0作为标志(或 LR_DEFAULTCOLOR ,定义为 0)。

注意:您不应该像 32 这样对像素尺寸进行硬编码。相反,您应该调用 GetSystemMetrics功能与 SM_CXICONSM_CYICON旗帜。这些将为您提供系统上“正常”大小图标的实际大小。 “通常”,这些图标的大小为 32x32 像素,但这并不能保证,尤其是在当前的高 DPI 显示器时代。它们可能更大。如果您想要小图标(通常为 16x16),请使用 SM_CXSMICONSM_CYSMICON , 而不是。

在极少数情况下,您实际上想要从具有特定颜色位深度的资源或 ICO 文件加载图标,并且系统没有自动确定要加载的颜色深度,您必须使用序列如FindResourceLoadResourceLockResourceCreateIconFromResourceEx .另见 "Icons" by John Hornick在 MSDN 上(一篇旧文章,但对于这些东西仍然准确)和 this blog post by Raymond Chen .

关于winapi - 如何使用 LoadImage 选择图标颜色深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54620707/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com