在mfc中使用工具栏里的RichEdit 控件时,应该在程序初始话时加入AfxInitRichEdit,或者 AfxInitRichEdit2
否则的话 程序会起不来.也没有任何错误信息.
这俩函数 是加载 Riched20.dll(Riched32.dll )的.
//得到edit选中的内容
m_edit1.GetWindowText(strTemp);
strTemp = strTemp.Mid(nStart) - strTemp.Mid(nEnd);
AfxMessageBox(strTemp);
注:GetSel后,如果nStart和nEnd,表明光标处于某个位置(直观来看就是光标在闪动);
如果nStart和nEnd不相等,表明用户在edit中选中了一段内容。
3.在edit最后添加字符串
CString str;
m_edit1.SetSel(-1, -1);
m_edit1.ReplaceSel(str);
4.随输入自动滚动到最后一行(richedit同样适用)
方法一:(摘自msdn)
// The pointer to my edit.
extern CEdit* pmyEdit;
int nFirstVisible = pmyEdit->GetFirstVisibleLine();
// Scroll the edit control so that the first visible line
// is the first line of text.
if (nFirstVisible > 0)
pmyEdit->LineScroll(-nFirstVisible, 0);
m_richedit.PostMessage(WM_VSCROLL, SB_BOTTOM, 0);
5.如何限制edit输入指定字符
可以从CEdit派生一个类,添加WM_CHAR消息映射。下面一个例子实现了限定输入16进制字符的功能。
void CMyHexEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
if ( (nChar >= '0' && nChar <= '9') ||
(nChar >= 'a' && nChar <= 'f') ||
(nChar >= 'A' && nChar <= 'F') ||
nChar == VK_BACK ||
nChar == VK_DELETE) //msdn的virtual key
CEdit::OnChar(nChar, nRepCnt, nFlags);
6.如何使用richedit
添加AfxInitRichEdit();
CxxxApp::InitInstance()
AfxInitRichEdit();
.............
AfxInitRichEdit()功能:装载 RichEdit 1.0 Control (RICHED32.DLL).
7.如何使用richedit2.0 or richedit3.0
使用原因:由于RichEdit2.0A自动为宽字符(WideChar),所以它可以解决中文乱码以及一些汉字问题
方法一:(msdn上的做法,适用于用VC.NET及以后版本创建的工程)
To update rich edit controls in existing Visual C++ applications to version 2.0,
open the .RC file as text, change the class name of each rich edit control from "RICHEDIT" to "RichEdit20a".
Then replace the call to AfxInitRichEdit with AfxInitRichEdit2.
方法二:以对话框为例:
(1) 增加一全局变量 HMODULE hMod;
(2) 在CxxxApp::InitInstance()中添加一句hMod = LoadLibrary(_T("riched20.dll"));
在CxxxApp::ExitInstance()中添加一句FreeLibrary(hMod);
(3) 在对话框上放一个richedit,文本方式打开.rc文件修改该richedit控件的类名"RICHEDIT" to "RichEdit20a".
(4) 在对话框头文件添加 CRichEditCtrl m_richedit;
在OnInitDialog中添加 m_richedit.SubclassDlgItem(IDC_RICHEDIT1, this);
8.改变richedit指定区域的颜色及字体
CHARFORMAT cf;
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 = 12*12;//文字高度
cf.crTextColor = RGB(200, 100, 255); //文字颜色
strcpy(cf.szFaceName ,_T("隶书"));//设置字体
m_richedit1.SetSel(1, 5); //设置处理区域
m_richedit1.SetSelectionCharFormat(cf);
9.设置行间距(只适用于richedit2.0)
PARAFORMAT2 pf;
pf2.cbSize = sizeof(PARAFORMAT2);
pf2.dwMask = PFM_LINESPACING | PFM_SPACEAFTER;
pf2.dyLineSpacing = 200;
pf2.bLineSpacingRule = 4;
m_richedit.SetParaFormat(pf2);
10.richedit插入位图
Q220844:How to insert a bitmap into an RTF document using the RichEdit control in Visual C++ 6.0
MSDN的解释如下:
ES_WANTRETURN
Specifies that a carriage return be inserted when the user presses the
ENTER key while entering text into a multiple-line edit control in a
dialog box. Without this
style, pressing the ENTER key has the same effect as pressing the
dialog box's default pushbutton. This style has no effect on a
single-line edit control.
If it does not exist, copy OutLookRichEdit.cpp and OutLookRichEdit.h to the project directory.
Click the menu choice Project-Add to Project-Files and select the above-copied files to add the wrapper class to your project.
Import the hand cursor into the resource and rename it "IDC_LINK".
Use Classwizard to add a member variable of the rich edit control (CRichEditCtrl).
Include the OutLookRichEdit.h file in the dialog's header file and change the declaration of rich edit member variable, as in
CRichEditCtrl m_ctrlText1;
COutLookRichEdit m_ctrlText1;
In InitDialog(), add the following code.
m_ctrlText1.SetRawHyperText(_T("Click <%$here$#100#%>
to see the about box."));
At this level, if you build the project and run it, you can see the rich
edit control with linked text, but nothing would happen if you clicked
on the link.
To Show a dialog while the link is clicked, you have to add some more
code in the dialog class. Before that, have a closer look at the
preceding code and hypertext syntax. The link text is enclosed between
the "$" symbols and the corresponding dialog's resource
value 100 (About Box), enclosed in "#" symbols.
You can find the #define values of dialogs in the resource.h file.
Use ClassWizard to map OnNotify of the dialog and write the corresponding implementation code in .cpp file, like:
BOOL CDEMODlg::OnNotify(WPARAM wParam,
LPARAM lParam,
LRESULT* pResult)
NMHDR* pNmHdr = (NMHDR*) lParam; if(IDC_RICHEDIT1 == pNmHdr->idFrom){ switch(pNmHdr->code)
{ case IDD_ABOUTBOX:
CAboutDlg oDlg;
oDlg.DoModal (); break;
} return CDialog::OnNotify(wParam, lParam, pResult);
Now, build and run the project. It is recommended that you set the read-only attribute to the rich edit control.
Downloads
src.CacheData(CF_BITMAP, &sm);
LPDATAOBJECT lpDataObject =
(LPDATAOBJECT)src.GetInterface(&IID_IDataObject);
pRichEditOle->ImportDataObject(lpDataObject, 0, NULL);
lpDataObject->Release();
字体设置代码
最后添加字体变换函数:
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);
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); //为选定的内容设定所选字体
SetWordCharFormat(cf); //为将要输入的内容设定字体
unsigned mask = SendMessage(RichEdit1->Handle, EM_GETEVENTMASK, 0, 0);
SendMessage(RichEdit1->Handle, EM_SETEVENTMASK, 0, mask | ENM_LINK);
SendMessage(RichEdit1->Handle, EM_AUTOURLDETECT, true, 0); //检测URL
RichEdit1->Text = "欢迎访问C++ Builder\n"
"网址: \n"
"偶的信箱:\n"
"mailto::info@ccrun.com \n"
"嘿嘿\n";
重载窗体的WndProc
1。在.h中添加:
protected:
virtual void __fastcall WndProc(Messages::TMessage &Message);
2。在.cpp中添加:
//---------------------------------------------------------------------------
void __fastcall TMainForm::WndProc(Messages::TMessage &Message)
if (Message.Msg == WM_NOTIFY)
if (((LPNMHDR)Message.LParam)->code == EN_LINK)
ENLINK* p = (ENLINK *)Message.LParam;
if (p->msg == WM_LBUTTONDOWN)
SendMessage(RichEdit1->Handle, EM_EXSETSEL, 0, (LPARAM)&(p->chrg));
ShellExecute(Handle, "open", RichEdit1->SelText.c_str(), 0, 0, SW_SHOWNORMAL);
TForm::WndProc(Message);
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员