如何在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文件直接加入可执行文件的源列表:
- 创建
wx_dpi_aware.rc文件,使用CMake变量引用wxWidgets自带的manifest(避免硬编码绝对路径):
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "${wxWidgets_INCLUDE_DIRS}/wx/msw/wx_dpi_aware.manifest"
- 在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,提问作者通配符
相关产品推荐
相关产品推荐

