Rich Edit控件

1,我在一個對話框裏使用了Rich Edit控件後,對話框就不能顯示了,換成一般的Edit控件可以正常顯示,這到底是爲什麼啊(不信可以試試,這個問題害的我調試了好久),請問怎麼解決?還有,如何實現自動換行後設定行寬,就象qq聊天時的那樣,一行到頭就自動換行?

原因:1,如果是在對話框中使用Rich Edit控件,就必須在對話框顯示之前調用AfxInitRichEdit(),要初始化在InitInstance中加入AfxInitRichEdit。

2,2.創建時不要有ES_AUTOHSCROLL, WS_HSCROLL屬性。



Rich Edit 控件 SDK 參考手冊

 

摘要: 本文對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幫助文件中認出EditRichEdit的消息常數,因爲他們均採用EM_作爲前綴。

ActiveX RichTextBox控件將絕大多數的這種消息映射爲其屬性。例如,EM_LIMITTEXTMaxLength屬性相對應。但是你同時會注意到一些感興趣的消息並沒有與之對應的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.03.0

Windows 2000

包含Rich Edit 3.0和一個 Rich Edit 1.0 仿真程序。

Windows NT 4.0

包含Rich Edit 1.02.0

Windows 98

包含Rich Edit 1.02.0

Windows 95

只包含Rich Edit 1.0。不過,Riched20.DLLWindows 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_SETCHARFORMATEM_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_GETSELEM_SETSELEdit控件消息,而非EM_EXGETSELEM_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控件的斷字處理過程同時將字符組合爲字符類,由到0x000x0F值來標識。斷字可以出現在分隔符之後或者在不同類的字符之間。因此,在字符串“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_RTFCF_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_FORMATRANGEEM_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控件。

·         格式化

    • CHARFORMAT
    • CHARFORMAT2
    • EM_GETCHARFORMAT
    • EM_GETPARAFORMAT
    • EM_GETRECT
    • EM_SETBKGNDCOLOR
    • EM_SETCHARFORMAT
    • EM_SETEVENTMASK
    • EM_SETPARAFORMAT
    • EM_SETRECT
    • PARAFORMAT2

·         選中區域與Hit測試

    • CHARRANGE
    • EM_CHARFROMPOS
    • EM_EXGETSEL
    • EM_EXSETSEL
    • EM_GETFIRSTVISIBLELINE
    • EM_GETSEL
    • EM_HIDESELECTION
    • EM_POSFROMCHAR
    • EM_SELECTIONTYPE
    • EM_SETSEL
    • EN_SELCHANGE
    • SELCHANGE

·         文本操作

    • EM_EXLIMITTEXT
    • EM_FINDTEXT
    • EM_GETLIMITTEXT
    • EM_GETSELTEXT
    • EM_GETTEXTRANGE
    • EM_REPLACESEL
    • EM_SETLIMITTEXT
    • FINDTEXT
    • TEXTRANGE

·         斷字與斷行

    • EM_EXLINEFROMCHAR
    • EM_FINDWORDBREAK
    • EM_GETWORDBREAKPROC
    • EM_SETWORDBREAKPROC
    • EM_GETWORDBREAKPROCEX
    • EM_SETWORDBREAKPROCEX
    • EditWordBreakProcEx

·         行與滾動條

·         編輯操作

    • EM_CANPASTE
    • EM_CANUNDO
    • EM_EMPTYUNDOBUFFER
    • EM_PASTESPECIAL
    • EM_UNDO

·        

    • EDITSTREAM
    • EM_STREAMIN
    • EM_STREAMOUT

·         打印

    • EM_DISPLAYBAND
    • EM_FORMATRANGE
    • EM_SETTARGETDEVICE
    • FORMATRANGE

·         無底Rich Edit 控件

    • EM_REQUESTRESIZE
    • EN_REQUESTRESIZE
    • REQRESIZE

·         OLE 接口

    • IRichEditOle
    • IRichEditOleCallback

·         雜項

    • EM_GETEVENTMASK
    • EM_GETIMECOLOR
    • EM_GETIMEOPTIONS
    • EM_GETMODIFY
    • EM_GETOPTIONS
    • EM_GETPUNCTUATION
    • EM_GETWORDWRAPMODE
    • EM_SETEVENTMASK
    • EM_SETIMECOLOR
    • EM_SETIMEOPTIONS
    • EM_SETEVENTMASK
    • EM_SETMODIFY
    • EM_SETREADONLY
    • EM_SETOPTIONS
    • EM_SETPUNCTUATION
    • EM_SETWORDWRAPMODE
    • EN_CHANGE
    • EN_CORRECTTEXT
    • EN_DROPFILES
    • EN_ERRSPACE
    • EN_HSCROLL
    • EN_IMECHANGE
    • EN_KILLFOCUS
    • EN_MAXTEXT
    • EN_MSGFILTER
    • EN_OLEOPFAILED
    • EN_PROTECTED
    • EN_SAVECLIPBOARD
    • EN_SETFOCUS
    • EN_STOPNOUNDO
    • EN_UPDATE
    • EN_VSCROLL
    • WM_CONTEXTMENU
    • WM_CTLCOLOREDIT
    • COMPCOLOR
    • ENCORRECTTEXT
    • ENDROPFILES
    • ENOLEOPFAILED
    • ENPROTECTED
    • ENSAVECLIPBOARD
    • PUNCTUATION
    • MSGFILTER

 3.2 Rich Edit 回調函數

