一套运行多年的 MFC 检测软件,在原来的显示器上用得好好的。拿到高分屏笔记本上,工具栏图标发虚,属性栏文字挤在一起;再把窗口拖到外接屏,大小又不协调。同一个程序,为什么换屏后界面就乱了?
如果项目已经采用 BCGControlBar Pro,可以先核对其库控件的高 DPI 与跨屏配置,再检查自绘界面。关键是让窗口在不同缩放比例下保持可用。
换上4K屏,问题不一定出在分辨率
Windows 显示设置里的 100%、150%、200% 是缩放比例。旧 MFC 程序在某个比例下正常,并不代表换一个比例仍能保持清晰。常见异常有三种:
- 整窗发虚:系统放大了已绘制的窗口;
- 文字截断或控件挤压:字体变大,但固定像素尺寸和间距没有同步调整;
- 图标模糊:小尺寸位图被放大,边缘细节不足。
不使用组件库时,团队也可以逐个调整 MFC 布局,为图标准备不同尺寸资源,并处理窗口跨屏后的 DPI 变化。这样能保持现有实现方式,但每类界面都要单独检查。已经使用 BCGControlBar Pro 的项目,则应先区分库控件与自绘视区,确定改造落在哪一层。

图一:BCGSoft 官网示例中的属性窗口,在 DPI 100% 与 150% 下的显示效果。
单屏正常,跨屏为什么还会变形?
工程师用 150% 缩放的笔记本接一块 100% 缩放的显示器。软件在笔记本上启动后看似正常,主窗口或浮动面板一拖到外接屏,当前 DPI 就变了。如果字体、图标和布局仍按原屏幕计算,界面比例便可能失调。
BCGControlBar Pro 自 33.0 起支持 Per-Monitor DPI Awareness V2 。在支持该模式的 Windows 10(1703 及以上)和 Windows 11 中,应用完成相应配置后,主窗口、对话框或浮动 Pane 移到不同 DPI 的显示器,或者显示缩放设置变化时,BCGControlBar 库控件会相应缩放。
BCGControlBar Pro处理哪一层?
评估时,可把界面分成三组:
| 界面区域 | 适配责任与检查重点 |
|---|---|
| BCGControlBar 菜单、工具栏、Ribbon | 检查库控件的尺寸、图标缩放 |
| BCGControlBar 停靠面板、浮动 Pane | 检查跨屏后的控件与图标表现 |
| 自绘视区、定制控件 | 检查项目代码是否重算布局、重载图片 |
图标尤其容易被忽略。BCGSoft 建议菜单、工具栏和 Ribbon 优先评估 SVG;位图虽然也能平滑缩放,但在较高缩放比例下,边缘可能仍有轻微模糊。官网给出了位图与矢量图标的实际界面对照:


图二:BCGSoft 官网"Using vector graphics (SVG)"页面的位图与 SVG 图标示例。两张原图分别展示高 DPI 下的图标效果;SVG 改善的是图标清晰度,并不负责整个业务窗口的布局。
旧MFC项目怎样开始改?
先核对库版本,再确认应用声明了什么 DPI 感知模式。globalData.SetDPIAware() 用于高 DPI 感知;要启用 Per-Monitor V2,官方文档还要求配置对应的 manifest,并检查旧应用的初始化和 DPI 相关代码。33.0 版本的应用向导也提供了 Per-Monitor V2 选项。

图三:BCGSoft 33.0 更新说明中的应用向导截图,仅展示当时的选项。旧项目应按官方开发者文档配置。
随后用真实项目做三步验证:
- 在 100%、150%、200% 缩放下检查常用菜单、面板和对话框;
- 把主窗口、浮动 Pane 移到另一块不同缩放比例的显示器;
- 核对自绘区域、固定像素值和 DPI 专属图片是否需要重新计算或加载。
BCGControlBar Pro 自动缩放的是库控件。模型渲染视区、设备示意图及业务对话框中的定制内容,仍要由项目代码处理和验证。
判断改造范围,要看真实跨屏操作
对长期维护的 MFC 工业软件,先核对 BCGControlBar Pro 的版本和 Per-Monitor V2 配置,再用两块不同缩放比例的屏幕移动真实窗口。库控件与自绘区域分别记录问题,开发团队就能判断:哪些由通用 UI 层处理,哪些还要改项目代码。