c++ - 改变 HICON 的尺寸

标签 c++ mfc gdi dpi

我正在使用不支持 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 进行缩放。如果您的应用程序仅system-DPI-aware,这就足够了。如果您的应用程序per-Monitor-DPI-aware,您可能会对GetSystemMetricsForDpi()感兴趣,已由最近的 Windows 10 更新添加。

关于c++ - 改变 HICON 的尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47481145/

相关文章:

c++ - 需要帮助在同一行上打印一个没有空格的序列

c++ - C++ 被认为是弱类型的吗?为什么?

c++ - 现在微软基础类(MFC)值不值得学?

c# - 跟踪和降低 GD handle 的最佳方法是什么?

c++ - Windows GDI 上下文 - 函数失败并且 GetLastError() 返回 0

c++ - Boost 字符串处理函数是否曾经持有全局锁?

c++ - 使用 C 函数操作 std::string

c++ - Visual C++ Win32 还是 MFC C++?

c++ - 利用计时器更新 MFC 文档/ View 应用程序

c++ - 带 GDI 的黑色高亮条