如何避免Visual Studio编辑对话框时移除资源文件中的#ifdef?
问题描述
我有一个定义对话框的资源文件,原本通过预编译指令区分32/64位版本的文本显示,代码如下:
#ifdef WIN64 LTEXT "My App, Version 1.2.3.0 (64 bit)", IDC_APPLICATION_TITLE_TEXT, 42, 14, 251, 16, SS_NOPREFIX #else LTEXT "My App, Version 1.2.3.0 (32 bit)", IDC_APPLICATION_TITLE_TEXT, 42, 14, 251, 16, SS_NOPREFIX #endif
但每次用Visual Studio编辑任意对话框时,VS会自动保存资源文件并移除#ifdef指令,只保留当前平台对应的条目(比如64位版本),导致后续编译其他平台时文本错误。
请问能否阻止VS在编辑对话框时移除#ifdef,或者有没有其他替代方式构建资源中使用的文本?
解决方案
阻止VS移除预编译指令的方法
- 拆分资源文件:把包含预编译指令的控件定义单独放到一个
.rc2文件中,然后在主资源文件里通过#include "你的文件名.rc2"引入。VS的可视化资源编辑器只会处理主资源文件里的可视化布局内容,不会修改.rc2中的代码,预编译指令就能完整保留。 - 纯代码编辑资源:右键资源文件,选择「打开方式→源代码编辑器」,全程用代码方式编辑资源,不使用可视化编辑器。但这种方法会失去拖拽调整控件布局的便利,适合对话框布局基本固定的场景。
更灵活的替代实现
如果不想受限于资源编辑器的限制,可以改用动态设置文本的方式:
- 代码动态赋值:在对话框初始化阶段(比如
OnInitDialog函数中),通过代码判断当前平台位数,拼接版本文本后设置到控件上。示例代码:
// 可从资源版本信息中读取版本号,避免硬编码 CString appText = _T("My App, Version 1.2.3.0"); #ifdef _WIN64 appText += _T(" (64 bit)"); #else appText += _T(" (32 bit)"); #endif SetDlgItemText(IDC_APPLICATION_TITLE_TEXT, appText);
这种方式完全脱离资源文件的预编译逻辑,不管VS怎么编辑资源都不会影响,还能统一管理版本信息。
- 使用字符串表:在资源的字符串表中分别添加32位和64位版本的字符串(比如
IDS_APP_TITLE_32和IDS_APP_TITLE_64),然后在程序中根据当前平台选择对应的字符串ID,加载后设置到控件上。这种方式也能避免资源编辑器修改预编译指令的问题。
内容的提问来源于stack exchange,提问作者user20716902
相关产品推荐
相关产品推荐

