有两种方案:
1.使用CRichEditUI 来做;
2.使用CLabelUI 来做。
CRichEditUI的做法:
1.首先继承CRichEditUI 生成CRichEditUIEx类
2.CRichEditUIEx类中实现PaintText方法,只需要在绘制文本的时候,添加三行代码:
SetSel(begin, end);
SetFontFormat();
SetSle(-1, -1);
这三句话,首先是:设置选中位置; 设置选中区域内文本样式;设置为未选中状态
void SetTextFont(bool bold, bool italic, bool underline, CString strFont, COLORREF color, int size)
{
CHARFORMAT2 cf,oldCf;
GetSelectionCharFormat(oldCf);
GetSelectionCharFormat(cf);
if (bold)
{
cf.dwMask|=CFM_BOLD;
cf.dwEffects|=CFE_BOLD; //设置粗体,取消用cf.dwEffects&=~CFE_BOLD;
}
if (italic)
{
cf.dwMask|=CFM_ITALIC;
cf.dwEffects|=CFE_ITALIC; //设置斜体,取消用cf.dwEffects&=~CFE_ITALIC;
}
if (underline)
{
cf.dwMask|=CFM_UNDERLINE;
cf.dwEffects|=CFE_UNDERLINE; //设置下划线,取消用cf.dwEffects&=~CFE_UNDERLINE;
}
if (color)
{
cf.dwEffects &= ~CFE_AUTOCOLOR; //这个最重要,设选中文字颜色的时候也要注意,dwEffects一定不能有CEF_AUTOCOLOR的属性
cf.dwMask|=CFM_COLOR;
cf.crTextColor = color; //设置颜色
}
if (size)
{
cf.dwMask|=CFM_SIZE;
cf.yHeight =200; //设置高度
}
cf.dwMask|=CFM_FACE;
wcscpy(cf.szFaceName , strFont.GetBuffer(0));//设置字体
SetSelectionCharFormat(cf);
SetSel(-1,-1);
SetSelectionCharFormat(oldCf);
}
GetSelectionCharFormat
SetSelectionCharFormat
这两个函数是CRichEditUI自带的,所以用起来很方便,只需要调用就可以实现。
还要考虑到的一个问题是:窗口透明(包括CRichEditUI的背景颜色、边框颜色、disabled颜色、窗口响应事件透明)
2.CLabelUI可以实现:
使用PaintText当中的
CRenderEngine::DrawText(hDC, m_pManager, rc, m_sText, m_dwTextColor, m_iFont, DT_SINGLELINE | m_uTextStyle);使用DrawText的缺陷是无法精确的计算字符串的宽度,比如一个字符串为“abc”,我想让b高亮的话,就会绘制三次来达到效果, a、 b(使用不同的样式)、 c、;但是问题就出在这里,不能精确计算字符串a、b、c、的宽度无法完成后面字符串的绘制,不是覆盖就是有空隙。。。。。。
下面使用DrawHTMLText,这个在实现起来就简单的多了。
CRenderEngine::DrawHtmlText(hDC, m_pManager, rc, m_strTextValue.c_str(), m_dwTextColor, NULL, NULL, nLinks, DT_SINGLELINE | m_uTextStyle);
自行设置m_strTextValue让它自己去解析,完成绘制。
// Bold: <b>text</b> // Color: <c #xxxxxx>text</c> where x = RGB in hex // Font: <f x>text</f> where x = font id // Italic: <i>text</i> // Image: <i x y z> where x = image name and y = imagelist num and z(optional) = imagelist id // Link: <a x>text</a> where x(optional) = link content, normal like app:notepad or http:www.xxx.com // NewLine <n> // Paragraph: <p x>text</p> where x = extra pixels indent in p // Raw Text: <r>text</r> // Selected: <s>text</s> // Underline: <u>text</u> // X Indent: <x i> where i = hor indent in pixels // Y Indent: <y i> where i = ver indent in pixels按照上述样式,可进行绘制操作。
比如构造一个字符串设置颜色:<c #ff00ff>test</c> 此字符串前缀长度11 后缀长度4
<c #ff00ff><b><s>test</s></b></c> 构造成类似这种字符串,控件会自动以HTML格式解析绘制。
……
使用数组(非常简单)
先得到关键字(这个不必多数奥,还是切分)
新建bool数组
(
new一个bool数组长度为当前字符串的长度。
用来标识当前字符是否需要set style,哈哈)
bool数组位置对应的地方前后为true则需要加上标签开始与结尾
,组合成的字符串拿来绘制就可以了。