VC中前缀字符&带来的UI显示问题

举报
风中的叶子 发表于 2019/09/24 18:27:49 2019/09/24
【摘要】 VC的界面上如果通过静态文本框属性显示一个包含多个&&的字符串,或者通过DrawText接口显示包含多个&&的字符串。默认情况下,一个&不会显示,两个&会显示为一个&,带来界面显示问题。

早期整理资料的上传,解决问题中有查找和参考相关资料,内容以自己测试和处理过程整理为主。

问题现象

VC的界面上如果通过静态文本框属性显示一个包含多个&&的字符串,或者通过DrawText接口显示包含多个&&的字符串。默认情况下,一个&不会显示,两个&会显示为一个&,带来界面显示问题。

问题原因

这是因为VC的界面类控件中对文字有一些前缀相关属性,默认会将&当作前缀符号解释处理,根据控件属性中对前缀的不同处理来显示前缀附件的字符。

解决方法

配置控件属性中关闭前缀识别属性。

代码样例

 void OnPaint(){
	CPaintDC dc(this); // device context for painting
	int x = 100;
 
	CRect rectText1(x + 50, 50, x + 200,  70);
	CRect rectText2(x + 50, 70, x + 200,  100);
	CString strTest1("1111111&&2222222");
	std::wstring strTest2(L"666666&&2222222");	//dc.DrawText(strTest1, rectText1, DT_NOCLIP|DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_WORD_ELLIPSIS);
	//dc.DrawText(strTest2.c_str(), rectText2, DT_NOCLIP|DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_WORD_ELLIPSIS);
	dc.DrawText(strTest1, rectText1, DT_LEFT | DT_NOPREFIX);
	dc.DrawText(strTest2.c_str(), rectText2, DT_LEFT);
	dc.TextOutW(x + 50,  100, strTest1);
	dc.TextOutW(x + 50,  120, strTest2.c_str());
 
	CDialog::OnPaint();}

静态文本框的属性调整:

DrawText处理效果:

相关资料及说明

该函数在指定的矩形里写入格式化的正文,根据指定的方法对正文格式化(扩展的制表符,字符对齐、折行等)。

通常DrawText解释助记前缀字符,&为给其后的字符加下划线,解释&&为显示单个&。指定DT_NOPREFIX,这种处理被关闭。

中文说明 http://blog.csdn.net/lishuhuakai/article/details/18322459

官方文档:https://msdn.microsoft.com/en-us/library/windows/desktop/dd162499(v=vs.85).aspx

Ignores the ampersand (&) prefix character in the text. The letter that follows will not be underlined, but other mnemonic-prefix characters are still processed.
Example:
input string: "A&bc&&d"
normal: "Abc&d"
DT_HIDEPREFIX: "Abc&d"
DT_NOPREFIX: "A&bc&&d"
PREFIXONLY: " _ "
Compare with DT_NOPREFIX and DT_PREFIXONLY.


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。