更改 HICON 的大小
Changing the size of a HICON
我正在使用一个无法识别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
将选择最接近的匹配项。
- 如何在Qt C++中更改光标
- 为什么++(*p)更改指针值
- 如何通过派生类函数更改基类中的向量
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- TDateTime格式在C++Builder中不会更改
- 查找后更改类变量
- 为什么我无法更改"set<set>"循环中的值<int>
- Xaudio2在更改缓冲区或循环时弹出声音
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 在更改for循环的第三部分后,未使用for循环结果
- C++.我想将更改后的特定字符行保存在字符串中
- 使用窗口中的QSlider更改背景音量
- c++方法参数只能在linux的发布模式下自行更改
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 可以使用移动语义更改或改进此C++代码吗?
- C++继承更改成员
- 如何定义更改car类中car位置的方法
- 为什么我的排序算法会更改数组值
- 更改 HICON 的大小