18第三十三課 richedit 控件基礎知識_第1頁
18第三十三課 richedit 控件基礎知識_第2頁
18第三十三課 richedit 控件基礎知識_第3頁
18第三十三課 richedit 控件基礎知識_第4頁
18第三十三課 richedit 控件基礎知識_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

第三十三課RICHEDIT控件基礎知識有很多人要求我提供關(guān)于RICHEDIT控件的指南,經(jīng)過這方面的大量編程實踐,我想我終于可以開寫關(guān)于RICHEDIT控件的指南了。諾,這個就是第一篇RICHEDIT指南。本指南將會描述涉及到RICHEDIT的幾乎所有方面,起碼是我所知道的關(guān)于它的所有方面。因為指南的信息量相當相當?shù)拇?,所以我將它分成了幾個部分,本篇是第一部分。在這篇指南里,你將會了解到什么是RICHEDIT控件,怎樣創(chuàng)建它,怎樣往里面載入數(shù)據(jù)和保存里面的數(shù)據(jù)。例子理論ARICHEDITCONTROLCANBETHOUGHTOFASASOUPEDUPEDITCONTROL它提供了普通簡單EDIT控件所缺少的很多令人合意的功能,譬如可以使用多種字體和字體大小,多級UNDO/REDO,文本搜索,內(nèi)嵌OLE對象,編輯的拖放支持等等。由于RICHEDIT控件有這么多功能,因此它獨存于一個單獨的DLL文件。這個意味著如果你要使用RICHEDIT控件,就不能象使用其他普通控件那樣只調(diào)用INITCOMMONCONTROLS函數(shù)。你必須先使用LOADLIBRARY來載入RICHEDITDLL文件。這里有個問題,就是至今為止RICHEDIT控件共有3個版本,版本1,2和3。下面的表格顯示了每個版本的相應的DLL文件名。DLLNAMERICHEDITVERSIONRICHEDITCLASSNAMERICHED32DLL10RICHEDITRICHED20DLL20RICHEDIT20ARICHED20DLL30RICHEDIT20A你會注意到版本2和3都使用了相同的DLL文件名,而且它們也使用了相同的類名這樣在你想要明確的使用RICHEDIT30的功能的時候就會產(chǎn)生問題到目前為止,我還找到一個正式的方法來區(qū)分版本20和30不過,有個解決方法工作良好,我會在后面演示給你看DATARICHEDITDLLDB“RICHED20DLL“,0DATAHRICHEDITDLLDDCODEINVOKELOADLIBRARY,ADDRRICHEDITDLLMOVHRICHEDITDLL,EAXINVOKEFREELIBRARY,HRICHEDITDLL當RICHEDITDLL文件被載入時,它會注冊RICHEDIT窗口類,因此需要在你創(chuàng)建RICHEDIT控件之前必須先要載入DLLRICHEDIT控件的類名是不同的?,F(xiàn)在你可能會有一個問題要提我怎么樣才能夠知道我要使用哪個版本的RICHEDIT控件如果你不需要使用那些特別的功能,使用最新的版本也不定是最適宜的下面的表格列出了每個RICHEDIT版本提供的功能功能版本10版本20版本30選擇條XXXUNICODE編輯XX字符段落格式XXX文本搜索向前搜索向前/向后搜索向前/向后搜索內(nèi)嵌OLEXXX拖放編輯XXXUNDO/REDO單級多級多級自動URL識別XX加速鍵支持XX非窗口操作XX分行符CRLFCRCR可以模擬10版本ZOOMXPARAGRAPHNUMBERINGXSIMPLETABLEXNORMALANDHEADINGSTYLESXUNDERLINECOLORINGXHIDDENTEXTXFONTBINDINGX上面的表格不是全面的我只是列出了那些重要的功能創(chuàng)建RCHEDIT控件載入DLL文件后,你可以調(diào)用CREATEWINDOWEX來創(chuàng)建RICHEDIT控件,創(chuàng)建控件時你可以使用EDIT控件風格和普通窗口風格,但是ES_LOWERCASE,ES_UPPERCASE和ES_OEMCONVERT風格除外CONSTRICHEDITIDEQU300DATARICHEDITDLLDB“RICHED20DLL“,0RICHEDITCLASSDB“RICHEDIT20A“,0DATAHRICHEDITDLLDDHWNDRICHEDITDDCODEINVOKELOADLIBRARY,ADDRRICHEDITDLLMOVHRICHEDITDLL,EAXINVOKECREATEWINDOWEX,0,ADDRRICHEDITCLASS,WS_VISIBLEORES_MULTILINEORWS_CHILDORWS_VSCROLLORWS_HSCROLL,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,HWND,RICHEDITID,HINSTANCE,0MOVHWNDRICHEDIT,EAX設置缺省的文本和背景顏色在使用EDIT控件時設置文本和背景顏色可能有點問題,但是在RICHEDIT控件中已經(jīng)修正了這個問題要設置RICHEDIT的背景色,你要發(fā)送EM_SETBKGNDCOLOR消息給RICHEDIT控件這個消息具有以下語法WPARAM顏色選項如果是0說明WINDOWS使用LPARAM中的顏色值作為背景色如果該參數(shù)不為0,WINDOWS使用系統(tǒng)背景色因為我們要發(fā)送該消息來改變背景色,所以我們必須令WPARAM為0LPARAM指定要設置的顏色的COLORREF結(jié)構(gòu),僅當WPARAM為0時才有效譬如,如果我要設置背景為純藍色,我需要寫入以下代碼INVOKESENDMESSAGE,HWNDRICHEDIT,EM_SETBKGNDCOLOR,0,0FF0000H要設置文本顏色,RICHEDIT控件提供了另外的新消息,EM_SETCHARFORMAT來做這個工作這個消息控制控件中一段選定的文本或者全部正文的格式這個消息的語法如下WPARAM格式選項SCF_ALL本次操作影響控件中全部文本SCF_SELECTION本次操作僅影響選定的文本SCF_WORDORSCF_SELECTION本次操作僅影響所選定的那個單詞如果選定是空的話,僅將插入點光標設置到指定字的位置SCF_WORD標志必須跟SCF_SELECTION一起使用LPARAMCHARFORMAT或者CHARFORMAT2結(jié)構(gòu)的指針,說明要使用的正文格式CHARFORMAT2只在RICHEDIT20和更高版本才提供這個不是說在RICHEDIT20以后你一定要使用CHARFORMAT2如果你不需要使用到CHARFORMAT2中新加的功能,你仍然可以使用CHARFORMATCHARFORMATASTRUCTCBSIZEDWORDDWMASKDWORDDWEFFECTSDWORDYHEIGHTDWORDYOFFSETDWORDCRTEXTCOLORCOLORREFBCHARSETBYTEBPITCHANDFAMILYBYTESZFACENAMEBYTELF_FACESIZEDUP_WPAD2WORDCHARFORMATAENDSFIELDNAMEDESCRIPTIONCBSIZE該結(jié)構(gòu)的大小RICHEDIT控件使用該域來判斷該結(jié)構(gòu)的版本是CHARFORMAT還是CHARFORMAT2DWMASK位標記,用來指定下面的那些成員是有效的CFM_BOLDDWEFFECTS成語中的CFE_BOLD值是有效的CFM_CHARSETBCHARSET成員是有效的。CFM_COLORCRTEXTCOLOR成員跟DWEFFECTS中的CFE_AUTOCOLOR值是有效的CFM_FACESZFACENAME成員是有效的CFM_ITALICDWEFFECTS成員中的CFE_ITALIC值是有效的CFM_OFFSETYOFFSET成員是有效的CFM_PROTECTEDDWEFFECTS成員中的CFE_PROTECTED值是有效的CYFM_SIZEHEIGHT成員是有效的CFM_STRIKEOUTDWEFFECTS成員中的CFE_STRIKEOUT值是有效的CFM_UNDERLINDWEFFECTS成員中E的CFE_UNDERLINE值是有效的DWEFFECTS字符效果可以是以下值的組合CFE_AUTOCOLOR使用系統(tǒng)正文顏色CFE_BOLD粗體字符CFE_IT斜體字符ALICCFE_STRIKEOUT字符帶刪除線CFE_UNDERLINE字符帶下劃線CFE_PROTECTED字符是受保護的企圖改變字體會產(chǎn)生一個EN_PROTECTED通知消息YHEIGHT字符高度,單位是TWIPS1/1440英寸或者1/20的打印機的打印點YOFFSET字符偏移,單位是TWIPS,從基線算起如果該成員是正值,字符是下標,如果負值,字符是下標CRTEXTCOLOR正文顏色如果指定了CFE_AUTOCOLOR字符效果,這個值會被忽略BCHARSET字符集BPITCHANDFAMILYFONTFAMILYANDPITCHSZFACENAME字體名字,是一個空字符結(jié)尾的字符數(shù)組_WPAD2填充通過檢查這個結(jié)構(gòu),你會發(fā)現(xiàn)我們可以改變正文效果粗體,斜體,刪除線,下劃線,正文顏色CRTEXTCOLOR和字體外觀/大小/字符集值得注意的是CFE_RPOTECTED標志具有該標志的正文會被標志上受保護標志,意味著當用戶試圖改變它時,EN_PROTECTED這個通知消息會被發(fā)送到父窗口同時你可以允許該更改是是否可以進行CHARFORMAT2增加更多的正文風格,象字體權(quán)值,間距,正文背景色,字距調(diào)整等等如果你不需要這些額外的功能,只要使用CHARFORMAT即可要設置正文格式,你必須考慮你想要該格式應用到的正文的范圍RICHEDIT控件引入了字符正文范圍的概念RICHEDIT分派給每個字符一個從0開始數(shù)字值控件中的第一個字符具有數(shù)字ID值為0,第二個為1等等。要說明一個正文范圍,你必須提供給RICHEDIT控件兩個數(shù)值范圍的第一個和最后一個字符的ID值。要跟EM_SETCHARFORMAT一起應用字符格式,你有最多3種選擇1應用于控件中的所有正文。SCF_ALL2應用于當前選定的正文。SCF_SELECTION3應用于當前選定的一個單詞。SCF_WORD或者SCF_SELECTION第一、二種情況是直觀的,最后一個選擇需要一點解釋。如果當前選擇只覆蓋了詞中的一個或多個字符但是不是整個詞,指定SCF_WORDSCF_SELECTION標志將正文格式應用于整個單詞。即使沒有當前選定,只有插入點(光標)位于單詞中,第三種情況下仍然會將正文格式應用到整個單詞中。要使用EM_SETCHARFORMAT,你需要填充CHARFORMAT或者CHARFORMAT2結(jié)構(gòu)的結(jié)果成員。譬如,如果我們要設置正文顏色,需要如下一樣填充CHARFORMAT結(jié)構(gòu)DATACFCHARFORMATCODEMOVCFCBSIZE,SIZEOFCFMOVCFDWMASK,CFM_COLORMOVCFCRTEXTCOLOR,0FF0000HINVOKESENDMESSAGE,HWNDRICHEDIT,EM_SETCHARFORMAT,SCF_ALL,ADDRCF以上的代碼片段設置RICHEDIT控件的正文顏色為純藍色。注意當EM_SETCHARFORMAT發(fā)生時,如果控件中沒有正文,在這個消息之后鍵入的正文將會使用消息EM_SETCHARFORMAT中指定的正文格式。設置正文/保存正文對于那些經(jīng)常使用EDIT控件的人來說,你們肯定對使用WM_GETTEXT/WM_SETTEXT來設置/保存控制中的正文的方法很熟悉。這個方法對RICHEDIT仍然適用,但是如果文件很大的話這個方法不再是最有效的。EDIT控件限制了正文長度,可以輸入最多64K的正文。但是RICHEDIT控件可以接受比這個限制大的多的正文數(shù)據(jù)。要分配一個很大的內(nèi)存塊譬如大約10MB來接受來自來自WM_GETTEXT消息的正文是一件很麻煩的事RICHEDIT控件為此提供了一個新的方法,就是正文流(TEXTSTREAMING)。要設置RICHEDIT文本,你只需給RICHEDIT簡單的提供一個回調(diào)函數(shù)的地址,當一切準備好時,RICHEDIT會調(diào)用回調(diào)函數(shù),并將正文緩沖區(qū)的地址傳遞給它?;卣{(diào)函數(shù)會將要發(fā)送給RICHEDIT的數(shù)據(jù)填入緩沖區(qū)或者將緩沖區(qū)的數(shù)據(jù)讀出,然后等待下一次調(diào)用自到操作完成。范例程序是流入(設置正文)和流出(取出正文)兩者的例子。你將會發(fā)現(xiàn)這個方法更加有效這個緩沖區(qū)是RICHEDIT控件自己提供的,因此數(shù)據(jù)被分成了幾個大塊。這個操作包括兩條消息EM_STREAMIN和EM_STREAMOUT。EM_STREAMIN和EM_STREAMOUT兩者使用同一個語法WPARAM格式選項SF_RTF數(shù)據(jù)是RTF格式。SF_TEXT數(shù)據(jù)是簡單正文格式。SFF_PLAINRTF只有那些對所有語系都共有的關(guān)鍵詞才流入。SFF_SELECTION如果指定這個標志,流操作的目標就是當前選定的正文。如果你將正文流入,當前正文就會被替換,如果是流出,則只有那些當前選定的正文才流出。如果沒有指定這個標志,操作就會影響到控件中的所有正文。SF_UNICODERICHEDIT20或更高版本才提供)指定的是UNICODE正文。LPARAM指向一個EDITSTREAM結(jié)構(gòu),該結(jié)構(gòu)定義如下EDITSTREAMSTRUCTDWCOOKIEDWORDDWERRORDWORDPFNCALLBACKDWORDEDITSTREAMENDSDWCOOKIE應用程序定義的數(shù)值,將會被傳遞給由PFNCALLBACK成員說明的回調(diào)函數(shù)。通常地我們傳遞一些重要的參數(shù)值給回調(diào)函數(shù),譬如流入/流出處理中使用到的文件句柄。DWERROR指示流入(讀)或流出(寫)操作的結(jié)果。0說明沒有錯誤。非0值可以是EDITSTREAMCALLBACK函數(shù)的返回值或者說明控件遇到了錯誤。PFNCALLBACK指向EDITSTREAMCALLBACK函數(shù)的指針,該函數(shù)是由用戶定義,由RICHEDIT調(diào)用來傳輸數(shù)據(jù)的。RICHEDIT將數(shù)據(jù)分開多個部分,重復地調(diào)用該函數(shù),一次一部分地進行數(shù)據(jù)傳輸。EDITSTREAM回調(diào)函數(shù)具有以下定義EDITSTREAMCALLBACKPROTODWCOOKIEDWORD,PBUFFERDWORD,NUMBYTESDWORD,PBYTESTRANSFERREDDWORD你必須在程序中按照以上原型來創(chuàng)建回調(diào)函數(shù)。然后將函數(shù)地址通過EDITSTREAM結(jié)構(gòu)傳遞給EM_STREAMIN或者EM_STREAMOUT。對流入操作設置RICHEDIT控件中的正文DWCOOKIE應用程序定義的數(shù)值,通過EDITSTREAM結(jié)構(gòu)傳遞給EM_STREAMIN。在這里我們幾乎全部都是將用其內(nèi)容來設置RICHEDIT正文的文件的句柄傳給這個參數(shù)。PBUFFER指向RICHEDIT提供的緩沖區(qū)。用來接受回調(diào)函數(shù)中提供的正文數(shù)據(jù)。NUMBYTES本次調(diào)用中你可以寫入緩沖區(qū)PBUFFER的最大正文字節(jié)數(shù)。你必須遵守這個限制,也就是說你發(fā)送的數(shù)據(jù)的大小可以比NUMBYTES指定要小,但是不能大于這個值。你可以將這個數(shù)值當作PBUFFER緩沖區(qū)的大小。PBYTESTRANSFERRED指向一個雙字DWORD,你必須設置這個值來指示你實際上傳輸了多少字節(jié)數(shù)據(jù)到緩沖區(qū)。這個值通常跟NUMBYTES中的值是相等的唯一的例外是當要傳送的數(shù)據(jù)少于緩沖區(qū)提供的大小時,譬如到達文件尾時就是了。對流出操作讀出RICHEDIT控件的正文DWCOOKIE跟流入操作相同我們一般傳遞想要將數(shù)據(jù)寫入的文件的句柄給這個參數(shù)。PBUFFER指向由RICHEDIT提供的緩沖區(qū),里面的是RICHEDIT的正文。要得到其大小,你必須檢查NUMBYTES的知NUMBYTESPBUFFER指向的緩沖區(qū)的的數(shù)據(jù)的大小。PBYTESTRANSFERRED指向一個雙字DWORD,你必須設置這個值來指示你實際上從緩沖區(qū)里讀出了多少字節(jié)數(shù)據(jù)?;卣{(diào)函數(shù)返回0說明操作成功,而且如果還有數(shù)據(jù)需要讀/寫的話,RICHEDIT控件會繼續(xù)調(diào)用它。如果操作中發(fā)生了錯誤,而且你想停止操作的話,你可以返回一個非0值,這樣RICHEDIT就會丟棄PBUFFER指向的數(shù)據(jù)。錯誤/成功返回值會在EDITSTREAM的DWERROR成員中返回,你可以在SENDMESSAGE返回后檢查流操作的錯誤/成功狀態(tài)。例子下面的例子是一個簡單的編輯器,你可以用來打開一個ASM源文件,編輯它,然后保存。它使用了RICHEDIT控件20或者更高的版本386MODELFLAT,STDCALLOPTIONCASEMAPNONEINCLUDEMASM32INCLUDEWINDOWSINCINCLUDEMASM32INCLUDEUSER32INCINCLUDEMASM32INCLUDECOMDLG32INCINCLUDEMASM32INCLUDEGDI32INCINCLUDEMASM32INCLUDEKERNEL32INCINCLUDELIBMASM32LIBGDI32LIBINCLUDELIBMASM32LIBCOMDLG32LIBINCLUDELIBMASM32LIBUSER32LIBINCLUDELIBMASM32LIBKERNEL32LIBWINMAINPROTODWORD,DWORD,DWORD,DWORDCONSTIDR_MAINMENUEQU101IDM_OPENEQU40001IDM_SAVEEQU40002IDM_CLOSEEQU40003IDM_SAVEASEQU40004IDM_EXITEQU40005IDM_COPYEQU40006IDM_CUTEQU40007IDM_PASTEEQU40008IDM_DELETEEQU40009IDM_SELECTALLEQU40010IDM_OPTIONEQU40011IDM_UNDOEQU40012IDM_REDOEQU40013IDD_OPTIONDLGEQU101IDC_BACKCOLORBOXEQU1000IDC_TEXTCOLORBOXEQU1001RICHEDITIDEQU300DATACLASSNAMEDB“ICZEDITCLASS“,0APPNAMEDB“ICZEDITVERSION10“,0RICHEDITDLLDB“RICHED20DLL“,0RICHEDITCLASSDB“RICHEDIT20A“,0NORICHEDITDB“CANNOTFINDRICHED20DLL“,0ASMFILTERSTRINGDB“ASMSOURCECODEASM“,0,“ASM“,0DB“ALLFILES“,0,“,0,0OPENFILEFAILDB“CANNOTOPENTHEFILE“,0WANNASAVEDB“THEDATAINTHECONTROLISMODIFIEDWANTTOSAVEIT“,0FILEOPENEDDDFALSEBACKGROUNDCOLORDD0FFFFFFH缺省為白色TEXTCOLORDD0缺省為黑色DATAHINSTANCEDDHRICHEDITDDHWNDRICHEDITDDFILENAMEDB256DUPALTERNATEFILENAMEDB256DUPCUSTOMCOLORSDD16DUPCODESTARTINVOKEGETMODULEHANDLE,NULLMOVHINSTANCE,EAXINVOKELOADLIBRARY,ADDRRICHEDITDLLIFEAX0MOVHRICHEDIT,EAXINVOKEWINMAIN,HINSTANCE,0,0,SW_SHOWDEFAULTINVOKEFREELIBRARY,HRICHEDITELSEINVOKEMESSAGEBOX,0,ADDRNORICHEDIT,ADDRAPPNAME,MB_OKORMB_ICONERRORENDIFINVOKEEXITPROCESS,EAXWINMAINPROCHINSTDWORD,HPREVINSTDWORD,CMDLINEDWORD,CMDSHOWDWORDLOCALWCWNDCLASSEXLOCALMSGMSGLOCALHWNDDWORDMOVWCCBSIZE,SIZEOFWNDCLASSEXMOVWCSTYLE,CS_HREDRAWORCS_VREDRAWMOVWCLPFNWNDPROC,OFFSETWNDPROCMOVWCCBCLSEXTRA,NULLMOVWCCBWNDEXTRA,NULLPUSHHINSTPOPWCHINSTANCEMOVWCHBRBACKGROUND,COLOR_WINDOW1MOVWCLPSZMENUNAME,IDR_MAINMENUMOVWCLPSZCLASSNAME,OFFSETCLASSNAMEINVOKELOADICON,NULL,IDI_APPLICATIONMOVWCHICON,EAXMOVWCHICONSM,EAXINVOKELOADCURSOR,NULL,IDC_ARROWMOVWCHCURSOR,EAXINVOKEREGISTERCLASSEX,ADDRWCINVOKECREATEWINDOWEX,NULL,ADDRCLASSNAME,ADDRAPPNAME,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,HINST,NULLMOVHWND,EAXINVOKESHOWWINDOW,HWND,SW_SHOWNORMALINVOKEUPDATEWINDOW,HWNDWHILETRUEINVOKEGETMESSAGE,ADDRMSG,0,0,0BREAKIFEAXINVOKETRANSLATEMESSAGE,ADDRMSGINVOKEDISPATCHMESSAGE,ADDRMSGENDWMOVEAX,MSGWPARAMRETWINMAINENDPSTREAMINPROCPROCHFILEDWORD,PBUFFERDWORD,NUMBYTESDWORD,PBYTESREADDWORDINVOKEREADFILE,HFILE,PBUFFER,NUMBYTES,PBYTESREAD,0XOREAX,1RETSTREAMINPROCENDPSTREAMOUTPROCPROCHFILEDWORD,PBUFFERDWORD,NUMBYTESDWORD,PBYTESWRITTENDWORDINVOKEWRITEFILE,HFILE,PBUFFER,NUMBYTES,PBYTESWRITTEN,0XOREAX,1RETSTREAMOUTPROCENDPCHECKMODIFYSTATEPROCHWNDDWORDINVOKESENDMESSAGE,HWNDRICHEDIT,EM_GETMODIFY,0,0IFEAX0INVOKEMESSAGEBOX,HWND,ADDRWANNASAVE,ADDRAPPNAME,MB_YESNOCANCELIFEAXIDYESINVOKESENDMESSAGE,HWND,WM_COMMAND,IDM_SAVE,0ELSEIFEAXIDCANCELMOVEAX,FALSERETENDIFENDIFMOVEAX,TRUERETCHECKMODIFYSTATEENDPSETCOLORPROCLOCALCFMCHARFORMATINVOKESENDMESSAGE,HWNDRICHEDIT,EM_SETBKGNDCOLOR,0,BACKGROUNDCOLORINVOKERTLZEROMEMORY,ADDRCFM,SIZEOFCFMMOVCFMCBSIZE,SIZEOFCFMMOVCFMDWMASK,CFM_COLORPUSHTEXTCOLORPOPCFMCRTEXTCOLORINVOKESENDMESSAGE,HWNDRICHEDIT,EM_SETCHARFORMAT,SCF_ALL,ADDRCFMRETSETCOLORENDPOPTIONPROCPROCHWNDDWORD,UMSGDWORD,WPARAMDWORD,LPARAMDWORDLOCALCLRCHOOSECOLORIFUMSGWM_INITDIALOGELSEIFUMSGWM_COMMANDMOVEAX,WPARAMSHREAX,16IFAXBN_CLICKEDMOVEAX,WPARAMIFAXIDCANCELINVOKESENDMESSAGE,HWND,WM_CLOSE,0,0ELSEIFAXIDC_BACKCOLORBOXINVOKERTLZEROMEMORY,ADDRCLR,SIZEOFCLRMOVCLRLSTRUCTSIZE,SIZEOFCLRPUSHHWNDPOPCLRHWNDOWNERPUSHHINSTANCEPOPCLRHINSTANCEPUSHBACKGROUNDCOLORPOPCLRRGBRESULTMOVCLRLPCUSTCOLORS,OFFSETCUSTOMCOLORSMOVCLRFLAGS,CC_ANYCOLORORCC_RGBINITINVOKECHOOSECOLOR,ADDRCLRIFEAX0PUSHCLRRGBRESULTPOPBACKGROUNDCOLORINVOKEGETDLGITEM,HWND,IDC_BACKCOLORBOXINVOKEINVALIDATERECT,EAX,0,TRUEENDIFELSEIFAXIDC_TEXTCOLORBOXINVOKERTLZEROMEMORY,ADDRCLR,SIZEOFCLRMOVCLRLSTRUCTSIZE,SIZEOFCLRPUSHHWNDPOPCLRHWNDOWNERPUSHHINSTANCEPOPCLRHINSTANCEPUSHTEXTCOLORPOPCLRRGBRESULTMOVCLRLPCUSTCOLORS,OFFSETCUSTOMCOLORSMOVCLRFLAGS,CC_ANYCOLORORCC_RGBINITINVOKECHOOSECOLOR,ADDRCLRIFEAX0PUSHCLRRGBRESULTPOPTEXTCOLORINVOKEGETDLGITEM,HWND,IDC_TEXTCOLORBOXINVOKEINVALIDATERECT,EAX,0,TRUEENDIFELSEIFAXIDOK保存RICHEDIT控件的修改狀態(tài),因為更改正文顏色時改變了RICHEDIT控件的修改狀態(tài)。INVOKESENDMESSAGE,HWNDRICHEDIT,EM_GETMODIFY,0,0PUSHEAXINVOKESETCOLORPOPEAXINVOKESENDMESSAGE,HWNDRICHEDIT,EM_SETMODIFY,EAX,0INVOKEENDDIALOG,HWND,0ENDIFENDIFELSEIFUMSGWM_CTLCOLORSTATICINVOKEGETDLGITEM,HWND,IDC_BACKCOLORBOXIFEAXLPARAMINVOKECREATESOLIDBRUSH,BACKGROUNDCOLORRETELSEINVOKEGETDLGITEM,HWND,IDC_TEXTCOLORBOXIFEAXLPARAMINVOKECREATESOLIDBRUSH,TEXTCOLORRETENDIFENDIFMOVEAX,FALSERETELSEIFUMSGWM_CLOSEINVOKEENDDIALOG,HWND,0ELSEMOVEAX,FALSERETENDIFMOVEAX,TRUERETOPTIONPROCENDPWNDPROCPROCHWNDDWORD,UMSGDWORD,WPARAMDWORD,LPARAMDWORDLOCALCHRGCHARRANGELOCALOFNOPENFILENAMELOCALBUFFER256BYTELOCALEDITSTREAMEDITSTREAMLOCALHFILEDWORDIFUMSGWM_CREATEINVOKECREATEWINDOWEX,WS_EX_CLIENTEDGE,ADDRRICHEDITCLASS,0,WS_CHILDORWS_VISIBLEORES_MULTILINEORWS_VSCROLLORWS_HSCROLLORES_NOHIDESEL,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,HWND,RICHEDITID,HINSTANCE,0MOVHWNDRICHEDIT,EAX設置正文長度限制,缺省是64KINVOKESENDMESSAGE,HWNDRICHEDIT,EM_LIMITTEXT,1,0SETTHEDEFAULTTEXT/BACKGROUNDCOLORINVOKESETCOLORINVOKESENDMESSAGE,HWNDRICHEDIT,EM_SETMODIFY,FALSE,0INVOKESENDMESSAGE,HWNDRICHEDIT,EM_EMPTYUNDOBUFFER,0,0ELSEIFUMSGWM_INITMENUPOPUPMOVEAX,LPARAMIFAX0FILEMENUIFFILEOPENEDTRUEAFILEISALREADYOPENEDINVOKEENABLEMENUITEM,WPARAM,IDM_OPEN,MF_GRAYEDINVOKEENABLEMENUITEM,WPARAM,IDM_CLOSE,MF_ENABLEDINVOKEENABLEMENUITEM,WPARAM,IDM_SAVE,MF_ENABLEDINVOKEENABLEMENUITEM,WPARAM,IDM_SAVEAS,MF_ENABLEDELSEINVOKEENABLEMENUITEM,WPARAM,IDM_OPEN,MF_ENABLEDINVOKEENABLEMENUITEM,WPARAM,IDM_CLOSE,MF_GRAYEDINVOKEENABLEMENUITEM,WPARAM,IDM_SAVE,MF_GRAYEDINVOKEENABLEMENUITEM,WPARAM,IDM_SAVEAS,MF_GRAYEDENDIFELSEIFAX1EDIT菜單檢查剪貼板里是否有正文,如果有的話我們就使能PASTE菜單項。INVOKESENDMESSAGE,HWNDRICHEDIT,EM_CANPASTE,CF_TEXT,0IFEAX0NOTEXTINTHECLIPBOARDINVOKEENABLEMENUITEM,WPARAM,IDM_PASTE,MF_GRAYEDELSEINVOKEENABLEMENUITEM,WPARAM,IDM_PASTE,MF_ENABLEDENDIF檢查UNDO隊列時是否為空INVOKESENDMESSAGE,HWNDRICHEDIT,EM_CANUNDO,0,0IFEAX0INVOKEENABLEMENUITEM,WPARAM,IDM_UNDO,MF_GRAYEDELSEINVOKEENABLEMENUITEM,WPARAM,IDM_UNDO,MF_ENABLEDENDIF檢查REDO隊列時是否為空INVOKESENDMESSAGE,HWNDRICHEDIT,EM_CANREDO,0,0IFEAX0INVOKEENABLEMENUITEM,WPARAM,IDM_REDO,MF_GRAYEDELSEINVOKEENABLEMENUITEM,WPARAM,IDM_REDO,MF_ENABLEDENDIF檢查RICHEDIT控件中是否有當前選定正文,有的話就使能CUT/COPY/DELETE菜單項。INVOKESENDMESSAGE,HWNDRICHEDIT,EM_EXGETSEL,0,ADDRCHRGMOVEAX,CHRGCPMINIFEAXCHRGCPMAX沒有當前選定INVOKEENABLEMENUITEM,WPARAM,IDM_COPY,MF_GRAYEDINVOKEENABLEMENUITEM,WPARAM,IDM_CUT,MF_GRAYEDINVOKEENABLEMENUITEM,WPARAM,IDM_DELETE,MF_GRAYEDELSEINVOKEENABLEMENUITEM,WPARAM,IDM_COPY,MF_ENABLEDINVOKEENABLEMENUITEM,WPARAM,IDM_CUT,MF_ENABLEDINVOKEENABLEMENUITEM,WPARAM,IDM_DELETE,MF_ENABLEDENDIFENDIFELSEIFUMSGWM_COMMANDIFLPARAM0命令菜單MOVEAX,WPARAMIFAXIDM_OPENINVOKERTLZEROMEMORY,ADDROFN,SIZEOFOFNMOVOFNLSTRUCTSIZE,SIZEOFOFNPUSHHWNDPOPOFNHWNDOWNERPUSHHINSTANCEPOPOFNHINSTANCEMOVOFNLPSTRFILTER,OFFSETASMFILTERSTRINGMOVOFNLPSTRFILE,OFFSETFILENAMEMOVBYTEPTRFILENAME,0MOVOFNNMAXFILE,SIZEOFFILENAMEMOVOFNFLAGS,OFN_FILEMUSTEXISTOROFN_HIDEREADONLYOROFN_PATHMUSTEXISTINVOKEGETOPENFILENAME,ADDROFNIFEAX0INVOKECREATEFILE,ADDRFILENAME,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0IFEAXINVALID_HANDLE_VALUEMOVHFILE,EAX將正文流入RICHEDIT控件。MOVEDITSTREAMDWCOOKIE,EAXMOVEDITSTREAMPFNCALLBACK,OFFSETSTREAMINPROCINVOKESENDMESSAGE,HWNDRICHEDIT,EM_STREAMIN,SF_TEXT,ADDREDITSTREAM初始化修改狀態(tài)為FALSEINVOKESENDMESSAGE,HWNDRICHEDIT,EM_SETMODIFY,FALSE,0INVOKECLOSEHANDLE,HFILEMOVFILEOPENED,TRUEELSEINVOKEMESSAGEBOX,HWND,ADDROPENFILEFAIL,ADDRAPPNAME,MB_OKORMB_ICONERRORENDIFENDIFELSEIFAXIDM_CLOSEINVOKECHECKMODIFYSTATE,HWNDIFEAXTRUEINVOKESETWINDOWTEXT,HWNDRICHEDIT,0MOVFILEOPENED,FALSEENDIFELSEIFAXIDM_SAVEINVOKECREATEFILE,ADDRFILENAME,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0IFEAXINVALID_HANDLE_VALUEMOVHFILE,EAX將RICHEDIT中的正文流出到文件中。MOVEDITSTREAMDWCOOKIE,EAXMOVEDITSTREAMPFNCALLBACK,OFFSETSTREAMOUTPROCINVOKESENDMESSAGE,HWNDRICHEDIT,EM_STREAMOUT,SF_TEXT,ADDREDITSTREAM初始化修改狀態(tài)為FALSEINVOKESENDMESSAGE,HWNDRICHEDIT,EM_SETMODIFY,FALSE,0INVOKECLOSEHANDLE,HFILEELSEINVOKEMESSAGEBOX,HWND,ADDROPENFILEFAIL,ADDRAPPNAME,MB_OKORMB_ICONERRORENDIFELSEIFAXIDM_COPYINVOKESENDMESSAGE,HWNDRICHEDIT,WM_COPY,0,0ELSEIFAXIDM_CUTINVOKESENDMESSAGE,HWNDRICHEDIT,WM_CUT,0,0ELSEIFAXIDM_PASTEINVOKESENDMESSAGE,HWNDRICHEDIT,WM_PASTE,0,0ELSEIFAXIDM_DELETEINVOKESENDMESSAGE,HWNDRICHEDIT,EM_REPLACESEL,TRUE,0ELSEIFAXIDM_SELECTALLMOVCHRGCPMIN,0MOVCHRGCPMAX,1INVOKESENDMESSAGE,HWNDRICHEDIT,EM_EXSETSEL,0,ADDRCHRGELSEIFAXIDM_UNDOINVOKESENDMESSAGE,HWNDRICHEDIT,EM_UNDO,0,0ELSEIFAXIDM_REDOINVOKESENDMESSAGE,HWNDRICHEDIT,EM_REDO,0,0ELSEIFAXIDM_OPTIONINVOKEDIALOGBOXPARAM,HINSTANCE,IDD_OPTIONDLG,HWND,ADDROPTIONPROC,0ELSEIFAXIDM_SAVEASINVOKERTLZEROMEMORY,ADDROFN,SIZEOFOFNMOVOFNLSTRUCTSIZE,SIZEOFOFNPUSHHWNDPOPOFNHWNDOWNERPUSHHINSTANCEPOPOFNHINSTANCEMOVOFNLPSTRFILTER,OFFSETASMFILTERSTRINGMOVOFNLPSTRFILE,OFFSETALTERNATEFILENAMEMOVBYTEPTRALTERNATEFILENAME,0MOVOFNNMAXFILE,SIZEOFALTERNATEFILENAMEMOVOFNFLAGS,OFN_FILEMUSTEXISTOROFN_HIDEREADONLYOROFN_PATHMUSTEXISTINVOKEGETSAVEFILENAME,ADDROFNIFEAX0INVOKECREATEFILE,ADDRALTERNATEFILENAME,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0IFEAXINVALID_HANDLE_VALUEJMPBENDIFENDIFELSEIFAXIDM_EXITINVOKESENDMESSAGE,HWND,WM_CLOSE,0,0ENDIFENDIFELSEIFUMSGWM_CLOSEINVOKECHECKMODIFYSTATE,HWNDIFEAXTRUEINVOKEDESTROYWINDOW,HWNDENDIFELSEIFUMSGWM_SIZEMOVEAX,LPARAMMOVEDX,EAXANDEAX,0FFFFHSHREDX,16INVOKEMOVEWINDOW,HWNDRICHEDIT,0,0,EAX,EDX,TRUEELSEIFUMSGWM_DESTROYINVOKEPOSTQUITMESSAGE,NULLELSEINVOKEDEFWINDOWPROC,HWND,UMSG,WPARAM,LPARAMRETENDIFXOREAX,EAXRETWNDPROCENDPENDSTART資源文件INCLUDE“RESOURCEH“DEFINEIDR_MAINMENU101DEFINEIDD_OPTIONDLG101DEFINEIDC_BACKCOLORBOX1000DEFINEIDC_TEXTCOLORBOX1001DEFINEIDM_OPEN40001DEFINEIDM_SAVE40002DEFINEIDM_CLOSE40003DEFINEIDM_SAVEAS40004DEFINEIDM_EXIT40005DEFINEIDM_COPY40006DEFINEIDM_CUT40007DEFINEIDM_PASTE40008DEFINEIDM_DELETE40009DEFINEIDM_SELECTALL40010DEFINEIDM_OPTION40011DEFINEIDM_UNDO40012DEFINEIDM_REDO40013IDR_MAINMENUMENUDISCARDABLEBEGINPOPUP“FILE菜單IFFILEOPENEDTRUE已經(jīng)打開了一個文件INVOKEENABLEMENUITEM,WPARAM,IDM_OPEN,MF_GRAYEDINVOKEENABLEMENUITEM,WPARAM,IDM_CLOSE,MF_ENABLEDINVOKEENABLEMENUITEM,WPARAM,IDM_SAVE,MF_ENABLEDINVOKEENABLEMENUITEM,WPARAM,IDM_SAVEAS,MF_ENABLEDELSEINVOKEENABLEMENUITEM,WPARAM,IDM_OPEN,MF_ENABLEDINVOKEENABLEMENUITEM,WPARAM,IDM_CLOSE,MF_GRAYEDINVOKEENABLEMENUITEM,WPARAM,IDM_SAVE,MF_GRAYEDINVOKEENABLEMENUITEM,WPARAM,IDM_SAVEAS,MF_GRAYEDENDIF正如你所見的,如果有一個文件已經(jīng)打開了,我們將OPEN菜單項變灰禁止并將其他菜單項都使能。跟TRUE值相反的是FILEOPENED值為FALSE在這種情況下的EDIT菜單條我們需要先檢查RICHEDIT控件/剪貼板的狀態(tài)。INVOKESENDMESSAGE,HWNDRICHEDIT,EM_CANPASTE,CF_TEXT,0IFEAX0剪貼板里沒有正文INVOKEENABLEMENUITEM,WPARAM,IDM_PASTE,MF_GRAYEDELSEINVOKEENABLEMENUITEM,WPARAM,IDM_PASTE,MF_ENABLEDENDIF我們首先發(fā)送EM_CANPASTE消息,來檢查剪貼板里是否存在可用的正文。如果有的話,SENDMESSAGE返回TRUE,我們就將PASTE菜單項使能。如果沒有的話,我們將該菜單項變灰禁止。INVOKESENDMESSAGE,HWNDRICHEDIT,EM_CANUNDO,0,0IFEAX0INVOKEENABLEMENUITEM,WPARAM,IDM_UNDO,MF_GRAYEDELSEINVOKEENABLEMENUITEM,WPARAM,IDM_UNDO,MF_ENABLEDENDIF跟著,我們通過發(fā)送EM_CANUNDO消息來檢查UNDO緩沖區(qū)是否為空,如果不空,SENDMESSAGE返回TRUE,我們就使能UNDO菜單項。INVOKESENDMESSAGE,HWNDRICHEDIT,EM_CANREDO,0,0IFEAX0INVOKEENABLEMENUITEM,WPARAM,IDM_REDO,MF_GRAYEDELSEINVOKEENABLEMENUITEM,WPARAM,IDM_REDO,MF_ENABLEDENDIF我們通過發(fā)送EM_CANREDO消息給RICHEDIT控件來檢查REDO緩沖區(qū)。如果不空的話,SENDMESSAGE返回TRUE,我們就使

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論