18第三十三课 richedit 控件基础知识_第1页
18第三十三课 richedit 控件基础知识_第2页
18第三十三课 richedit 控件基础知识_第3页
18第三十三课 richedit 控件基础知识_第4页
18第三十三课 richedit 控件基础知识_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三十三课RICHEDIT控件基础知识有很多人要求我提供关于RICHEDIT控件的指南,经过这方面的大量编程实践,我想我终于可以开写关于RICHEDIT控件的指南了。诺,这个就是第一篇RICHEDIT指南。本指南将会描述涉及到RICHEDIT的几乎所有方面,起码是我所知道的关于它的所有方面。因为指南的信息量相当相当的大,所以我将它分成了几个部分,本篇是第一部分。在这篇指南里,你将会了解到什么是RICHEDIT控件,怎样创建它,怎样往里面载入数据和保存里面的数据。例子理论ARICHEDITCONTROLCANBETHOUGHTOFASASOUPEDUPEDITCONTROL它提供了普通简单EDIT控件所缺少的很多令人合意的功能,譬如可以使用多种字体和字体大小,多级UNDO/REDO,文本搜索,内嵌OLE对象,编辑的拖放支持等等。由于RICHEDIT控件有这么多功能,因此它独存于一个单独的DLL文件。这个意味着如果你要使用RICHEDIT控件,就不能象使用其他普通控件那样只调用INITCOMMONCONTROLS函数。你必须先使用LOADLIBRARY来载入RICHEDITDLL文件。这里有个问题,就是至今为止RICHEDIT控件共有3个版本,版本1,2和3。下面的表格显示了每个版本的相应的DLL文件名。DLLNAMERICHEDITVERSIONRICHEDITCLASSNAMERICHED32DLL10RICHEDITRICHED20DLL20RICHEDIT20ARICHED20DLL30RICHEDIT20A你会注意到版本2和3都使用了相同的DLL文件名,而且它们也使用了相同的类名这样在你想要明确的使用RICHEDIT30的功能的时候就会产生问题到目前为止,我还找到一个正式的方法来区分版本20和30不过,有个解决方法工作良好,我会在后面演示给你看DATARICHEDITDLLDB“RICHED20DLL“,0DATAHRICHEDITDLLDDCODEINVOKELOADLIBRARY,ADDRRICHEDITDLLMOVHRICHEDITDLL,EAXINVOKEFREELIBRARY,HRICHEDITDLL当RICHEDITDLL文件被载入时,它会注册RICHEDIT窗口类,因此需要在你创建RICHEDIT控件之前必须先要载入DLLRICHEDIT控件的类名是不同的。现在你可能会有一个问题要提我怎么样才能够知道我要使用哪个版本的RICHEDIT控件如果你不需要使用那些特别的功能,使用最新的版本也不定是最适宜的下面的表格列出了每个RICHEDIT版本提供的功能功能版本10版本20版本30选择条XXXUNICODE编辑XX字符段落格式XXX文本搜索向前搜索向前/向后搜索向前/向后搜索内嵌OLEXXX拖放编辑XXXUNDO/REDO单级多级多级自动URL识别XX加速键支持XX非窗口操作XX分行符CRLFCRCR可以模拟10版本ZOOMXPARAGRAPHNUMBERINGXSIMPLETABLEXNORMALANDHEADINGSTYLESXUNDERLINECOLORINGXHIDDENTEXTXFONTBINDINGX上面的表格不是全面的我只是列出了那些重要的功能创建RCHEDIT控件载入DLL文件后,你可以调用CREATEWINDOWEX来创建RICHEDIT控件,创建控件时你可以使用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控件中已经修正了这个问题要设置RICHEDIT的背景色,你要发送EM_SETBKGNDCOLOR消息给RICHEDIT控件这个消息具有以下语法WPARAM颜色选项如果是0说明WINDOWS使用LPARAM中的颜色值作为背景色如果该参数不为0,WINDOWS使用系统背景色因为我们要发送该消息来改变背景色,所以我们必须令WPARAM为0LPARAM指定要设置的颜色的COLORREF结构,仅当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结构的指针,说明要使用的正文格式CHARFORMAT2只在RICHEDIT20和更高版本才提供这个不是说在RICHEDIT20以后你一定要使用CHARFORMAT2如果你不需要使用到CHARFORMAT2中新加的功能,你仍然可以使用CHARFORMATCHARFORMATASTRUCTCBSIZEDWORDDWMASKDWORDDWEFFECTSDWORDYHEIGHTDWORDYOFFSETDWORDCRTEXTCOLORCOLORREFBCHARSETBYTEBPITCHANDFAMILYBYTESZFACENAMEBYTELF_FACESIZEDUP_WPAD2WORDCHARFORMATAENDSFIELDNAMEDESCRIPTIONCBSIZE该结构的大小RICHEDIT控件使用该域来判断该结构的版本是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使用系统正文颜色CFE_BOLD粗体字符CFE_IT斜体字符ALICCFE_STRIKEOUT字符带删除线CFE_UNDERLINE字符带下划线CFE_PROTECTED字符是受保护的企图改变字体会产生一个EN_PROTECTED通知消息YHEIGHT字符高度,单位是TWIPS1/1440英寸或者1/20的打印机的打印点YOFFSET字符偏移,单位是TWIPS,从基线算起如果该成员是正值,字符是下标,如果负值,字符是下标CRTEXTCOLOR正文颜色如果指定了CFE_AUTOCOLOR字符效果,这个值会被忽略BCHARSET字符集BPITCHANDFAMILYFONTFAMILYANDPITCHSZFACENAME字体名字,是一个空字符结尾的字符数组_WPAD2填充通过检查这个结构,你会发现我们可以改变正文效果粗体,斜体,删除线,下划线,正文颜色CRTEXTCOLOR和字体外观/大小/字符集值得注意的是CFE_RPOTECTED标志具有该标志的正文会被标志上受保护标志,意味着当用户试图改变它时,EN_PROTECTED这个通知消息会被发送到父窗口同时你可以允许该更改是是否可以进行CHARFORMAT2增加更多的正文风格,象字体权值,间距,正文背景色,字距调整等等如果你不需要这些额外的功能,只要使用CHARFORMAT即可要设置正文格式,你必须考虑你想要该格式应用到的正文的范围RICHEDIT控件引入了字符正文范围的概念RICHEDIT分派给每个字符一个从0开始数字值控件中的第一个字符具有数字ID值为0,第二个为1等等。要说明一个正文范围,你必须提供给RICHEDIT控件两个数值范围的第一个和最后一个字符的ID值。要跟EM_SETCHARFORMAT一起应用字符格式,你有最多3种选择1应用于控件中的所有正文。SCF_ALL2应用于当前选定的正文。SCF_SELECTION3应用于当前选定的一个单词。SCF_WORD或者SCF_SELECTION第一、二种情况是直观的,最后一个选择需要一点解释。如果当前选择只覆盖了词中的一个或多个字符但是不是整个词,指定SCF_WORDSCF_SELECTION标志将正文格式应用于整个单词。即使没有当前选定,只有插入点(光标)位于单词中,第三种情况下仍然会将正文格式应用到整个单词中。要使用EM_SETCHARFORMAT,你需要填充CHARFORMAT或者CHARFORMAT2结构的结果成员。譬如,如果我们要设置正文颜色,需要如下一样填充CHARFORMAT结构DATACFCHARFORMATCODEMOVCFCBSIZE,SIZEOFCFMOVCFDWMASK,CFM_COLORMOVCFCRTEXTCOLOR,0FF0000HINVOKESENDMESSAGE,HWNDRICHEDIT,EM_SETCHARFORMAT,SCF_ALL,ADDRCF以上的代码片段设置RICHEDIT控件的正文颜色为纯蓝色。注意当EM_SETCHARFORMAT发生时,如果控件中没有正文,在这个消息之后键入的正文将会使用消息EM_SETCHARFORMAT中指定的正文格式。设置正文/保存正文对于那些经常使用EDIT控件的人来说,你们肯定对使用WM_GETTEXT/WM_SETTEXT来设置/保存控制中的正文的方法很熟悉。这个方法对RICHEDIT仍然适用,但是如果文件很大的话这个方法不再是最有效的。EDIT控件限制了正文长度,可以输入最多64K的正文。但是RICHEDIT控件可以接受比这个限制大的多的正文数据。要分配一个很大的内存块譬如大约10MB来接受来自来自WM_GETTEXT消息的正文是一件很麻烦的事RICHEDIT控件为此提供了一个新的方法,就是正文流(TEXTSTREAMING)。要设置RICHEDIT文本,你只需给RICHEDIT简单的提供一个回调函数的地址,当一切准备好时,RICHEDIT会调用回调函数,并将正文缓冲区的地址传递给它。回调函数会将要发送给RICHEDIT的数据填入缓冲区或者将缓冲区的数据读出,然后等待下一次调用自到操作完成。范例程序是流入(设置正文)和流出(取出正文)两者的例子。你将会发现这个方法更加有效这个缓冲区是RICHEDIT控件自己提供的,因此数据被分成了几个大块。这个操作包括两条消息EM_STREAMIN和EM_STREAMOUT。EM_STREAMIN和EM_STREAMOUT两者使用同一个语法WPARAM格式选项SF_RTF数据是RTF格式。SF_TEXT数据是简单正文格式。SFF_PLAINRTF只有那些对所有语系都共有的关键词才流入。SFF_SELECTION如果指定这个标志,流操作的目标就是当前选定的正文。如果你将正文流入,当前正文就会被替换,如果是流出,则只有那些当前选定的正文才流出。如果没有指定这个标志,操作就会影响到控件中的所有正文。SF_UNICODERICHEDIT20或更高版本才提供)指定的是UNICODE正文。LPARAM指向一个EDITSTREAM结构,该结构定义如下EDITSTREAMSTRUCTDWCOOKIEDWORDDWERRORDWORDPFNCALLBACKDWORDEDITSTREAMENDSDWCOOKIE应用程序定义的数值,将会被传递给由PFNCALLBACK成员说明的回调函数。通常地我们传递一些重要的参数值给回调函数,譬如流入/流出处理中使用到的文件句柄。DWERROR指示流入(读)或流出(写)操作的结果。0说明没有错误。非0值可以是EDITSTREAMCALLBACK函数的返回值或者说明控件遇到了错误。PFNCALLBACK指向EDITSTREAMCALLBACK函数的指针,该函数是由用户定义,由RICHEDIT调用来传输数据的。RICHEDIT将数据分开多个部分,重复地调用该函数,一次一部分地进行数据传输。EDITSTREAM回调函数具有以下定义EDITSTREAMCALLBACKPROTODWCOOKIEDWORD,PBUFFERDWORD,NUMBYTESDWORD,PBYTESTRANSFERREDDWORD你必须在程序中按照以上原型来创建回调函数。然后将函数地址通过EDITSTREAM结构传递给EM_STREAMIN或者EM_STREAMOUT。对流入操作设置RICHEDIT控件中的正文DWCOOKIE应用程序定义的数值,通过EDITSTREAM结构传递给EM_STREAMIN。在这里我们几乎全部都是将用其内容来设置RICHEDIT正文的文件的句柄传给这个参数。PBUFFER指向RICHEDIT提供的缓冲区。用来接受回调函数中提供的正文数据。NUMBYTES本次调用中你可以写入缓冲区PBUFFER的最大正文字节数。你必须遵守这个限制,也就是说你发送的数据的大小可以比NUMBYTES指定要小,但是不能大于这个值。你可以将这个数值当作PBUFFER缓冲区的大小。PBYTESTRANSFERRED指向一个双字DWORD,你必须设置这个值来指示你实际上传输了多少字节数据到缓冲区。这个值通常跟NUMBYTES中的值是相等的唯一的例外是当要传送的数据少于缓冲区提供的大小时,譬如到达文件尾时就是了。对流出操作读出RICHEDIT控件的正文DWCOOKIE跟流入操作相同我们一般传递想要将数据写入的文件的句柄给这个参数。PBUFFER指向由RICHEDIT提供的缓冲区,里面的是RICHEDIT的正文。要得到其大小,你必须检查NUMBYTES的知NUMBYTESPBUFFER指向的缓冲区的的数据的大小。PBYTESTRANSFERRED指向一个双字DWORD,你必须设置这个值来指示你实际上从缓冲区里读出了多少字节数据。回调函数返回0说明操作成功,而且如果还有数据需要读/写的话,RICHEDIT控件会继续调用它。如果操作中发生了错误,而且你想停止操作的话,你可以返回一个非0值,这样RICHEDIT就会丢弃PBUFFER指向的数据。错误/成功返回值会在EDITSTREAM的DWERROR成员中返回,你可以在SENDMESSAGE返回后检查流操作的错误/成功状态。例子下面的例子是一个简单的编辑器,你可以用来打开一个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控件的修改状态,因为更改正文颜色时改变了RICHEDIT控件的修改状态。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初始化修改状态为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初始化修改状态为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已经打开了一个文件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正如你所见的,如果有一个文件已经打开了,我们将OPEN菜单项变灰禁止并将其他菜单项都使能。跟TRUE值相反的是FILEOPENED值为FALSE在这种情况下的EDIT菜单条我们需要先检查RICHEDIT控件/剪贴板的状态。INVOKESENDMESSAGE,HWNDRICHEDIT,EM_CANPASTE,CF_TEXT,0IFEAX0剪贴板里没有正文INVOKEENABLEMENUITEM,WPARAM,IDM_PASTE,MF_GRAYEDELSEINVOKEENABLEMENUITEM,WPARAM,IDM_PASTE,MF_ENABLEDENDIF我们首先发送EM_CANPASTE消息,来检查剪贴板里是否存在可用的正文。如果有的话,SENDMESSAGE返回TRUE,我们就将PASTE菜单项使能。如果没有的话,我们将该菜单项变灰禁止。INVOKESENDMESSAGE,HWNDRICHEDIT,EM_CANUNDO,0,0IFEAX0INVOKEENABLEMENUITEM,WPARAM,IDM_UNDO,MF_GRAYEDELSEINVOKEENABLEMENUITEM,WPARAM,IDM_UNDO,MF_ENABLEDENDIF跟着,我们通过发送EM_CANUNDO消息来检查UNDO缓冲区是否为空,如果不空,SENDMESSAGE返回TRUE,我们就使能UNDO菜单项。INVOKESENDMESSAGE,HWNDRICHEDIT,EM_CANREDO,0,0IFEAX0INVOKEENABLEMENUITEM,WPARAM,IDM_REDO,MF_GRAYEDELSEINVOKEENABLEMENUITEM,WPARAM,IDM_REDO,MF_ENABLEDENDIF我们通过发送EM_CANREDO消息给RICHEDIT控件来检查REDO缓冲区。如果不空的话,SENDMESSAGE返回TRUE,我们就使

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论