怎么将CRichEditCtrl中的汉字显示为粗体。急! 我用的是CRichEditCtrl,但我将文本中的字体设置成粗体后,英文字符都能正确显示成粗体,为什么汉字却没有变化。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自定义 CRichEditCtrl 控件作者:sonystone下载本文的源代码在VC中提供了两种很方便的编辑控件(CEdit 和CRichEditCtrl),一般来说这两种控件已经满足了我们大部分的需要,不过只有CEdit控件能响应我们鼠标右键消息,通过右键我们很容易的操作我们的编辑,而在CRichEditCtrl控件中我们不能得到这样的操作,同时CRichEditCtrl是能够包含各种格式的内容,就好像Word一样能够写入各种不同的字体,不过CRichEditCtrl没有给我们提供这样的要求,今天我的目的也就是给他添加这样的扩展操作。本代码运行效果图一. 首先我们要从CRichEditCtrl类派生一个我们自己的类CMyRichEdit,我们的操作也是在其中完成的。二. 然后我们添加鼠标右键消息,在其中添加代码如下: //设置为焦点SetFocus();//创建一个弹出式菜单CMenu popmenu;popmenu.CreatePopupMenu();//添加菜单项目popmenu.AppendMenu(0, ID_RICH_UNDO, "&Undo");popmenu.AppendMenu(0, MF_SEPARATOR);popmenu.AppendMenu(0, ID_RICH_CUT, "&Cut");popmenu.AppendMenu(0, ID_RICH_COPY, "C&opy");popmenu.AppendMenu(0, ID_RICH_PASTE, "&Paste");popmenu.AppendMenu(0, ID_RICH_CLEAR, "C&lear");popmenu.AppendMenu(0, MF_SEPARATOR);popmenu.AppendMenu(0, ID_RICH_SELECTALL, "Select &All");popmenu.AppendMenu(0, MF_SEPARATOR);popmenu.AppendMenu(0, ID_RICH_SETFONT, "Select &Font");//初始化菜单项UINT nUndo=(CanUndo() ? 0 : MF_GRAYED );popmenu.EnableMenuItem(ID_RICH_UNDO, MF_BYCOMMAND|nUndo);UINT nSel=((GetSelectionType()!=SEL_EMPTY) ? 0 : MF_GRAYED) ;popmenu.EnableMenuItem(ID_RICH_CUT, MF_BYCOMMAND|nSel);popmenu.EnableMenuItem(ID_RICH_COPY, MF_BYCOMMAND|nSel);popmenu.EnableMenuItem(ID_RICH_CLEAR, MF_BYCOMMAND|nSel);UINT nPaste=(CanPaste() ? 0 : MF_GRAYED) ;popmenu.EnableMenuItem(ID_RICH_PASTE, MF_BYCOMMAND|nPaste);//显示菜单CPoint pt;GetCursorPos(&pt);popmenu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);popmenu.DestroyMenu();三. 然后在.h文件中加入如下的ID定义: #define ID_RICH_UNDO 101#define ID_RICH_CUT 102#define ID_RICH_COPY 103#define ID_RICH_PASTE 104#define ID_RICH_CLEAR 105#define ID_RICH_SELECTALL 106#define ID_RICH_SETFONT 107不过这些值还可以通过VC++编译器中的菜单View->Resource Symbols进行添加。 四. 添加消息相应操作,由于这些ID是我们自己定义的,所以我们只能手动添加: 1.在头文件中添加: afx_msg void OnRButtonDown(UINT nFlags, CPoint point);afx_msg void OnCopy() { Copy(); }afx_msg void OnCut() { Cut(); }afx_msg void OnPaste() { Paste(); }afx_msg void OnSelectall() { SetSel(0, -1); }afx_msg void OnUndo() { Undo(); }afx_msg void OnClear() { Clear(); }afx_msg void OnSelectfont();//改变字体2.在实现文件的消息映射宏中添加如下: ON_COMMAND(ID_RICH_COPY, OnCopy)ON_COMMAND(ID_RICH_CUT, OnCut)ON_COMMAND(ID_RICH_PASTE, OnPaste)ON_COMMAND(ID_RICH_SELECTALL, OnSelectall)ON_COMMAND(ID_RICH_UNDO, OnUndo)ON_COMMAND(ID_RICH_CLEAR, OnClear)ON_COMMAND(ID_RICH_SETFONT, OnSelectfont)3.最后添加字体变换函数: CHARFORMAT cf;LOGFONT lf;memset(&cf, 0, sizeof(CHARFORMAT));memset(&lf, 0, sizeof(LOGFONT));//判断是否选择了内容BOOL bSelect = (GetSelectionType() != SEL_EMPTY) ? TRUE : FALSE;if (bSelect){ GetSelectionCharFormat(cf);}else{ GetDefaultCharFormat(cf);}//得到相关字体属性BOOL bIsBold = cf.dwEffects & CFE_BOLD;BOOL bIsItalic = cf.dwEffects & CFE_ITALIC;BOOL bIsUnderline = cf.dwEffects & CFE_UNDERLINE;BOOL bIsStrickout = cf.dwEffects & CFE_STRIKEOUT;//设置属性lf.lfCharSet = cf.bCharSet;lf.lfHeight = cf.yHeight/15;lf.lfPitchAndFamily = cf.bPitchAndFamily;lf.lfItalic = bIsItalic;lf.lfWeight = (bIsBold ? FW_BOLD : FW_NORMAL);lf.lfUnderline = bIsUnderline;lf.lfStrikeOut = bIsStrickout;sprintf(lf.lfFaceName, cf.szFaceName); CFontDialog dlg(&lf);dlg.m_cf.rgbColors = cf.crTextColor;if (dlg.DoModal() == IDOK){ dlg.GetCharFormat(cf);//获得所选字体的属性 if (bSelect) SetSelectionCharFormat(cf); //为选定的内容设定所选字体 else SetWordCharFormat(cf); //为将要输入的内容设定字体}然后在我们需要的地方添加头文件和实现文件,将定义的CRichEditCtrl对象改为用CMyRichEdit来定义,就可以了。还有提醒的就是不要忘记在InitInstance()中调用AfxInitRichEdit() http://www.vckbase.com/document/viewdoc.asp?id=328http://www.vckbase.com/code/downcode.asp?id=1518http://www.vckbase.com/document/journal/vckbase13/images/richedit1.gif 通过程序向RichEditView写文本作者:陈新之下载本文示例代码在建立SDI或MDI程序时,如果选择了RichEditView,就可以利用RichEdit提供的丰富的格式,但是如何通过程序在RichEditView中写入文本却是一个问题,下文就介绍了如何实现用程序在RichEditView中写文本. 一、在文本末尾写文字void CRichEditUseDoc::OnTextWriteafter() { CString str; int nTextLength; CRichEditView *pView = GetView(); CRichEditCtrl &edit = pView->GetRichEditCtrl(); //要写的内容为ABCDEFG str = "ABCDEFG"; //加入换行 str += "\r\n"; //获得文字的长度 nTextLength = edit.GetWindowTextLength(); //将光标放在文本最末 edit.SetSel(nTextLength, nTextLength); //写入文本 edit.ReplaceSel(str);} 二、在光标后插入文本,可以使用CHARRANGE结构 void CRichEditUseDoc::OnTextWriteCur() { CString str; CHARRANGE crPos; CRichEditView *pView = GetView(); CRichEditCtrl &edit = pView->GetRichEditCtrl(); //用CHARRANGE结构体获得选择的文本位置 edit.GetSel(crPos); //要写的内容为12345 str = "12345"; //如果没有选中文本,就直接写在光标后 //如果选中了文本,就替代选中的文本 if (crPos.cpMin != crPos.cpMax) { edit.SetSel(crPos.cpMin, crPos.cpMax); } else { edit.SetSel(crPos.cpMax, crPos.cpMax); } edit.ReplaceSel(str); } 三、全选文本 void CRichEditUseDoc::OnTextSelectall() { CRichEditView *pView = GetView(); CRichEditCtrl &edit = pView->GetRichEditCtrl(); edit.SetSel(0, -1);}http://www.vckbase.com/document/viewdoc.asp?id=485 修改注册表问题(急!!!!) 读取数据库数据时发生错误 怎样把一个文件上传到一个网站里? 类指针的问题 为什么在CFormView中创建一个PropertySheet,弹出一个独立的对话框??????? 跪求各位高手解决代码的出错问题,谢谢~ 请教:有关RichEdit控件 状态栏的改变! 如何转换字符型为CString型? 如何在SDI的客户区显示位图?? #ifdef SUBSTATION是什么意思 特难的问题,我的对话框上的ListCtrl和CComboBox的刷新问题?
作者:sonystone
下载本文的源代码在VC中提供了两种很方便的编辑控件(CEdit 和CRichEditCtrl),一般来说这两种控件已经满足了我们大部分的需要,不过只有CEdit控件能响应我们鼠标右键消息,通过右键我们很容易的操作我们的编辑,而在CRichEditCtrl控件中我们不能得到这样的操作,同时CRichEditCtrl是能够包含各种格式的内容,就好像Word一样能够写入各种不同的字体,不过CRichEditCtrl没有给我们提供这样的要求,今天我的目的也就是给他添加这样的扩展操作。
本代码运行效果图
一. 首先我们要从CRichEditCtrl类派生一个我们自己的类CMyRichEdit,我们的操作也是在其中完成的。二. 然后我们添加鼠标右键消息,在其中添加代码如下: //设置为焦点
SetFocus();//创建一个弹出式菜单
CMenu popmenu;
popmenu.CreatePopupMenu();//添加菜单项目popmenu.AppendMenu(0, ID_RICH_UNDO, "&Undo");
popmenu.AppendMenu(0, MF_SEPARATOR);
popmenu.AppendMenu(0, ID_RICH_CUT, "&Cut");
popmenu.AppendMenu(0, ID_RICH_COPY, "C&opy");
popmenu.AppendMenu(0, ID_RICH_PASTE, "&Paste");
popmenu.AppendMenu(0, ID_RICH_CLEAR, "C&lear");
popmenu.AppendMenu(0, MF_SEPARATOR);
popmenu.AppendMenu(0, ID_RICH_SELECTALL, "Select &All");
popmenu.AppendMenu(0, MF_SEPARATOR);
popmenu.AppendMenu(0, ID_RICH_SETFONT, "Select &Font");//初始化菜单项
UINT nUndo=(CanUndo() ? 0 : MF_GRAYED );
popmenu.EnableMenuItem(ID_RICH_UNDO, MF_BYCOMMAND|nUndo);
UINT nSel=((GetSelectionType()!=SEL_EMPTY) ? 0 : MF_GRAYED) ;
popmenu.EnableMenuItem(ID_RICH_CUT, MF_BYCOMMAND|nSel);
popmenu.EnableMenuItem(ID_RICH_COPY, MF_BYCOMMAND|nSel);
popmenu.EnableMenuItem(ID_RICH_CLEAR, MF_BYCOMMAND|nSel);
UINT nPaste=(CanPaste() ? 0 : MF_GRAYED) ;
popmenu.EnableMenuItem(ID_RICH_PASTE, MF_BYCOMMAND|nPaste);//显示菜单
CPoint pt;
GetCursorPos(&pt);
popmenu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
popmenu.DestroyMenu();三. 然后在.h文件中加入如下的ID定义: #define ID_RICH_UNDO 101
#define ID_RICH_CUT 102
#define ID_RICH_COPY 103
#define ID_RICH_PASTE 104
#define ID_RICH_CLEAR 105
#define ID_RICH_SELECTALL 106
#define ID_RICH_SETFONT 107不过这些值还可以通过VC++编译器中的菜单View->Resource Symbols进行添加。 四. 添加消息相应操作,由于这些ID是我们自己定义的,所以我们只能手动添加: 1.在头文件中添加: afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnCopy() { Copy(); }
afx_msg void OnCut() { Cut(); }
afx_msg void OnPaste() { Paste(); }
afx_msg void OnSelectall() { SetSel(0, -1); }
afx_msg void OnUndo() { Undo(); }
afx_msg void OnClear() { Clear(); }
afx_msg void OnSelectfont();//改变字体2.在实现文件的消息映射宏中添加如下: ON_COMMAND(ID_RICH_COPY, OnCopy)
ON_COMMAND(ID_RICH_CUT, OnCut)
ON_COMMAND(ID_RICH_PASTE, OnPaste)
ON_COMMAND(ID_RICH_SELECTALL, OnSelectall)
ON_COMMAND(ID_RICH_UNDO, OnUndo)
ON_COMMAND(ID_RICH_CLEAR, OnClear)
ON_COMMAND(ID_RICH_SETFONT, OnSelectfont)3.最后添加字体变换函数: CHARFORMAT cf;
LOGFONT lf;
memset(&cf, 0, sizeof(CHARFORMAT));
memset(&lf, 0, sizeof(LOGFONT));//判断是否选择了内容
BOOL bSelect = (GetSelectionType() != SEL_EMPTY) ? TRUE : FALSE;
if (bSelect)
{
GetSelectionCharFormat(cf);
}
else
{
GetDefaultCharFormat(cf);
}//得到相关字体属性
BOOL bIsBold = cf.dwEffects & CFE_BOLD;
BOOL bIsItalic = cf.dwEffects & CFE_ITALIC;
BOOL bIsUnderline = cf.dwEffects & CFE_UNDERLINE;
BOOL bIsStrickout = cf.dwEffects & CFE_STRIKEOUT;//设置属性
lf.lfCharSet = cf.bCharSet;
lf.lfHeight = cf.yHeight/15;
lf.lfPitchAndFamily = cf.bPitchAndFamily;
lf.lfItalic = bIsItalic;
lf.lfWeight = (bIsBold ? FW_BOLD : FW_NORMAL);
lf.lfUnderline = bIsUnderline;
lf.lfStrikeOut = bIsStrickout;
sprintf(lf.lfFaceName, cf.szFaceName);
CFontDialog dlg(&lf);
dlg.m_cf.rgbColors = cf.crTextColor;
if (dlg.DoModal() == IDOK)
{
dlg.GetCharFormat(cf);//获得所选字体的属性
if (bSelect)
SetSelectionCharFormat(cf); //为选定的内容设定所选字体
else
SetWordCharFormat(cf); //为将要输入的内容设定字体
}然后在我们需要的地方添加头文件和实现文件,将定义的CRichEditCtrl对象改为用CMyRichEdit来定义,就可以了。
还有提醒的就是不要忘记在InitInstance()中调用AfxInitRichEdit()
http://www.vckbase.com/code/downcode.asp?id=1518http://www.vckbase.com/document/journal/vckbase13/images/richedit1.gif
作者:陈新之下载本文示例代码在建立SDI或MDI程序时,如果选择了RichEditView,就可以利用RichEdit提供的丰富的格式,但是如何通过程序在RichEditView中写入文本却是一个问题,下文就介绍了如何实现用程序在RichEditView中写文本. 一、在文本末尾写文字
void CRichEditUseDoc::OnTextWriteafter()
{
CString str;
int nTextLength; CRichEditView *pView = GetView();
CRichEditCtrl &edit = pView->GetRichEditCtrl();
//要写的内容为ABCDEFG
str = "ABCDEFG";
//加入换行
str += "\r\n";
//获得文字的长度
nTextLength = edit.GetWindowTextLength();
//将光标放在文本最末
edit.SetSel(nTextLength, nTextLength);
//写入文本
edit.ReplaceSel(str);
}
二、在光标后插入文本,可以使用CHARRANGE结构 void CRichEditUseDoc::OnTextWriteCur()
{
CString str;
CHARRANGE crPos;
CRichEditView *pView = GetView();
CRichEditCtrl &edit = pView->GetRichEditCtrl();
//用CHARRANGE结构体获得选择的文本位置
edit.GetSel(crPos);
//要写的内容为12345
str = "12345";
//如果没有选中文本,就直接写在光标后
//如果选中了文本,就替代选中的文本
if (crPos.cpMin != crPos.cpMax)
{
edit.SetSel(crPos.cpMin, crPos.cpMax);
}
else
{
edit.SetSel(crPos.cpMax, crPos.cpMax);
}
edit.ReplaceSel(str);
}
三、全选文本 void CRichEditUseDoc::OnTextSelectall()
{
CRichEditView *pView = GetView();
CRichEditCtrl &edit = pView->GetRichEditCtrl(); edit.SetSel(0, -1);
}
http://www.vckbase.com/document/viewdoc.asp?id=485