MFC 中 RichEdit2.0控件怎么设置ios 控件自动换行行啊?在属性中设置了mulitiline属性为TRUE,但是实质没用

VC中在对话框上使用Rich Edit控件相关问题 - 浔阳渔夫 - 博客园
随笔 - 100
1.设置edit只读属性&&& 方法一:&&&&&&&&&&&&&&& m_edit1.SetReadOnly(TRUE);&&& 方法二:&&&&&&&&&&&&&&& ::SendMessage(m_edit1.m_hWnd, EM_SETREADONLY, TRUE, 0);
2.判断edit中光标状态并得到选中内容(richedit同样适用)&&&&&&& int nStart, nE&&&&&&& CString strT&&&&&&& m_edit1.GetSel(nStart, nEnd);&&&&&&& if(nStart == nEnd)&&&&&&& {&&&&&&&&&&& strTemp.Format(_T("光标在%d"), nStart);&&&&&&&&&&& AfxMessageBox(strTemp);&&&&&&& }&&&&&&& else&&&&&&& {&&&&&&&&&&& //得到edit选中的内容&&&& &&&&&&&&&&& m_edit1.GetWindowText(strTemp);&&&&&&&&&&& strTemp = strTemp.Mid(nStart) - strTemp.Mid(nEnd);&&&&&&&&&&& AfxMessageBox(strTemp); &&&&&&& }&&& 注:GetSel后,如果nStart和nEnd,表明光标处于某个位置(直观来看就是光标在闪动);&&&&&&&&&&&& 如果nStart和nEnd不相等,表明用户在edit中选中了一段内容。
3.在edit最后添加字符串&&&&&&& CS&&&&&&& m_edit1.SetSel(-1, -1);&&&&&&& m_edit1.ReplaceSel(str);
4.随输入自动滚动到最后一行(richedit同样适用)&&& 方法一:(摘自msdn)&&&&&&& // The pointer to my edit.&&&&&&& extern CEdit* pmyE&&&&&&& 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 hM&&&&&& (2)&&& 在CxxxApp::InitInstance()中添加一句hMod = LoadLibrary(_T("riched20.dll"));&&& &&& &&& 在CxxxApp::ExitInstance()中添加一句FreeLibrary(hMod);&&& && (3)&&& 在对话框上放一个richedit,文本方式打开.rc文件修改该richedit控件的类名"RICHEDIT" to "RichEdit20a".&&& && (4)&&& 在对话框头文件添加 CRichEditCtrl m_&&& &&& &&& 在OnInitDialog中添加 m_richedit.SubclassDlgItem(IDC_RICHEDIT1, this);
8.改变richedit指定区域的颜色及字体&&&&&&& CHARFORMAT&&& &&& 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&&&&&&& 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
11.richedit插入gif动画
12.richedit嵌入ole对象
13.使richedit选中内容只读
14.打印richedit
15.richeidt用于聊天消息窗口
16.解决richedit的EN_SETFOCUS和EN_KILLFOCUS无响应的问题
17.richedit拼写检查
18.改变edit背景色Q117778:How to change the background color of an MFC edit control
19.当edit控件的父窗口属性是带标题栏WS_CAPTION和子窗口WS_CHILD时,不能设置焦点SetFocusQ230587:PRB: Can't Set Focus to an Edit Control When its Parent Is an Inactive Captioned Child Window
20. 在Edit中回车时,会退出对话框 选中Edit的风格Want Return。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.
21. 动态创建的edit没有边框的问题&&& m_edit.Create(....);&&& m_edit.ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME);
22. 一个能显示RTF,ole(包括gif, wmv,excel ,ppt)的例子
Environment: VC6 SP4, 2000.
Follow these 10 easy steps to build the OutLookRichEdit control:
Insert a rich edit control into the dialog.Call AfxInitRichEdit() in the InitInstance of the App class or in InitDialog.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;to 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*) lP
if(IDC_RICHEDIT1 == pNmHdr-&idFrom){
switch(pNmHdr-&code)
case IDD_ABOUTBOX:
CAboutDlg oD
oDlg.DoModal ();
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.
在RichEdit中插入Bitmap
COleDataSSTGMEDIUMsm.tymed=TYMED_GDI;sm.hBitmap=sm.pUnkForRelease=NULL;src.CacheData(CF_BITMAP, &sm);LPDATAOBJECT lpDataObject =(LPDATAOBJECT)src.GetInterface(&IID_IDataObject);pRichEditOle-&ImportDataObject(lpDataObject, 0, NULL);lpDataObject-&Release();
字体设置代码
最后添加字体变换函数: CHARFORMAT LOGFONT 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.bCharS lf.lfHeight = cf.yHeight/15; lf.lfPitchAndFamily = cf.bPitchAndF lf.lfItalic = bIsI lf.lfWeight = (bIsBold ? FW_BOLD : FW_NORMAL); lf.lfUnderline = bIsU lf.lfStrikeOut = bIsS sprintf(lf.lfFaceName, cf.szFaceName); &&&&&&&&&&&& CFontDialog dlg(&lf); dlg.m_cf.rgbColors = cf.crTextC if (dlg.DoModal() == IDOK) { &&&&&&&&&&&& dlg.GetCharFormat(cf);//获得所选字体的属性 &&&&&&&&&&&& if (bSelect) &&&&&&&&&&&&&&&&&&&&&&&& SetSelectionCharFormat(cf);&&&& //为选定的内容设定所选字体 &&&&&&&&&&&& else &&&&&&&&&&&&&&&&&&&&&&&& SetWordCharFormat(cf);&&&&&&&& //为将要输入的内容设定字体 }
在RichEdit中实现超链接
在RichEdit中实现超链接
责任编辑:admin   在CBuilder上制作 更新日期:
首先在Form上放置一个RichEdit。在窗体的构造函数中添加以下代码:__fastcall TMainForm::TMainForm(TComponent* Owner)&&&&&&&& : TForm(Owner){&&&& 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:: \n"&&&&&&&&&&&&&&&&&&&&&& "嘿嘿\n";}重载窗体的WndProc1。在.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.LP&&&&&&&&&&&& 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);}安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&在对话框中添加了一个richedit控件,对话框就不显示了
郁闷,我试图弹出一个对话框,步骤如下:
1.建立了一个对话框资源的模板
2.双击模板建立对应的类
3.包含头文件
4,弹出对话框,代码如下:
dlg.DoModal();
但是,却无法弹出对话框?
其他的对话框都可以,但就是这个对话框弹不出来,
是vc的毛病?还是其他什么呢?
后来才发现,是添加了richEdit的问题,去掉就行了,但是不是解决方法,于是网上搜了一下,还真有:参考如下资料:
这个问题是同事遇到的,比较有趣的现象:就是他有一个MFC的对话框应用程序,添加了一个RichEdit控件后就不能正常显示了,现象就是点生成的可执行程序,没有反应。我上网查阅了下,网上的说法是程序还没有准备好RichEdit的编辑,就是还没有为这个控件做好准备,解决办法是手动添加做准备语句,在应用程序类的InitInstance函数体内添加以下语句:
&&&&&&& AfxInitRichEdit():
这样就好了,真是奇怪。
最后看到了MS的解释,属于官方的东西,比较正式,帖在这里。&
&&& If you are using a rich edit control in a dialog box (regardless whether your application is SDI, MDI, or dialog-based), you must call AfxInitRichEdit once before the dialog box is displayed. A typical place to call this function is in your program’s
InitInstance member function. You do not need to call it for each time you display the dialog box, only the first time. You do not have to call AfxInitRichEdit if you are working with CRichEditView.
&&&& 不过到底是为什么会这样,还是不明白,也不知道MFC内部是如何处理的,不过知道怎么做就是了。
在CxxxApp::InitInstance()中添加代码&&
& AfxInitRichEdit();&&
在app的InitInstance中加入AfxRichEditInit()初始化richedit空间
初始化通用控件即可,InitCommonControl***或InitCommonControls皆可
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:98086次
积分:1726
积分:1726
排名:千里之外
原创:49篇
转载:188篇
(1)(1)(3)(22)(26)(26)(11)(5)(10)(9)(3)(1)(3)(5)(7)(1)(13)(1)(11)(6)(14)(12)(4)(10)(12)(20)RichEdit控件参考手册(转)
摘要: 本文对Rich Edit控件底层消息机制进行了讲解,以期读者对Windows平台下的Rich
Edit控件有一个更深入的认识,同时对于使用Win32
SDK进行开发的人员具有一定参考价值。因为文章的初衷是引领VB程序员通过Win32 API调用来扩展VB下的Rich
Edit控件的功能,所以对于每个消息的详细说明和注意事项未作过多说明,感兴趣的朋友可以参考Visual Studio下的MSDN
关键字:Rich Edit Control、RTF、SDK、MSDN。
Edit控件是一个可用于输入、编辑、格式化、打印和保存文本的窗体。这些文本可以设置字符和段落格式,并且可以包含嵌入的COM对象。Rich
Edit控件提供格式化文本的编程接口。不过,应用程序必须实现这些用户接口组件,以便用户可以进行格式化操作。
Rich Edit控件几乎支持所有用于多行Edit控件的消息和通知。因此,已经使用了Edit控件的程序可以很容易的改为Rich
Edit控件。额外的消息和通知使得应用程序可以访问Rich Edit控件特有的功能。获取更多关于Edit控件的信息,请参阅Edit
Controls。
正如大家所熟知的,Windows控件是基础窗口,它处理那些控制窗口显示和特征的消息。而ActiveX控件是把那些消息变成属性和方法的COM
容器。RichEdit Windows控件是Edit Windows控件的扩展集,TextBox
ActiveX控件也是从它派生而来。RichEdit能够识别Edit消息并且加入了自己特有的消息。你可以在Win32帮助文件中认出Edit和RichEdit的消息常数,因为他们均采用EM_作为前缀。
RichTextBox控件将绝大多数的这种消息映射为其属性。例如,EM_LIMITTEXT与MaxLength属性相对应。但是你同时会注意到一些感兴趣的消息并没有与之对应的RichTextBox属性。为什么呢?
ActiveX控件为最通用的特性提供方法和属性,更具体讲,是提供给VB设计者最感兴趣的特性。设计者们似乎喜欢每个新版本里更多的特征。
例如,TextBox
和RichTextBox控件现在具备Locked属性。在旧版本的VB中你不得不通过EM_SETREADONLY消息来模拟。但是,还有许多其他隐藏的或者不是很明显的特性在ActiveX控件中尚未提供。为了使用这些特性,我们就必须对Rich
Edit控件的底层消息机制进行较深入的了解。
二、关于Rich Edit控件
Rich Edit控件的最初规范为1.0版。目前规范为2.0版。(译者注:目前最新版本为4.1版本!)在创建一个Rich
Edit控件之前,你应该调用LoadLibrary函数来确认安装的Rich
Edit控件的版本。下表显示了不同版本与其DLL间的对应关系。
Rich Edit 版本 DLL名称
RICHED32.DLL&&&&
2.0 RICHED20.DLL
低于5.30.23.1200&&&
3.0 RICHED20.DLL
5.30.23.1200或更高&&&
4.1 Msftedit.dll&&
下表给出了不同版本Windows下与其包含的不同版本的Rich Edit对应关系:
Windows XP SP1 包含 Rich Edit 4.1, Rich Edit 3.0, 和一个 Rich Edit 1.0
仿真程序。&&&
Windows XP 包含Rich Edit 3.0和一个 Rich Edit 1.0
仿真程序。&&&
Windows Me 包含Rich Edit
1.0和3.0。&&&
Windows 2000 包含Rich Edit 3.0和一个 Rich Edit 1.0
仿真程序。&&&
Windows NT 4.0 包含Rich Edit
1.0和2.0。&&&
Windows 98 包含Rich Edit
1.0和2.0。&&&
Windows 95 只包含Rich Edit 1.0。不过,Riched20.DLL与Windows
95系统兼容,所以可以在正确安装后使用。
2.1 Rich Edit 2.0
Rich Edit 2.0包含几个新特性,比如支持Unicode和远东语言,多级撤消,以及大量的增强用户接口。
Rich Edit 2.0采用与Rich Edit 1.0一致的Win32函数,结构和消息,极少例外。他们的区别在于:
· Rich Edit 1.0窗体类的名· 字叫“RichEdit”。Rich Edit 2.0同·
时具有ANSI和Unicode窗体类,· “RichEdit20A”和“RichEdit20W”分别表示对应的Rich
Edit窗体类,· 我们RichEdit.H文件定义的RICHEDIT_CLASS常数来区分,而·
具体采用哪一个取决于UNICODE编译标· 志。
· 在Rich Edit 2.0中,· 如果你创建一个Unicode控件,·
只需在任何发往控件的Window消息中给出Unicode数据。同· 样的,· 如果创建了一个ANSI控件,·
只能发送ANSI或者DBCS数据。你可以使用IsWindowUnicode函数来判断是否一个Rich
Edit控件是Unicode的。
· Rich Edit 1.0 采用CRLF(回车符和换行符)字符组合表示段落符号。而· RichEdit
2.0只采用一个回车符号(‘\r’)。
· Rich Edit 2.0包含以下新的消息:
消息 描述&&&
EM_AUTOURLDETECT
是否开启/关闭自动URL检测。&&&
EM_CANREDO
判断是否在Redo队列中有一些动作。&&&
EM_GETIMECOMPMODE
获取当前输入方式编辑(IME)模式。&&&
EM_GETLANGOPTIONS
获取IME和远东语言支持选项。&&&
EM_GETREDONAME
获取Redo队列中的下一动作的类型名称。&&&
EM_GETTEXTMODE
获取文本模式或者Undo级别。&&&
EM_GETUNDONAME
获取Undo队列中的下一动作的类型名称。&&&
重做Redo队列中的下一动作。&&&
EM_SETLANGOPTIONS
设置IME和远东语言支持选项。&&&
EM_SETTEXTMODE
设置文本模式或者Undo级别。&&&
EM_SETUNDOLIMIT
设置Undo队列的最大动作数目。&&&
EM_STOPGROUPTYPING 终止当前Undo动作的连续键入动作的组合。
· Rich Edit 2.0 包含以下新的结构:
消息 描述&&&
CHARFORMAT2
包含字符格式信息。&&&
PARAFORMAT2 包含段落格式属性。
· Rich Edit 2.0 不· 支持以下这些在亚洲语言版本的Rich Edit 1.0中支持的消息:
EM_CONVPOSITION&&&
EM_GETIMECOLOR&&&
EM_GETIMEOPTIONS&&&
EM_GETPUNCTUATION&&&
EM_GETWORDWRAPMODE&&&
EM_SETIMECOLOR&&&
EM_SETIMEOPTIONS&&&
EM_SETPUNCTUATION&&&
EM_SETWORDWRAPMODE
2.2&& 创建 Rich Edit 控件
可用通过CreateWindowEx函数中指定Rich Edit 窗体类来创建一个Rich
Edit控件。如果使用1.0版本(RICHED32.DLL),窗体类参数应该为“RichEdit”。如果采用2.0版本(RICHED20.DLL),窗体类参数应该为“RICHEDIT_CLASS”。
Edit控件支持大部分的Edit控件采用的窗体样式,同时也支持一些额外的样式。你如果希望控件中的文本支持不止一行的话就应该给出ES_MULTILINE窗体样式。
2.3 文本格式
应用程序可以通过给Rich
Edit控件发送消息来格式化字符和段落以及获取这些格式化信息。段落格式属性包含对齐、跳格、缩进和编号。对字符而言,你可以指定字体、尺寸、颜色以及如粗体、斜体和保护等效果。
你可以采用EM_SETPARAFORMAT消息来应用段落格式。获取当前选中文本的段落格式属性,则采用EM_GETPARAFORMAT消息。PARAFORMAT结构将会在这两个消息中用到,它用于描述段落格式属性。
你可以采用EM_SETCHARFORMAT消息来应用字符格式。获取当前选中文本的字符格式属性,则采用EM_GETCHARFORMAT消息。CHARFORMAT结构将会在这两个消息中用到,它用于描述字符格式属性。
你也可以采用EM_SETCHARFORMAT和EM_GETCHARFORMAT消息来设置和获取默认字体格式,它将应用于所有随后插入的字符。例如,应用程序将默认字符格式设置为粗体,则用户随后敲入的字符都将为粗体。
只有在当前选择内容为空的时候默认字符格式才会被应用到新插入的文本上。否则,新的文本将假定沿用其所替换的文本的格式。如果选择内容改变,则默认字体格式将将采用该内容的首字符的格式。
保护(Protected)字符效果是唯一不改变其文本显示的例子。如果用户试图修改保护文本,Rich
Edit控件将发送EN_PROTECTED通知到其父窗口,让其父窗体决定是否允许或者拒绝修改。为了接收该通知,你必须使用EM_SETEVENTMASK消息来启用它。
前景色是一个字符属性,但是背景色是一个Rich
Text控件属性。要设置背景色,请采用EM_SETBKGNDCOLOR消息。
2.4 Rich Edit控件中的当前选择内容
用户可以在Rich
Edit控件中通过鼠标和键盘来选择文本。当前选择内容指的是选中字符的范围,或者表示没有字符选中时的插入点位置。应用程序可以获取选中内容的相关信息,设置当前选中内容,决定当前选中内容何时改变,显示或者隐藏当前高亮显示的选中内容等。
Edit控件中的当前选中内容,采用EM_EXGETSEL消息。设置当前选择区域,采用EM_EXSETSEL消息。CHARRANGE结构用于在这两个消息中描述字符范围。获取当前选中内容的相关信息,你可以采用EM_SELECTIONTYPE消息。
应用程序可以通过处理EN_SELCHANGE通知来检测当前选中内容何时被改变。该通知通过SELCHANGE结构给出新选中内容的相关信息。Rich
Edit控件只有在你通过EM_SETEVENTMASK消息开启它之后才会发送该通知。
默认情况下,Rich
Edit控件在获取和失去焦点时将开启和隐藏选中文本的高亮显示。你可以通过EM_HIDESELECTION消息在任何时候开启或者隐藏选中区域的高亮显示。例如,某个应用程序可能提供一个查找对话框用于在Rich
Edit控件中查找文本,这种情况下就必须使用EM_HIDESELECTION消息来保持选中文本的高亮显示。
与Edit控件一样,你可以使用ES_NOHIDESEL窗体样式来防止Rich
Edit控件在失去焦点时隐藏选中区域的高亮显示。你也可以在Rich
Edit控件创建之后使用EM_HIDESELECTION消息来改变窗体的ES_NOHIDESEL样式。
获取和设置当前选中内容使用EM_GETSEL和EM_SETSEL
Edit控件消息,而非EM_EXGETSEL和EM_EXSETSEL消息。EM_GETSEL消息将两个16位字符索引压缩为它的32位返回值,因此,仅仅适用于选中区域的前64K字节。然而,一个Rich
Edit控件不可能包含超过32K字节的文本,除非你使用EM_EXLIMITTEXT消息扩展了这个限制。对于选中文本中超过前64K字节的文本,EM_GETSEL消息将返回-1。
2.5 Rich Edit 文本操作
应用程序可以发送消息来获取或者查找Rich Edit控件中的文本。你既可以获取选中区域的文本也可以获取给定范围的文本。
Edit控件中的选中文本,使用EM_GETSELTEXT消息。文本将被拷贝到指定字符数组中。你必须确保数组大小足以容纳选中文本再加上一个终止NULL字符。
获取给定范围的文本,使用EM_GETTEXTRANGE消息。该消息将使用TEXTRANGE结构,用于描述需要获得的文本范围以及用于获取该文本的字符数组指针。在这里,同样的,你必须确保数组大小足以容纳选中文本再加上一个终止NULL字符。
你可以使用EM_FINDTEXT消息在一个Rich
Edit控件中查找字符串。该消息将使用结构,用于描述文本查找范围及需要查找的字符串。你也可以指定诸如是否区分大小写等搜索选项。
2.6 断字与断行
控件调用叫做“断字处理过程”的函数来查找单词间分隔符以及判断何处可以换行。控件在执行自动换行操作时以及处理Ctrl+左箭头和Ctrl+右箭头的组合键时将利用这些信息。应用程序可以通过向Rich
Edit控件发送消息来替换默认的“断字处理过程”,获取断字信息,以及判断一个给定字符属于哪一行。
Edit控件的断字处理过程与Edit控件相似,但是它拥有更多能力。两种控件的断字处理过程均可以识别一个字符是否是一个分隔符,并且能够在找到给定位置的前一个或者后一个字分隔符。分隔符指的是一个标志单词结束的字符,比如空格。在Edit控件中,断字只出现在分隔符之后。
Edit控件的断字处理过程同时将字符组合为字符类,由到0x00的0x0F值来标识。断字可以出现在分隔符之后或者在不同类的字符之间。因此,在字符串“”中,由于字母数字和标点属于不同类别,断字程序将找到两个字分隔符。
一个字符类别可以由0个或者更多的字分隔符标志位组成一个8位的值。当执行自动换行操作时,Rich
Edit控件使用这些分隔符标志位来决定何处可以换行。有如下这些字分隔标志位:
WBF_BREAKAFTER
字符后面可以换行。&&&
WBF_BREAKLINE
该字符为一个分隔符。分隔符标记单词的结束。也可以在分隔符后换行。&&&
WBF_ISWHITE 该字符为一个白空格字符。跟随的白空格字符在换行时不包含在行长度中。
WBF_BREAKAFTER表示允许在该字符后面折行,但是并不标记单词的结束,比如连字符-。
你可以使用EM_SETWORDBREAKPROC消息来替换Rich
Edit控件的默认断字处理过程。获取更多关于断字处理过程的信息,请参阅EditWordBreakProc函数说明。
另外,你可以使用EM_SETWORDBREAKPROCEX消息来替换默认的扩展断字处理过程EditWordBreakProcEx函数。该函数提供有关该文本的更多信息,比如字符集。你可以使用EM_GETWORDBREAKPROCEX消息来获取当前扩展断字处理过程的地址。
你可以使用EM_FINDWORDBREAK消息来查找断字符或者确定一个字符类和断字标志位。控件依次调用其断字处理过程,获取所需信息。
判断给定字符属于哪一行,你可以使用EM_EXLINEFROMCHAR消息。
2.7 Rich Edit 剪贴板操作
应用程序可以粘贴剪贴板中内容到一个Rich Edit控件中,采用最佳可用剪贴板格式或者指定的剪贴板格式。你也可以决定是否一个Rich
Edit控件可以粘贴某种剪贴板格式。
对于一个Edit控件而言,你可以使用WM_COPY或者WM_CUT消息来拷贝或者剪切当前选中内容。同样的,你可以使用WM_PASTE消息将这些剪贴板内容粘贴到一个Rich
Edit控件中。控件将粘贴它所识别的第一个可用格式,这大概是最具描述性的格式。
你可以使用EM_PASTESPECIAL消息来粘贴指定的剪贴板格式。这个消息对具有“特殊粘贴”命令的应用程序很有用,该命令可以让用户选择剪贴板格式。你可以使用EM_CANPASTE消息来决定控件是否识别某种指定的格式。
你也可以使用EM_CANPASTE消息来决定Rich
Edit控件是否识别所有可用的剪贴板格式。该消息在处理WM_INITMENUPOPUP消息时很有用。应用程序可以启用或者屏蔽“粘贴”命令,取决于控件是否可以粘贴任一个可用类型。
Rich Edit控件注册两种剪贴板格式:“富文本格式(RTF)”和一种叫做“RichEdit
文本与对象”的格式。应用程序可以使用RegisterClipboardFormat函数来注册这些格式,其取值为CF_RTF与CF_RETEXTOBJ。
2.8 流(Stream)
你可以使用流(Stream)向Rich
Edit控件传入或者传出数据。流由EDITSTREAM结构所定义,该结构描述一个缓冲区及一个应用程序定义的回调函数。
将数据读入Rich
Edit控件(或者说,数据传入),使用EM_STREAMIN消息。控件将重复调用应用程序的回调函数,该函数每次传入数据的一部分到缓冲区中。
Edit控件内容(或者说,数据传出),你可以使用EM_STREAMOUT消息。控件将重复写入缓冲区然后调用应用程序的回调函数。对于每次调用,回调函数将保存缓冲区中的内容。
你可以向Rich Edit控件发送消息来将其输出重定向到指定设备,比如打印机。你也可以指定一个用于Rich
Text文本格式化的输出设备。
对于特殊设备而言,要格式化Rich
Edit控件中部分内容,你可以使用EM_FORMATRANGE消息。FORMATRANGE结构用于在该消息中描述需要格式化的文本范围以及目标设备的设备场景。
在输出设备文本格式化完成后,你可以使用EM_DISPLAYBAND消息将输出发送至设备。通过反复使用EM_FORMATRANGE和EM_DISPLAYBAND消息,打印Rich
Text控件内容的应用程序可以实现条带化操作。(条带化操作指的是将输出分割为较小部分用于打印目的的操作。)
你可以使用EM_SETTARGETDEVICE消息来指定一个用于Rich
Text文本格式化的目标设备。该消息对于WYSIWYG(所见即所得)模式非常有用,在该模式下应用程序采用默认打印机字体规格而非屏幕字体规格来定位文本。
2.10 无底的Rich Edit 控件
应用程序可以调整Rich Edit控件的大小以便它总是与其内容大小匹配。Rich
Edit控件支持这种所谓的“无底”特性,在任何时候若其内容大小改变,它将向其父窗体发送EN_REQUESTRESIZE通知。
在处理EN_REQUESTRESIZE通知时,应用程序应该调整控件尺寸为REQRESIZE结构所给出的大小。应用程序同样可以变换控件相关的任何信息以适应控件的高度改变。调整控件大小,你可以使用SetWindowPos函数。
你可以使用EM_REQUESTRESIZE消息强制一个无底Rich
Edit控件发送EN_REQUESTRESIZE通知。该消息在处理WM_SIZE消息时很有用。
为了接收EN_REQUESTRESIZE通知,你必须采用EM_SETEVENTMASK消息来启用它。
2.11 各种各样的通知
Rich Edit控件父窗体可以处理通知,这些消息记录影响该控件的事件。Rich
Edit控件支持所有Edit控件所使用的通知,同时具有几个新增的通知。你可以通过设置它的事件掩码(Event Mask)来判断Rich
Edit控件发送到其父窗体的是何种通知。
Edit控件的事件掩码,采用EM_SETEVENTMASK消息。你可以使用EM_GETEVENTMASK消息来获取当前Rich
Edit控件的事件掩码。
Edit控件的父窗体可以通过处理EN_MSGFILTER通知来过滤所有的键盘和鼠标输入。父窗体可以防止键盘和鼠标消息被处理,或者可以通过修改指定的MSGFILTER结构来修改这些消息。
应用程序可以处理EN_PROTECTED通知,用以检测何时用户试图修改受保护的文本。为了置某个范围的文本为受保护状态,你可以设置受保护字符效果。获取更多信息,请参阅文本格式。
你可以通过处理EN_DROPFILES通知来允许用户Drop一个文件到Rich
Edit控件中。指定的ENDROPFILES结构包含了即将被Drop的文件的相关信息。
2.11 不支持的Edit控件的特性
Rich Edit 控件支持绝大多数而并非全部的多行Edit控件的特性。本节列举出Rich
Edit控件所不支持的Edit控件的消息和窗体样式。
下面的消息由Edit控件处理,而不被Rich Edit控件所支持。
不支持的消息
EM_FMTLINES
不支持。&&&
EM_GETHANDLE Rich
Edit控件并非将文本存储为简单的字符数组。&&&
EM_GETMARGINS
不支持。&&&
EM_GETPASSWORDCHAR
不支持ES_PASSWORD样式。&&&
EM_SETHANDLE Rich
Edit控件并非将文本存储为简单的字符数组。&&&
EM_SETMARGINS
不支持。&&&
EM_SETPASSWORDCHAR
不支持ES_PASSWORD样式。&&&
EM_SETRECTNP
不支持。&&&
EM_SETTABSTOPS
采用EM_SETPARAFORMAT消息。&&&
WM_CTLCOLOR
采用EM_SETBKGNDCOLOR消息。&&&
WM_GETFONT 采用EM_GETCHARFORMAT消息。
下面的窗体样式用于多行Edit控件,而不被Rich Edit控件所支持:
ES_LOWERCASE
ES_PASSWORD&&&
ES_OEMCONVERT ES_UPPERCASE
三、Rich Edit 控件参考
3.1 总索引
Rich Text控件相关的消息、通知和结构体分组汇总如下。部分API元素也用于Edit控件。
o CHARFORMAT
o CHARFORMAT2
o EM_GETCHARFORMAT
o EM_GETPARAFORMAT
o EM_GETRECT
o EM_SETBKGNDCOLOR
o EM_SETCHARFORMAT
o EM_SETEVENTMASK
o EM_SETPARAFORMAT
o EM_SETRECT
o PARAFORMAT2
· 选中区域与Hit测试
o CHARRANGE
o EM_CHARFROMPOS
o EM_EXGETSEL
o EM_EXSETSEL
o EM_GETFIRSTVISIBLELINE
o EM_GETSEL
o EM_HIDESELECTION
o EM_POSFROMCHAR
o EM_SELECTIONTYPE
o EM_SETSEL
o EN_SELCHANGE
o SELCHANGE
· 文本操作
o EM_EXLIMITTEXT
o EM_FINDTEXT
o EM_GETLIMITTEXT
o EM_GETSELTEXT
o EM_GETTEXTRANGE
o EM_REPLACESEL
o EM_SETLIMITTEXT
o FINDTEXT
o TEXTRANGE
· 断字与断行
o EM_EXLINEFROMCHAR
o EM_FINDWORDBREAK
o EM_GETWORDBREAKPROC
o EM_SETWORDBREAKPROC
o EM_GETWORDBREAKPROCEX
o EM_SETWORDBREAKPROCEX
o EditWordBreakProcEx
· 行与滚动条
o EM_GETLINE
o EM_GETLINECOUNT
o EM_GETTHUMB
o EM_LINEFROMCHAR
o EM_LINEINDEX
o EM_LINELENGTH
o EM_LINESCROLL
o EM_SCROLL
o EM_SCROLLCARET
· 编辑操作
o EM_CANPASTE
o EM_CANUNDO
o EM_EMPTYUNDOBUFFER
o EM_PASTESPECIAL
o EDITSTREAM
o EM_STREAMIN
o EM_STREAMOUT
o EM_DISPLAYBAND
o EM_FORMATRANGE
o EM_SETTARGETDEVICE
o FORMATRANGE
· 无底Rich Edit 控件
o EM_REQUESTRESIZE
o EN_REQUESTRESIZE
o REQRESIZE
· OLE 接口
o IRichEditOle
o IRichEditOleCallback
o EM_GETEVENTMASK
o EM_GETIMECOLOR
o EM_GETIMEOPTIONS
o EM_GETMODIFY
o EM_GETOPTIONS
o EM_GETPUNCTUATION
o EM_GETWORDWRAPMODE
o EM_SETEVENTMASK
o EM_SETIMECOLOR
o EM_SETIMEOPTIONS
o EM_SETEVENTMASK
o EM_SETMODIFY
o EM_SETREADONLY
o EM_SETOPTIONS
o EM_SETPUNCTUATION
o EM_SETWORDWRAPMODE
o EN_CHANGE
o EN_CORRECTTEXT
o EN_DROPFILES
o EN_ERRSPACE
o EN_HSCROLL
o EN_IMECHANGE
o EN_KILLFOCUS
o EN_MAXTEXT
o EN_MSGFILTER
o EN_OLEOPFAILED
o EN_PROTECTED
o EN_SAVECLIPBOARD
o EN_SETFOCUS
o EN_STOPNOUNDO
o EN_UPDATE
o EN_VSCROLL
o WM_CONTEXTMENU
o WM_CTLCOLOREDIT
o COMPCOLOR
o ENCORRECTTEXT
o ENDROPFILES
o ENOLEOPFAILED
o ENPROTECTED
o ENSAVECLIPBOARD
o PUNCTUATION
o MSGFILTER
3.2 Rich Edit 回调函数
下列回调函数是Rich Edit控件所特有的:
EditStreamCallback&&&
EditWordBreakProcEx
3.2.1 EditStreamCallback
EditStreamCallback函数是一个应用程序定义的回调函数,用于EM_STREAMIN和EM_STREAMOUT消息。它用于将数据传入或者传出一个Rich
Edit控件。EDITSTREAMCALLBACK类型定义了一个指向该回调函数的指针。EditStreamCallback是一个用于该应用程序定义的函数名的占位符。
DWORD CALLBACK EditStreamCallback(
DWORD dwCookie, // application-defined value
LPBYTE pbBuff, // 缓冲区指针
cb,&&&&&&&
&& // 读或写的字节数
*pcb&&&&&&
// 实际传输的字节数的指针
指定EDITSTREAM结构中的dwCookie成员的值。应用程序在发送EM_STREAMIN和EM_STREAMOUT消息时将指定该值。
用于读取或写入的缓冲区指针。对于一个流入(读)操作,回调函数将数据填入该缓冲区,再传入Rich
Edit控件。对于流出(写)操作,缓冲区包含从控件中读取的数据,回调函数负责将其写入存储器中。
指出读取和写入的字节数。
一个变量的指针,回调函数将设置该变量的值为实际读取或写入的字节数。
回调函数返回0表示成功。.
回调函数返回非0值表示发生错误。一旦发生错误,读写操作将终止,Rich
Edit控件将放弃pbBuff缓冲区中的任何数据。如果一个回调函数返回一个非0值,Rich
Edit控件将采用EDITSTREAM结构的dwError成员将该值传回应用程序。
当你发送EM_STREAMIN和EM_STREAMOUT消息到一个Rich
Edit控件时,需要为EDITSTREAM结构的pfnCallback成员指定一个EditStreamCallback函数指针。Rich
Edit控件将不断调用该函数来输出或者输入数据。
当你发送EM_STREAMIN和EM_STREAMOUT消息时,你需要给出一个EDITSTREAM结构的dwCookie成员的值。Rich
Edit控件使用dwCookie参数将该值传递到EditStreamCallback函数中。例如,你可能使用dwCookie来传递一个打开的文件的句柄,回调函数就可以使用该dwCookie句柄来读取和写入文件。
控件不断调用回调函数,每次传递部分数据。控件不断调用回调函数,直至出现如下情况之一为止:
· 回调函数返回一个非0值。
· 回调函数在*pcb参数中返回0值。
· *pcb参数返回的值小于cb参数请求的字节数。
· 发生错误,· 该错误拒绝Rich Edit控件数据的传出或者传入。例如内存溢出状态,· 系统函数失败,·
或者读取缓冲区包含一个无效字符等。
· 对于一个流入操作,· RTF代码包含表示一个RTF块结束的数据。
· 对于一个单行编辑控件的流入操作,· 回调函数读取到一个CRLF。
3.2.2 EditWordBreakProcEx
EditWordBreakProcEx函数是一个应用程序定义的回调函数,用于EM_SETWORDBREAKPROCEX消息。它决定字符在某段给定文本中的字分隔符的字符索引,或者是字符类和字分隔符标志位。EDITWORDBREAKPROCEX类型定义了一个回调函数的指针。EditWordBreakProcEx是一个应用程序定义的函数名的占位符。
LONG EditWordBreakProcEx(
char *pchText,
LONG cchText,&&
BYTE bCharSet,
code&&&&&&&
当前位置的文本的指针。如果code指定要向左移动,则文本为元素pchText[-1]到pchText[-cchText]的文本,pchText[0]未定义。对于其他所有操作,文本指的是pchText[0]到pchText[cchText
- 1]的文本。
由code指定的搜索方向上的缓冲区中的字符数。
文本的字符集。
所执行的断字动作。可用的取值由EM_FINDWORDBREAK消息的code参数所描述。
返回字母分隔符的字符索引值,除非code参数是WB_CLASSIFY和WB_ISDELIMITER值。
应用程序必须安装回调函数,方法是在EM_SETWORDBREAKPROCEX消息中给出回调函数的地址。
3.3 Rich Edit 结构体
下列结构体用于Rich Edit控件:
CHARFORMAT&&&
CHARFORMAT2&&&
CHARRANGE&&&
COMPCOLOR&&&
EDITSTREAM&&&
ENCORRECTTEXT&&&
ENDROPFILES&&&
ENOLEOPFAILED&&&
ENPROTECTED&&&
ENSAVECLIPBOARD&&&
FINDTEXT&&&
FINDTEXTEX&&&
FORMATRANGE&&&
MSGFILTER&&&
PARAFORMAT&&&
PARAFORMAT2&&&
PUNCTUATION&&&
REOBJECT&&&
REPASTESPECIAL&&&
REQRESIZE&&&
SELCHANGE&&&
3.4 Rich Edit 消息
以下消息由Rich Edit控件所独有:
EM_AUTOURLDETECT&&&
EM_CANPASTE&&&
EM_CANREDO&&&
EM_DISPLAYBAND&&&
EM_EXGETSEL&&&
EM_EXLIMITTEXT&&&
EM_EXLINEFROMCHAR&&&
EM_EXSETSEL&&&
EM_FINDTEXT&&&
EM_FINDTEXTEX&&&
EM_FINDWORDBREAK&&&
EM_FORMATRANGE&&&
EM_GETCHARFORMAT&&&
EM_GETEVENTMASK&&&
EM_GETIMECOLOR&&&
EM_GETIMECOMPMODE&&&
EM_GETIMEOPTIONS&&&
EM_GETLANGOPTIONS&&&
EM_GETOLEINTERFACE&&&
EM_GETOPTIONS&&&
EM_GETPARAFORMAT&&&
EM_GETPUNCTUATION&&&
EM_GETREDONAME&&&
EM_GETSELTEXT&&&
EM_GETTEXTMODE&&&
EM_GETTEXTRANGE&&&
EM_GETUNDONAME&&&
EM_GETWORDBREAKPROCEX&&&
EM_GETWORDWRAPMODE&&&
EM_HIDESELECTION&&&
EM_PASTESPECIAL&&&
EM_REDO&&&
EM_REQUESTRESIZE&&&
EM_SELECTIONTYPE&&&
EM_SETBKGNDCOLOR&&&
EM_SETCHARFORMAT&&&
EM_SETEVENTMASK&&&
EM_SETIMECOLOR&&&
EM_SETIMEOPTIONS&&&
EM_SETLANGOPTIONS&&&
EM_SETOLECALLBACK&&&
EM_SETOPTIONS&&&
EM_SETPARAFORMAT&&&
EM_SETPUNCTUATION&&&
EM_SETTARGETDEVICE&&&
EM_SETTEXTMODE&&&
EM_SETUNDOLIMIT&&&
EM_SETWORDBREAKPROCEX&&&
EM_SETWORDWRAPMODE&&&
EM_STOPGROUPTYPING&&&
EM_STREAMIN&&&
EM_STREAMOUT&&&
WM_CONTEXTMENU
3.5 Rich Edit 通知
Rich Edit控件支持绝大多数的Edit控件所使用的通知,同时增加了如下的通知。一个Rich
Edit控件只有在使用EM_SETEVENTMASK消息启用了它之后才能发送下面的通知。
EN_CORRECTTEXT&&&
EN_DROPFILES&&&
EN_IMECHANGE&&&
EN_LINK&&&
EN_MSGFILTER&&&
EN_OLEOPFAILED&&&
EN_PROTECTED&&&
EN_REQUESTRESIZE&&&
EN_SAVECLIPBOARD&&&
EN_SELCHANGE&&&
EN_STOPNOUNDO
3.6 Rich Edit OLE接口
控件支持由OLE所定义的客户端的支持。该控件为大多数的OLE客户端提供完全的支持。它不支持链接到自身内容。客户端负责处理对话框和错误消息、OLE对象的存储处理,以及文档和应用程序窗体级的实时激活支持。客户端可以使用EM_GETOLEINTERFACE消息从Rich
Edit控件获取一个IRichEditOle接口,该接口允许它控制OLE对象。客户端使用EM_SETOLECALLBACK消息注册一个IRichEditOleCallback接口,控件将使用它获取所需接口和存储。
下列OLE接口用于Rich Edit控件:
IRichEditOle&&&
IRichEditOleCallback
3.6.1 IRichEditOle
指定用于Rich Edit控件执行OLE相关操作的接口。IRichEditOle接口有下列方法:
IUnknown 方法
QueryInterface
返回支持的接口的指针。&&&
增加引用计数。&&&
Release 减少引用计数。
IRichEditOle方法
GetClientSite
在创建一个新对象时获取一个可用的IOleClientSite接口。&&&
GetObjectCount 获取Rich
Edit控件中包含的对象数目。&&&
GetLinkCount 获取Rich
Edit控件中链接的对象数目。&&&
GetObject 返回Rich
Edit控件中一个REOBJECT结构描述的对象信息。&&&
InsertObject 将一个对象插入到Rich
Edit控件中。&&&
ConvertObject
将一个对象转换为一个新类型。&&&
ActivateAs
卸载属于旧类的对象,告诉OLE将其看做新类对象,然后重新调入这些对象。&&&
SetHostNames 当对象插入到Rich Edit控件中时,设置一个“Host
Names”给该对象。&&&
SetLinkAvailable
设置对象标志位中的可用链接位的值。&&&
SetDvaspect 设置Rich
Edit控件用于绘制一个对象的特征。&&&
HandsOffStorage 告诉Rich
Edit控件释放其指定对象相关的访问存储器接口。&&&
SaveCompleted 告诉Rich
Edit控件最近的保存操作已经完毕,应该继续存储该对象至不同存储器。&&&
InPlaceDeactivate 告诉Rich
Edit控件立即使当前激活的对象处于非激活状态。&&&
ContextSensitiveHelp 告诉Rich
Edit控件进入或者退出上下文相关帮助模式。&&&
GetClipboardData
获取一个剪贴板对象,用于Edit控件的某一区域。&&&
ImportDataObject 导入一个剪贴板对象至Rich Edit控件,替换当前选中的内容。
3.6.2 IRichEditOleCallback
指定一个用于Rich Edit控件从客户端获取OLE相关信息的接口。Rich Edit
控件的客户端负责实现该接口,并通过EM_SETOLECALLBACK消息将其指派给一个控件。IRichEditOleCallback接口包含如下方法:
IUnknown 方法
QueryInterface
返回支持的接口的指针。&&&
增加引用计数。&&&
Release 减少引用计数。
IRichEditOleCallback 方法
GetNewStorage
为一个粘贴自剪贴板或者从一个RTF流读取的对象提供存储。&&&
GetInPlaceContext
提供应用程序和文件级的接口以及支持原地激活的必需的信息。&&&
ShowContainerUI
告诉应用程序是否显示其用户接口容器。&&&
QueryInsertObject
询问应用程序是否一个对象应该被插入。&&&
DeleteObject 通知某一对象将在Rich
Edit中被删除。&&&
QueryAcceptData
访问一个粘贴或者拖拽,以决定是否其粘贴/拖拽的数据应该被接受。&&&
ContextSensitiveHelp
告诉应用程序应该进入或者退出上下文相关帮助模式。&&&
GetClipboardData
允许客户端支持其自身剪贴板对象。&&&
GetDragDropEffect
允许客户端指定其拖放操作的执行结果。&&&
GetContextMenu 在一个鼠标右键按下事件中,询问应用程序提供一个上下文菜单。
3.7 Rich Edit枚举类型
下列枚举类型用于Rich Edit控件:
TEXTMODE&&&
UNDONAMEID
3.7.1 TEXTMODE
TEXTMODE 枚举类型包含用于表示Rich Edit控件的文本模式的值。EM_SETTEXTMODE 和
EM_GETTEXTMODE m消息将使用这个枚举类型。
typedef enum tagTextMode
TM_PLAINTEXT&&&&&&&
TM_RICHTEXT&&&&&&&&
= 2,&&& //
TM_SINGLELEVELUNDO = 4,
TM_MULTILEVELUNDO&& =
TM_SINGLECODEPAGE&& = 16,
TM_MULTICODEPAGE&&&
} TEXTMODE;
常数 涵义&&&
TM_PLAINTEXT
纯文本模式,这种模式下控件类似标准编辑控件。&&&
TM_RICHTEXT 富文本模式,这种模式下控件具备标准Rich
Edit功能。为默认设置。&&&
TM_SINGLELEVELUNDO
控件只允许撤销Undo队列中的最后一个动作。&&&
TM_MULTILEVELUNDO
控件支持多级撤销操作。为默认属性。使用EM_SETUNDOLIMIT消息来设置撤销操作的最大级数。&&&
TM_SINGLECODEPAGE
不支持。&&&
TM_MULTICODEPAGE 不支持。
3.7.2 UNDONAMEID
UNDONAMEID 枚举类型包含指示Rich Edit控件动作的常数,这些动作可以用于撤销和重做操作。 EM_GETREDONAME
和 EM_GETUNDONAME 将使用该枚举类型作为一个返回值。
typedef enum _undonameid {
UID_UNKNOWN&&& =
UID_TYPING&&&&
UID_DELETE&&&&
UID_DRAGDROP&& = 3,
UID_CUT&&&&&&&
UID_PASTE&&&&&
} UNDONAMEID;
常数 涵义&&&
UID_UNKNOWN
Undo操作类型未知。&&&
UID_TYPING
键入操作。&&&
UID_DELETE
删除操作。&&&
UID_DRAGDROP
拖拽-放下操作。&&&
UID_CUT 剪切操作。
UID_PASTE 粘贴操作。
3.8 Rich Edit 常数
3.8.1 Rich Edit控件样式
下列窗体样式属于Rich Edit控件所独有:
样式 描述&&&
ES_DISABLENOSCROLL
在不需要滚动条时将它们置灰,而非隐藏。&&&
ES_EX_NOCALLOLEINIT
禁止控件在创建时调用OleInitialize函数。仅在对话框模式下有用,因为CreateWindowEx不支持该样式。&&&
禁止输入方式编辑(IME)操作。只对亚洲语言有效。&&&
ES_SAVESEL
在控件失去焦点时保持选定区域。默认情况下,在控件重新获取焦点时将选择所有内容。&&&
ES_SELFIME 指示Rich
Edit控件允许应用程序控制所有的IME操作。只对亚洲语言有效。&&&
ES_SUNKEN 控件显示为下凹边框样式,看起来像是嵌入到其父窗体中。
Windows 95: Windows
95下的应用程序应该使用WS_EX_CLIENTEDGE,而非ES_SUNKEN。&&&
ES_VERTICAL 垂直绘制文本和对象。只对亚洲语言有效。
Rich Edit 控件同样支持下面的Edit控件样式。为了允许多行文本,你就必须指定ES_MULTILINE样式。
ES_AUTOHSCROLL
ES_NOHIDESEL&&&
ES_AUTOVSCROLL
ES_READONLY&&&
ES_RIGHT&&&
ES_WANTRETURN&&&
ES_MULTILINE&&
Rich Edit控件不支持下面的Edit控件样式:
ES_LOWERCASE
ES_PASSWORD&&&
ES_OEMCONVERT ES_UPPERCASE
3.8.2 Rich Edit控件事件掩码标志
事件掩码用于指定一个Rich Edit控件向父窗体发送何种通知。事件掩码可以为0或下列多种取值:
值 涵义&&&
ENM_CHANGE 发送EN_CHANGE
ENM_CORRECTTEXT
发送EN_CORRECTTEXT通知。&&&
ENM_DROPFILES
发送EN_DROPFILES通知。&&&
ENM_KEYEVENTS
发送EN_MSGFILTER键盘事件通知。&&&
ENM_MOUSEEVENTS 发送EN_MSGFILTER 鼠标事件通知。
ENM_PROTECTED
发送EN_PROTECTED通知。&&&
ENM_RESIZEREQUEST
发送EN_REQUESTRESIZE通知。&&&
ENM_SCROLL
发送EN_HSCROLL通知。&&&
ENM_SELCHANGE
发送EN_SELCHANGE通知。&&&
ENM_UPDATE 发送EN_UPDATE通知。
默认事件掩码为ENM_NONE,这种情况下将不会发送任何通知到父窗体。你可以通过ENM_GETEVENTMASK和ENM_SETEVENTMASK消息来获取和设置Rich
Edit控件的事件掩码。
四、参考文献
1、MSDN Library Visual Studio6.0(CHS),我们在MSDN上可以找到最新版本的SDK文档,地址如下:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 word自动换行怎么设置 的文章

 

随机推荐