如何将多行CSS文本直接声明为CString?
直接将整段CSS赋值给CString的实现方案
现有目标CSS代码:
.tableDUTY { margin-bottom: 2mm; } .cellDutyLabel { border-right-style: none; } .textDutyLabel { font-size: 10pt; font-weight: normal; } .cellDutyName { font-size: 10pt; font-weight: normal; } .cellDutyHeading { padding-left: 1mm; } .textDutyHeading { padding: 1mm; color: #fff; background-color: #FD00FF; width: 90mm; font-size: 12pt; font-weight: 700; text-transform: uppercase; vertical-align: middle; }
已知逐行拼接、Lambda简化的实现方式,但需求是直接将整段CSS原样粘贴到CPP文件中赋值给CString,最终用于CEdit控件显示多行文本,以下是可行方案:
方案1:原生多行宽字符串字面量(VS2015+支持)
VS2015及以上版本支持C++原生多行宽字符串,用LR"(...)"包裹整段CSS,括号内内容完全保留原格式,无需手动添加换行符或转义:
CString m_strCSS = LR"( .tableDUTY { margin-bottom: 2mm; } .cellDutyLabel { border-right-style: none; } .textDutyLabel { font-size: 10pt; font-weight: normal; } .cellDutyName { font-size: 10pt; font-weight: normal; } .cellDutyHeading { padding-left: 1mm; } .textDutyHeading { padding: 1mm; color: #fff; background-color: #FD00FF; width: 90mm; font-size: 12pt; font-weight: 700; text-transform: uppercase; vertical-align: middle; } )"; // 若开头存在多余空行,可调用TrimLeft()去除 m_strCSS.TrimLeft();
方案2:借助std::string转换(兼容旧版VS)
如果使用的VS版本不支持原生多行宽字符串,可先将CSS作为多行窄字符串(C++11及以上支持),再转换为CString:
#include <string> // 原样粘贴多行窄字符串 std::string cssStr = R"( .tableDUTY { margin-bottom: 2mm; } .cellDutyLabel { border-right-style: none; } .textDutyLabel { font-size: 10pt; font-weight: normal; } .cellDutyName { font-size: 10pt; font-weight: normal; } .cellDutyHeading { padding-left: 1mm; } .textDutyHeading { padding: 1mm; color: #fff; background-color: #FD00FF; width: 90mm; font-size: 12pt; font-weight: 700; text-transform: uppercase; vertical-align: middle; } )"; // 转换为CString(项目字符集为Unicode时自动处理宽字符转换) CString m_strCSS(cssStr.c_str()); // 去除开头空行 m_strCSS.TrimLeft();
注:若项目使用多字节字符集,直接赋值即可,无需额外转换。
方案3:资源文件嵌入(适合大型CSS)
若CSS内容较长,可将其保存为单独.css文件,添加到VC++自定义资源中,再从资源读取到CString:
- 将CSS文件添加到资源,自定义类型设为
CSS,资源ID设为IDR_CSS_STYLE - 读取代码:
#include <afxres.h> CString LoadCSSFromResource() { CString strCSS; HRSRC hRes = FindResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_CSS_STYLE), _T("CSS")); if (hRes) { HGLOBAL hData = LoadResource(AfxGetInstanceHandle(), hRes); if (hData) { LPCTSTR lpData = (LPCTSTR)LockResource(hData); if (lpData) { strCSS = lpData; UnlockResource(hData); } FreeResource(hData); } } return strCSS; } // 使用时 CString m_strCSS = LoadCSSFromResource();
该方式便于独立维护CSS内容,避免CPP文件中嵌入大段文本。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

