RichEdit 字体颜色的一个奇怪问题 做了一个类似qq聊天的对话框 发送方的字以绿色显示 接收到的字以蓝色显示 但是当richedit里面的字符数超过255的时候 新添加进去的字还是有颜色 但以前的字全部变黑色了,望高手们指点! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 呵呵,我知道怎么改属性,也能成功修改richedit里面选定字的颜色、字体等等但是就是添加的内容一旦超过255个字符,前面的格式就丢了 /*-============================================================== * 增加命令提示,并将控件中的文字总数取得,以便后来确定只读的区域 * str为在CommandEdit控件中的提示语句 * bBold 判断显示的字是否为加粗 * clr 为新增加的字使用什么颜色 * =================================================================*/void CReadOnlyRichEdit::AddText(CString str,BOOL bBold,COLORREF clr){ //str = "\n" + str; LONG nStart,nEnd; //插入传入的字符串 this->SetSel(0,-1); this->GetSel(nStart,nEnd); this->SetSel(nEnd,nEnd + 1); this->ReplaceSel(str); int nLen = str.GetLength(); SetSel(nEnd - 1,nEnd + nLen); DWORD dwEffects = bBold ? CFE_BOLD : 0; CHARFORMAT2 cfm; cfm.cbSize = sizeof(cfm); cfm.dwEffects = CFE_BOLD; cfm.crTextColor = clr; //设置字高 // cfm.wWeight = 22; // cfm.yHeight = 196; // cfm.dwMask = bBold ? (CFM_BOLD | CFM_COLOR | CFM_SIZE | CFM_WEIGHT) : CFM_COLOR | CFM_SIZE | CFM_WEIGHT; cfm.dwMask = bBold ? (CFM_BOLD | CFM_COLOR) : CFM_COLOR; SetSelectionCharFormat(cfm); this->SetSel(0,-1); this->GetSel(this->m_crReadOnlyPos.cpMin,this->m_crReadOnlyPos.cpMax); this->m_crReadOnlyPos.cpMax -= 1; this->SetSel(this->m_crReadOnlyPos.cpMax + 1,-1); this->EnableScrollBar(SB_BOTH,ESB_DISABLE_BOTH);}我这个添加了过于255字符,好象没有这个问题嘛 to: pioneer_public() 我用的和你是同一段代码啊,怎么我的会出现这个问题呢?我用的是richedit2.0 哦,this->GetSel(this->m_crReadOnlyPos.cpMin,this->m_crReadOnlyPos.cpMax);this->m_crReadOnlyPos.cpMax -= 1;this->SetSel(this->m_crReadOnlyPos.cpMax + 1,-1);这三句我没用,因为不知道m_crReadOnlyPos是什么变量。代码都是从网上找来的,没头没尾。请问m_crReadOnlyPos是什么呢? this->GetSel(this->m_crReadOnlyPos.cpMin,this->m_crReadOnlyPos.cpMax);this->m_crReadOnlyPos.cpMax -= 1;this->SetSel(this->m_crReadOnlyPos.cpMax + 1,-1);----这个就是将前面不需要改变的字符不选中,然后修改其他的字符就可以了啊 我在用Richedit的过程中,也曾经发现过,如果一直发不同颜色的字体的时候,或者拷贝显示区的字体就会出现颜色乱了。后来才发现,Richedit是先设置格式,然后才对选定的字符串设置颜色以及字体CString strMessage = "Chat Message here."//获取显示区域空白处,以免他之前选择的格式覆盖之后要显示的字体和颜色GetDlgItem(IDC_RICHEDIT)->SetSel(-1, -1);CHARFORMAT2 cfm;cfm.cbSize = sizeof(cfm);cfm.crTextColor = clr;cfm.dwEffects = CFE_BOLD;cfm.dwMask = bBold ? (CFM_BOLD | CFM_COLOR) : CFM_COLOR;GetDlgItem(IDC_RICHEDIT)->.SetSelectionCharFormat(cfm);//添加字符串并设置格式GetDlgItem(IDC_RICHEDIT)->.SetSel(-1, -1);GetDlgItem(IDC_RICHEDIT)->.ReplaceSel(strMessage); 用OpenGL绘制贝塞尔曲面的问题 各标签页之间进行通讯是属于进程间通讯还是线程间通讯? 100分 VC 遍历所有窗口问题 Execute出错!请帮帮忙! 为什么我用CSocket的Connect,在服务端没有端口侦听的情况下,程序直接下去了,不是阻塞的吗? 请问硬件底层的分布式开发。。。。 高分求救,我用atl作了一个activex控件,这个空件调用了一个动态连接库, 为什么radio button无法被添加为variable 怎样把一个文件送入剪贴板. 如何在DLL中实现文件拷贝 高手帮忙解决一下:用Visual studio 2005编译程序出现错误 请帮我看看错在那里,谢谢
但是就是添加的内容一旦超过255个字符,前面的格式就丢了
* 增加命令提示,并将控件中的文字总数取得,以便后来确定只读的区域
* str为在CommandEdit控件中的提示语句
* bBold 判断显示的字是否为加粗
* clr 为新增加的字使用什么颜色
* =================================================================*/
void CReadOnlyRichEdit::AddText(CString str,BOOL bBold,COLORREF clr)
{
//str = "\n" + str;
LONG nStart,nEnd;
//插入传入的字符串
this->SetSel(0,-1);
this->GetSel(nStart,nEnd);
this->SetSel(nEnd,nEnd + 1);
this->ReplaceSel(str);
int nLen = str.GetLength();
SetSel(nEnd - 1,nEnd + nLen); DWORD dwEffects = bBold ? CFE_BOLD : 0;
CHARFORMAT2 cfm;
cfm.cbSize = sizeof(cfm);
cfm.dwEffects = CFE_BOLD;
cfm.crTextColor = clr;
//设置字高
// cfm.wWeight = 22;
// cfm.yHeight = 196;
// cfm.dwMask = bBold ? (CFM_BOLD | CFM_COLOR | CFM_SIZE | CFM_WEIGHT) : CFM_COLOR | CFM_SIZE | CFM_WEIGHT;
cfm.dwMask = bBold ? (CFM_BOLD | CFM_COLOR) : CFM_COLOR;
SetSelectionCharFormat(cfm); this->SetSel(0,-1);
this->GetSel(this->m_crReadOnlyPos.cpMin,this->m_crReadOnlyPos.cpMax);
this->m_crReadOnlyPos.cpMax -= 1;
this->SetSel(this->m_crReadOnlyPos.cpMax + 1,-1);
this->EnableScrollBar(SB_BOTH,ESB_DISABLE_BOTH);
}
我这个添加了过于255字符,好象没有这个问题嘛
this->GetSel(this->m_crReadOnlyPos.cpMin,this->m_crReadOnlyPos.cpMax);
this->m_crReadOnlyPos.cpMax -= 1;
this->SetSel(this->m_crReadOnlyPos.cpMax + 1,-1);这三句我没用,因为不知道m_crReadOnlyPos是什么变量。代码都是从网上找来的,没头没尾。
请问m_crReadOnlyPos是什么呢?
this->m_crReadOnlyPos.cpMax -= 1;
this->SetSel(this->m_crReadOnlyPos.cpMax + 1,-1);----这个就是将前面不需要改变的字符不选中,然后修改其他的字符就可以了啊
//获取显示区域空白处,以免他之前选择的格式覆盖之后要显示的字体和颜色
GetDlgItem(IDC_RICHEDIT)->SetSel(-1, -1);CHARFORMAT2 cfm;
cfm.cbSize = sizeof(cfm);
cfm.crTextColor = clr;
cfm.dwEffects = CFE_BOLD;
cfm.dwMask = bBold ? (CFM_BOLD | CFM_COLOR) : CFM_COLOR;
GetDlgItem(IDC_RICHEDIT)->.SetSelectionCharFormat(cfm);//添加字符串并设置格式
GetDlgItem(IDC_RICHEDIT)->.SetSel(-1, -1);
GetDlgItem(IDC_RICHEDIT)->.ReplaceSel(strMessage);