如何在MFC CRichEditCtrl控件中正常显示尺寸合适的二维码
解决方案
你遇到的问题核心是三个原因:未全选内容就设置格式、选用的字体对二维码字符支持差、未匹配设置行间距导致行列错位,按照以下步骤修改即可:
1. 先关闭富编辑控件自动换行
避免二维码因控件宽度不足被强制折行打乱结构:
// 禁用自动换行,设置为无限宽度 ::SendMessage(m_editQR.m_hWnd, EM_SETTARGETDEVICE, (WPARAM)NULL, 0);
2. 插入二维码文本后统一设置格式
先全选所有内容,再设置字符格式,优先选用对Unicode方块元素支持完善的等宽字体(Consolas、黑体都可),最后同步设置段落行间距和字符高度匹配:
// 插入二维码文本后执行以下代码 // 全选所有内容 m_editQR.SetSel(0, -1); CHARFORMAT selCharformat = {0}; selCharformat.cbSize = sizeof(CHARFORMAT); selCharformat.dwMask = CFM_FACE | CFM_SIZE | CFM_CHARSET | CFM_WEIGHT; // 字号按需调整,yHeight单位为缇,1磅=20缇,以下是8号字的配置 selCharformat.yHeight = 8 * 20; selCharformat.bCharSet = DEFAULT_CHARSET; selCharformat.bPitchAndFamily = FIXED_PITCH | FF_MODERN; // 选用Consolas等宽字体,不要用Console字体 lstrcpy(selCharformat.szFaceName, _T("Consolas")); selCharformat.wWeight = FW_NORMAL; m_editQR.SetSelectionCharFormat(selCharformat); // 设置段落格式,匹配行间距避免行列错位 PARAFORMAT2 pf = {0}; pf.cbSize = sizeof(PARAFORMAT2); pf.dwMask = PFM_LINESPACING | PFM_SPACEBEFORE | PFM_SPACEAFTER; pf.bLineSpacingRule = 1; // 行间距和字符高度保持一致 pf.dyLineSpacing = selCharformat.yHeight; pf.dySpaceBefore = 0; pf.dySpaceAfter = 0; m_editQR.SetParaFormat(pf); // 取消选中,光标移到开头 m_editQR.SetSel(0, 0);
注意事项
- 调整二维码大小只需修改
selCharformat.yHeight的取值即可,保持和pf.dyLineSpacing一致就不会出现错位 - 不要使用非等宽字体,会导致字符宽度不一致,二维码结构错乱
内容的提问来源于stack exchange,提问作者MrWarrior
相关产品推荐
相关产品推荐