下列回調函數是Rich Edit控件所特有的:

EditStreamCallback

EditWordBreakProcEx

3.2.1 EditStreamCallback

EditStreamCallback函數是一個應用程序定義的回調函數,用於EM_STREAMINEM_STREAMOUT消息。它用於將數據傳入或者傳出一個Rich Edit控件。EDITSTREAMCALLBACK類型定義了一個指向該回調函數的指針。EditStreamCallback是一個用於該應用程序定義的函數名的佔位符。

DWORD CALLBACK EditStreamCallback(
  DWORD dwCookie,             // application-defined value
  LPBYTE pbBuff,                 // 緩衝區指針
  LONG cb,                        // 讀或寫的字節數
  LONG *pcb                     // 實際傳輸的字節數的指針
);

參數說明

dwCookie

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

pbBuff

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

cb

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

pcb

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

返回值

回調函數返回0表示成功。.

回調函數返回非0值表示發生錯誤。一旦發生錯誤,讀寫操作將終止,Rich Edit控件將放棄pbBuff緩衝區中的任何數據。如果一個回調函數返回一個非0值,Rich Edit控件將採用EDITSTREAM結構的dwError成員將該值傳回應用程序。

備註

當你發送EM_STREAMINEM_STREAMOUT消息到一個Rich Edit控件時,需要爲EDITSTREAM結構的pfnCallback成員指定一個EditStreamCallback函數指針。Rich Edit控件將不斷調用該函數來輸出或者輸入數據。

當你發送EM_STREAMINEM_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_CLASSIFYWB_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_GETEVENTMASKENM_SETEVENTMASK消息來獲取和設置Rich Edit控件的事件掩碼。


四、參考文獻

1MSDN 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

2Wind32 SDK下的RICHEDIT.H頭文件(2.0版本):包含了絕大多數函數聲明和結構體及常數的C定義。









在對話框上使用Rich Edit控件前一定要用AfxInitRichEdit()初始化.

1.設置edit只讀屬性
    方法一:
                m_edit1.SetReadOnly(TRUE);
    方法二:
                ::SendMessage(m_edit1.m_hWnd, EM_SETREADONLY, TRUE, 0);


2.判斷edit中光標狀態並得到選中內容(richedit同樣適用)
        int nStart, nEnd;
        CString strTemp;
        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最後添加字符串
        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
http://support.microsoft.com/default.aspx?scid=kb;en-us;220844
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/
http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/


11.richedit插入gif動畫

http://hi.baidu.com/zhanglei_186/blog/item/:void(0);/*1144809701660*/


12.richedit嵌入ole對象
http://support.microsoft.com/kb/141549/en-us


13.使richedit選中內容只讀
http://www.codeguru.com/cpp/controls/richedit/article.php/c2401/


14.打印richedit
http://www.protext.com/MFC/RichEdit3.htm


15.richeidt用於聊天消息窗口
http://www.vckbase.com/document/viewdoc/?id=1087
http://www.codeproject.com/richedit/chatrichedit.asp
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2395/


16.解決richedit的EN_SETFOCUS和EN_KILLFOCUS無響應的問題
http://support.microsoft.com/kb/181664/en-us


17.richedit拼寫檢查
http://www.codeproject.com/com/AutoSpellCheck.asp


18.改變edit背景色
Q117778:How to change the background color of an MFC edit control
http://support.microsoft.com/kb/117778/en-us


19.當edit控件的父窗口屬性是帶標題欄WS_CAPTION和子窗口WS_CHILD時,不能設置焦點SetFocus
Q230587:PRB: Can't Set Focus to an Edit Control When its Parent Is an Inactive Captioned Child Window
http://support.microsoft.com/kb/230587/en-us


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)的例子
http://www.codeproject.com/richedit/COleRichEditCtrl.asp

 

 

對話框上使用Rich Edit控件 - st251256589 - ———Code_Geass———

 

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*) 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

Download demo project - 23 Kb
Download source - 6 Kb


在RichEdit中插入Bitmap

COleDataSource src;
STGMEDIUM sm;
sm.tymed=TYMED_GDI;
sm.hBitmap=hbmp;
sm.pUnkForRelease=NULL;
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); 

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);         //爲將要輸入的內容設定字體 
}

 

在RichEdit中實現超鏈接

在RichEdit中實現超鏈接
責任編輯:admin   在CBuilder上製作 更新日期:2005-8-6
 
首先在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"
                       "網址: http://www.ccrun.com\n"
                       "偶的信箱:\n"
                       "mailto::[email protected] \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);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章