更改 HICON 的大小

Changing the size of a HICON

本文关键字:HICON 更改      更新时间:2023-10-16

我正在使用一个无法识别DPI的按钮。我在代码中到处都在使用它,所以理想情况下我想在该按钮的 SetIcon 中添加几行。

SetIcon 方法(不出所料)将 HICON 作为参数 - 我想根据 DPI 分辨率更改图标(因此大多数时候会增加其大小)。

编辑如下所述,我的问题不清楚。我不想更改图标的大小 - 从资源中读取 - 但我想将 HICON od 16x16 转换为 40x40 的新 HICON。我有一些代码可以读取PNG(返回HICON),并且LoadImage(也不是LoadIconWithScaleDown)将无法使用它。

有什么想法吗?

使用LoadIconWithScaleDown()(自 Windows Vista 起可用)加载所需大小的图标图像,该大小已按 DPI 比例因子缩放。

另一个答案建议使用LoadImage(),但是在图标资源中无法获得所需图像大小的精确匹配的情况下LoadIconWithScaleDown()将大大提高图像质量。在这种情况下,LoadImage()加载下一个较小大小的图像并将其放大,而LoadIconWithScaleDown()加载下一个更大的图像并缩小该图像,从而使缩放的图像看起来更详细、更清晰。

int cx = GetSystemMetrics( SM_CXSMICON );  // scaled for system DPI!
int cy = GetSystemMetrics( SM_CYSMICON );  // scaled for system DPI!
HICON hIcon = NULL;
HRESULT hr = LoadIconWithScaleDown( AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1),
cx, cy, &hIcon );
if( SUCCEEDED( hr ) )
{
button.SetIcon( hIcon );
}

注意:我正在使用GetSystemMetrics()来获取小图标的标准大小,该图标针对当前系统 DPI 进行了缩放。如果您的应用程序仅具有系统 DPI 感知能力,这将足够好。如果您的应用程序是按监视器 DPI 感知的,您可能对最近的 Windows 10 更新添加的GetSystemMetricsForDpi()感兴趣。

使用GetDeviceCaps获取 DPI 比例并除以96以获得 DPI 因子。

将图标大小乘以此 DPI 因子。例

int default_size = 16;
CClientDC dc(GetDesktopWindow());
int logpixy = dc.GetDeviceCaps(LOGPIXELSY);
size = MulDiv(default_size, logpixy, 96);
hicon = (HICON)LoadImage(AfxGetApp()->m_hInstance,
MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, size, size, LR_DEFAULTCOLOR);
button.SetIcon(hicon);

您将需要存储不同的图标大小。例如 16x16、20x20、24x24、32x32。

如果确切的大小不可用,则LoadImage将选择最接近的匹配项。