You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MinGW+CMake环境下使用wxWidgets的wx_dpi_aware.manifest实现DPI感知

在MinGW64+CMake环境下为wxWidgets程序实现DPI感知

问题背景

在Windows系统中使用MinGW64工具链与CMake开发wxWidgets程序时,需要实现DPI感知以避免125%显示缩放比例下的UI模糊问题。Visual Studio环境下仅需使用wx_dpi_aware.manifest即可解决,但MinGW64+CMake环境下的正确操作方式不明确。

环境信息:

  • MinGW64 GCC 13.2.0(来自winlibs)
  • CMake 3.27.3
  • wxWidgets 3.2.2.1(自行编译)

无效尝试

曾尝试使用以下CMake代码,但CMake会忽略生成的wx_dpi_aware.res资源文件(通过-DCMAKE_VERBOSE_MAKEFILE=ON验证,编译命令中未包含该文件):

add_custom_command(
    OUTPUT ${CMAKE_CURRENT_LIST_DIR}/wx_dpi_aware.res
    COMMAND windres.exe -o ${CMAKE_CURRENT_LIST_DIR}/wx_dpi_aware.res ${CMAKE_CURRENT_LIST_DIR}/wx_dpi_aware.rc
    DEPENDS ${CMAKE_CURRENT_LIST_DIR}/wx_dpi_aware.rc
    COMMENT "Generating resource file"
)

set_source_files_properties(${CMAKE_CURRENT_LIST_DIR}/wx_dpi_aware.res PROPERTIES
    OBJECT_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/wx_dpi_aware.rc
)

add_executable(myapp main.cpp ${CMAKE_CURRENT_LIST_DIR}/wx_dpi_aware.res)

对应的wx_dpi_aware.rc内容:

CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "C:/wx/3.2.2.1/include/wx/msw/wx_dpi_aware.manifest"

可行解决方案

方法一:直接添加RC文件到目标(推荐)

CMake对MinGW的资源文件有原生支持,无需手动调用windres。只需将.rc文件直接加入可执行文件的源列表:

  1. 创建wx_dpi_aware.rc文件,使用CMake变量引用wxWidgets自带的manifest(避免硬编码绝对路径):
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "${wxWidgets_INCLUDE_DIRS}/wx/msw/wx_dpi_aware.manifest"
  1. 在CMakeLists.txt中添加该RC文件:
add_executable(myapp main.cpp wx_dpi_aware.rc)

CMake会自动调用windres编译RC文件,并将生成的资源链接到可执行文件中。

方法二:使用target_sources灵活配置

若需要分阶段添加资源,可使用target_sources:

add_executable(myapp main.cpp)
target_sources(myapp PRIVATE wx_dpi_aware.rc)

同时通过CMake传递路径定义,避免RC文件中的硬编码:

target_compile_definitions(myapp PRIVATE WX_DPI_MANIFEST="${wxWidgets_INCLUDE_DIRS}/wx/msw/wx_dpi_aware.manifest")

修改wx_dpi_aware.rc内容:

CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST WX_DPI_MANIFEST

方法三:修复手动资源编译规则

若坚持手动调用资源编译器,需修正原代码的路径问题,使用CMake内置变量保证兼容性:

add_custom_command(
    OUTPUT wx_dpi_aware.res
    COMMAND ${CMAKE_RC_COMPILER} -i wx_dpi_aware.rc -o wx_dpi_aware.res
    DEPENDS wx_dpi_aware.rc
    COMMENT "Compiling DPI-aware manifest resource"
)

add_executable(myapp main.cpp wx_dpi_aware.res)

这里用${CMAKE_RC_COMPILER}代替硬编码的windres.exe,同时使用相对路径让CMake正确追踪依赖。

验证

编译时添加-DCMAKE_VERBOSE_MAKEFILE=ON参数,查看编译命令确认资源文件已被包含。运行程序后,在125%显示缩放比例下检查UI是否清晰。

内容的提问来源于stack exchange,提问作者通配符

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:52:12