【发布时间】:2018-12-12 16:03:42
【问题描述】:
我有一个带有工具栏的 MFC 应用程序(使用 CMFCToolbar)。我使用文件和资源中的位图即时创建工具栏位图。 DIB 有不同的颜色格式。
- 所以我创建了一个与屏幕 DC 兼容的空位图工具栏图像。
- 然后我打开所有位图并将内容blit 到工具栏位图(GDI 为我进行色彩空间转换和拉伸)。
- 然后我将位图保存到 24 位 DIB 文件中。
- 然后我创建工具栏对象并加载图像。
这已经工作了很长时间,现在正在工作,除了一个案例:
最近我们不得不为 Windows 10 1703 及更高版本启用 GDI 缩放。 在具有高分辨率显示和 200% 缩放的系统(如 Surface)上,会出现以下效果:
所有工具栏图标都变形了。
我也找到了原因:
保存合成图像时,我只得到图像的左上角四分之一。 与没有 GDI 缩放的正常分辨率显示相比,位图的宽度和高度没有变化(比如 1024x15)。但是那个位图只包含左上角的像素(见下面的例子)。
所以我假设设备上下文告诉 Windows 200% 的缩放。当从源到目标进行位图传输时,图像会自动放大,但位图的尺寸不会改变。
如何保存未缩放的位图?
-或-
如何正确保存缩放的位图?从哪里获取丢失的像素?从哪里获得合适的尺寸? (HBITMAP 仅指未缩放的尺寸)。
例子:
没有 GDI 缩放,正确:
200% 缩放,相同尺寸,但只有正确图像的左上角四分之一:
【问题讨论】:
-
只需应用这个公式:
actualdimension = GetDeviceCaps(hdc, LOGPIXELSY) * originaldimension / 96),其中hdc是您的设备上下文的句柄。 -
您的应用程序是否正确标记为支持高 DPI?
-
我的应用程序正在使用一个清单,该清单启用支持的操作系统 Windows 10(和其他),启用高 DPI 感知(每个监视器 V2)并启用 GDI 缩放。如果我禁用所有这些,则问题不会发生 - 但所有图标和控件在 Surface 或其他高分辨率显示器上都非常小。
-
如果您启用 GDI 缩放,您将不再具有 DPI 感知能力。听起来 Windows 似乎只是轻笑并忽略了您矛盾的清单。也许最后看到的条目被使用了。
标签: winapi mfc windows-10 gdi bitmapimage