图像列表按比例缩放图标,尽管它们以请求的大小提供

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像列表按比例缩放图标,尽管它们以请求的大小提供相关的知识,希望对你有一定的参考价值。

我在使用Win32的Toolbar class时遇到了一些奇怪的行为。在低DPI显示器上,我希望我的工具栏使用24x24像素的图标,在更高的DPI显示器上,我希望我的工具栏使用48x48像素的图标。

我的代码看起来像这样:

tbil = ImageList_Create(icsize, icsize, ILC_COLOR32, 32, 32);

for(k = 0; k < sizeof(tblist) / sizeof(int); k++) {
    hi = LoadIcon(hInstance, MAKEINTRESOURCE(tblist[k]));
    ImageList_AddIcon(tbil, hi);
}

hToolbarWnd = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
    WS_CHILD|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS|CCS_NORESIZE|CCS_NODIVIDER, 0, 0, 0, 0, hwnd, NULL, hInstance, NULL);

SendMessage(hToolbarWnd, TB_SETIMAGELIST, 0, (LPARAM) tbil);
SendMessage(hToolbarWnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
SendMessage(hToolbarWnd, TB_ADDBUTTONS, (WPARAM) sizeof(tbButton) / sizeof(TBBUTTON), (LPARAM) tbButton);

icsize变量设置为24或48,具体取决于当前的DPI设置。

从我的资源加载的图标每个包含两个图像:一个在24x24中,一个在48x48中,我期待ImageList_AddIcon()选择正确的图像,但显然情况并非如此,因为发生的情况是:在低DPI系统上(即应该使用24x24图标的系统)ImageList_AddIcon()仍然添加48x48图标,但将其缩小到24x24,当然看起来很难看。

这是应该的方式吗?如果是的话,我该怎么处理呢?我必须使用单独的* .ico文件吗?一个用于24x24,一个用于48x48,而不是在单个* .ico文件中组合两种尺寸?这有点令人困惑,我没有在任何地方看到这个记录。

谢谢你的帮助。

答案

即使.ICO文件和图标资源(可能)由多个图标目录条目组成,LoadIcon也只会加载一个图标。它只加载系统默认大小的图标。这也是记录在案的:

LoadIcon只能加载大小符合SM_CXICON和SM_CYICON系统度量值的图标。

接下来是解决方案:

使用LoadImage函数加载其他大小的图标。


奖金阅读:

以上是关于图像列表按比例缩放图标,尽管它们以请求的大小提供的主要内容,如果未能解决你的问题,请参考以下文章

根据列表中图像的数量按比例调整动态图像列表的大小

垂直调整浏览器窗口大小时按比例调整图像大小?

CSS背景图像以适应宽度,高度应按比例自动缩放

CSS背景图像以适应宽度,高度应按比例自动缩放

缩放 html 以根据屏幕分辨率按比例调整大小

按比例缩放 HTML 以完全适合 PDF A4 大小