最近在使用MFC开发依款小程序,程序需要【根据一系列的条件来输出具有不同字体格式的文本】,比如:蓝色、红色、楷体等。
在网上搜索了很多方法,均没法实现。
经过自己的仔细琢磨,终于找到了解决办法。
【解决问题】:在输出文本的控件上,输出具有不同字体格式的文本。
比如,不同行具有不同颜色、若干位置设置加粗、若干特定字符设置成特定的字体
eg:这句话希望是红色的,而这句话希望输出的是蓝色的,但这句话希望是黑体,这句话里的“关键词”是加粗的。
要点:
1、 输出文本的控件,必须是RICHEDIT,不能是EDIT
2、定义字体的方式:
CHARFORMAT cf,cf_2; //定义若干字体
ZeroMemory(&cf,sizeof(CHARFORMAT));
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE | CFM_ITALIC | CFM_SIZE|CFM_UNDERLINE;
cf.dwEffects=0;
cf.yHeight=15*15; //文字高度
cf.crTextColor=RGB(0,0,0); //文字颜色黑色000,白色全255
strcpy(cf.szFaceName,_T("宋体")); //设置字体
cf_2=cf;// 设置第二种字体
cf_2.dwEffects|=CFE_BOLD;//加粗
cf_2.crTextColor=RGB(255,0,0);
3、核心一点如何不断使得文本字体变化:
GetDlgItem(IDC_RICHEDIT1)->SetWindowText("");//先清空ID为IDC_RICHEDIT1的控件输出内容,可选。
m_richedit1.SetSel(-1,-1); //追加,这条语句十分重要,其中m_richedit1是IDC_RICHEDIT1的CRichEditCtrl变量(通过类向导设置)
然后就可以按照预定的规则(比如标记位),输出各种颜色、加粗与否、字体等格式不同的文本:
比如:
if(条件一成立)
{
m_richedit1.SetSelectionCharFormat(cf);
m_richedit1.ReplaceSel(out2edit); //out2edit是一个char 数组,不支持string
}
else if (条件二成立)
{
m_richedit1.SetSelectionCharFormat(cf_2);
m_richedit1.ReplaceSel(out2edit);
}
else
{
//其他规则输出
}
3、注意事项(网络上搜索的一些解决办法):
(1)、SetConsoleTextAttribute(GetStdHandle(IDC_RICHEDIT1),FOREGROUND_INTENSITY|FOREGROUND_BLUE);//仅dos窗口编程下能用
(2)、GetDlgItem(IDC_RICHEDIT1)->SetWindowText("某字符串");//这种不是追加方式输出,会覆盖前面的,因此不适于前面提到的场景
关键词:MFC,C++,RICHEDIT,字体,颜色,不同,变化,多变,动态,改变,同一段,不同行,加粗