RichEdit控件參考手冊

 

 

摘要: 本文對Rich Edit控件底層消息機制進行了講解,以期讀者對Windows平臺下的Rich Edit控件有一個更深入的認識,同時對於使用Win32 SDK進行開發的人員具有一定參考價值。因爲文章的初衷是引領VB程序員通過Win32 API調用來擴展VB下的Rich Edit控件的功能,所以對於每個消息的詳細說明和注意事項未作過多說明,感興趣的朋友可以參考Visual Studio下的MSDN Library。

關鍵字:Rich Edit Control、RTF、SDK、MSDN。

一、引言

Rich 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_作爲前綴。

ActiveX 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名稱版本號   

1.0 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隊列中的下一動作的類型名稱。   

EM_REDO 重做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”。

Rich 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控件中通過鼠標和鍵盤來選擇文本。當前選擇內容指的是選中字符的範圍,或者表示沒有字符選中時的插入點位置。應用程序可以獲取選中內容的相關信息,設置當前選中內容,決定當前選中內容何時改變,顯示或者隱藏當前高亮顯示的選中內容等。

確定Rich 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控件中的文本。你既可以獲取選中區域的文本也可以獲取給定範圍的文本。

獲取Rich Edit控件中的選中文本,使用EM_GETSELTEXT消息。文本將被拷貝到指定字符數組中。你必須確保數組大小足以容納選中文本再加上一個終止NULL字符。

獲取給定範圍的文本,使用EM_GETTEXTRANGE消息。該消息將使用TEXTRANGE結構,用於描述需要獲得的文本範圍以及用於獲取該文本的字符數組指針。在這裏,同樣的,你必須確保數組大小足以容納選中文本再加上一個終止NULL字符。

你可以使用EM_FINDTEXT消息在一個Rich Edit控件中查找字符串。該消息將使用結構,用於描述文本查找範圍及需要查找的字符串。你也可以指定諸如是否區分大小寫等搜索選項。

2.6 斷字與斷行

Rich Edit 控件調用叫做“斷字處理過程”的函數來查找單詞間分隔符以及判斷何處可以換行。控件在執行自動換行操作時以及處理Ctrl+左箭頭和Ctrl+右箭頭的組合鍵時將利用這些信息。應用程序可以通過向Rich Edit控件發送消息來替換默認的“斷字處理過程”,獲取斷字信息,以及判斷一個給定字符屬於哪一行。

Rich Edit控件的斷字處理過程與Edit控件相似,但是它擁有更多能力。兩種控件的斷字處理過程均可以識別一個字符是否是一個分隔符,並且能夠在找到給定位置的前一個或者後一個字分隔符。分隔符指的是一個標誌單詞結束的字符,比如空格。在Edit控件中,斷字只出現在分隔符之後。

Rich Edit控件的斷字處理過程同時將字符組合爲字符類,由到0x00的0x0F值來標識。斷字可以出現在分隔符之後或者在不同類的字符之間。因此,在字符串“WIN.COM”中,由於字母數字和標點屬於不同類別,斷字程序將找到兩個字分隔符。

一個字符類別可以由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消息。控件將重複調用應用程序的回調函數,該函數每次傳入數據的一部分到緩衝區中。

保存Rich Edit控件內容(或者說,數據傳出),你可以使用EM_STREAMOUT消息。控件將重複寫入緩衝區然後調用應用程序的回調函數。對於每次調用,回調函數將保存緩衝區中的內容。

2.9 打印

你可以向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控件發送到其父窗體的是何種通知。

設置Rich Edit控件的事件掩碼,採用EM_SETEVENTMASK消息。你可以使用EM_GETEVENTMASK消息來獲取當前Rich Edit控件的事件掩碼。

Rich 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 EM_UNDO

· 流

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, // 緩衝區指針

LONG cb,           // 讀或寫的字節數

LONG *pcb       // 實際傳輸的字節數的指針

);

參數說明

dwCookie

指定EDITSTREAM結構中的dwCookie成員的值。應用程序在發送EM_STREAMIN和EM_STREAMOUT消息時將指定該值。

pbBuff

用於讀取或寫入的緩衝區指針。對於一個流入(讀)操作,回調函數將數據填入該緩衝區,再傳入Rich Edit控件。對於流出(寫)操作,緩衝區包含從控件中讀取的數據,回調函數負責將其寫入存儲器中。

cb

指出讀取和寫入的字節數。

pcb

一個變量的指針,回調函數將設置該變量的值爲實際讀取或寫入的字節數。

返回值

回調函數返回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,

INT code       

);

參數

pchText

當前位置的文本的指針。如果code指定要向左移動,則文本爲元素pchText[-1]到pchText[-cchText]的文本,pchText[0]未定義。對於其他所有操作,文本指的是pchText[0]到pchText[cchText - 1]的文本。

cchText

由code指定的搜索方向上的緩衝區中的字符數。

bCharSet

文本的字符集。

code

所執行的斷字動作。可用的取值由EM_FINDWORDBREAK消息的code參數所描述。

返回值

返回字母分隔符的字符索引值,除非code參數是WB_CLASSIFY和WB_ISDELIMITER值。

備註

應用程序必須安裝回調函數,方法是在EM_SETWORDBREAKPROCEX消息中給出回調函數的地址。

3.3 Rich Edit 結構體

下列結構體用於Rich Edit控件:

 

CHARFORMAT   

CHARFORMAT2   

CHARRANGE   

COMPCOLOR   

EDITSTREAM   

ENCORRECTTEXT   

ENDROPFILES   

ENLINK   

ENOLEOPFAILED   

ENPROTECTED   

ENSAVECLIPBOARD   

FINDTEXT   

FINDTEXTEX   

FORMATRANGE   

MSGFILTER   

PARAFORMAT   

PARAFORMAT2   

PUNCTUATION   

REOBJECT   

REPASTESPECIAL   

REQRESIZE   

SELCHANGE   

TEXTRANGE

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接口

Rich Edit 控件支持由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 返回支持的接口的指針。   

AddRef 增加引用計數。   

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 返回支持的接口的指針。   

AddRef 增加引用計數。   

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        = 1,

    TM_RICHTEXT         = 2,    // 默認值

    TM_SINGLELEVELUNDO = 4,

    TM_MULTILEVELUNDO   = 8,    // 默認值

    TM_SINGLECODEPAGE   = 16,

    TM_MULTICODEPAGE    = 32

} 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    = 0,

    UID_TYPING     = 1,

    UID_DELETE     = 2,

    UID_DRAGDROP   = 3,

    UID_CUT        = 4,

    UID_PASTE      = 5

} 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不支持該樣式。   

ES_NOIME 禁止輸入方式編輯(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_CENTER ES_RIGHT   

ES_LEFT 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文檔,地址如下: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/aboutricheditcontrols.asp

2、Wind32 SDK下的RICHEDIT.H頭文件(2.0版本):包含了絕大多數函數聲明和結構體及常數的C定義。對於其對應的VB聲明,我會在接下來發布。

發佈了7 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章