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

下载本文档

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

文档简介

1、第三十三课: RichEdit 控件根底知识有很多人要求我提供关于RichEdit控件的指南,经过这方面的大量编程实践,我想我终于可以开写关于RichEdit控件的指南了。诺,这个就是第一篇RichEdit指南。本指南将会描述涉及到RichEdit的几乎所有方面,起码是我所知道的关于它的所有方面。因为指南的信息量相当相当的大,所以我将它分成了几个局部,本篇是第一局部。在这篇指南里,你将会了解到什么是RichEdit控件,怎样创立它,怎样往里面载入数据和保存里面的数据。例子理论A richedit control can be thought of as a souped-up edit con

2、trol. 它提供了普通简单Edit控件所缺少的很多令人合意的功能,譬如可以使用多种字体和字体大小,多级Undo/Redo,文本搜索,内嵌OLE对象,编辑的拖放支持等等。由于RichEdit控件有这么多功能,因此它独存于一个单独的DLL文件。这个意味着如果你要使用RichEdit控件,就不能象使用其他普通控件那样只调用InitCommonControls 函数。你必须先使用 LoadLibrary 来载入RichEdit DLL文件。这里有个问题,就是至今为止RichEdit控件共有3个版本,版本1,2和3。下面的表格显示了每个版本的相应的DLL文件名。DLL NameRichEdit ver

3、sionRichedit Class NameRiched32.dll1.0RICHEDITRichEd20.dll2.0RICHEDIT20ARichEd20.dll3.0RICHEDIT20A你会注意到版本2和3都使用了相同的DLL文件名,而且它们也使用了相同的类名!这样在你想要明确的使用RichEdit 3.0的功能的时候就会产生问题. 到目前为止,我还找到一个正式的方法来区分版本2.0和3.0.不过,有个解决方法工作良好,我会在后面演示给你看.data RichEditDLL db RichEd20.dll,0.data?hRichEditDLL dd ?.codeinvoke Loa

4、dLibrary,addr RichEditDLLmov hRichEditDLL,eax.invoke FreeLibrary,hRichEditDLL当Richedit DLL文件被载入时,它会注册 RichEdit 窗口类,因此需要在你创立Richedit控件之前必须先要载入DLL.Richedit控件的类名是不同的。现在你可能会有一个问题要提:我怎么样才能够知道我要使用哪个版本的Richedit控件?如果你不需要使用那些特别的功能,使用最新的版本也不定是最适宜的.下面的表格列出了每个RichEdit版本提供的功能.功能版本 1.0版本 2.0版本 3.0选择条xxxUnicode 编辑

5、 xx字符段落格式xxx文本搜索向前搜索向前/向后搜索向前/向后搜索内嵌OLExxx拖放编辑xxxUndo/Redo单级多级多级自动 URL 识别 xx加速键支持 xx非窗口操作 xx分行符CRLFCRCR (可以模拟1.0版本)Zoom xParagraph numbering xsimple table xnormal and heading styles xunderline coloring xhidden text xfont binding x上面的表格不是全面的:我只是列出了那些重要的功能.创立RchEdit 控件载入DLL文件后,你可以调用CreateWindowEx 来创立R

6、ichEdit控件,创立控件时你可以使用Edit控件风格和普通窗口风格,但是ES_LOWERCASE, ES_UPPERCASE 和 ES_OEMCONVERT 风格除外.constRichEditID equ 300.dataRichEditDLL db RichEd20.dll,0RichEditClass db RichEdit20A,0.data?hRichEditDLL dd ?hwndRichEdit dd ?.code.invoke LoadLibrary,addr RichEditDLLmov hRichEditDLL,eaxinvoke CreateWindowEx,0,ad

7、dr RichEditClass,WS_VISIBLE or ES_MULTILINE or WS_CHILD or WS_VSCROLL or WS_HSCROLL, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hWnd,RichEditID,hInstance,0mov hwndRichEdit,eax设置缺省的文本和背景颜色在使用Edit控件时设置文本和背景颜色可能有点问题,但是在RichEdit控件中已经修正了这个问题.要设置RichEdit的背景色,你要发送 EM_SETBKGNDCOLOR 消息给RichEdit控

8、件.这个消息具有以下语法.wParam = 颜色选项. 如果是0说明Windows使用 lParam 中的颜色值作为背景色.如果该参数不为0,Windows使用系统背景色.因为我们要发送该消息来改变背景色,所以我们必须令wParam为0.lParam = 指定要设置的颜色的 COLORREF 结构,仅当 wParam 为 0 时才有效.譬如, 如果我要设置背景为纯蓝色,我需要写入以下代码:invoke SendMessage,hwndRichEdit,EM_SETBKGNDCOLOR,0,0FF0000h要设置文本颜色,RichEdit控件提供了另外的新消息,EM_SETCHARFORMAT来

9、做这个工作. 这个消息控制控件中一段选定的文本或者全部正文的格式. 这个消息的语法如下:wParam = 格式选项: SCF_ALL本次操作影响控件中全部文本.SCF_SELECTION本次操作仅影响选定的文本SCF_WORD or SCF_SELECTION本次操作仅影响所选定的那个单词. 如果选定是空的话,仅将插入点(光标)设置到指定字的位置. SCF_WORD 标志必须跟 SCF_SELECTION 一起使用.lParam = CHARFORMAT 或者 CHARFORMAT2 结构的指针,说明要使用的正文格式. CHARFORMAT2 只在 Richedit 2.0 和更高版本才提供.

10、这个不是说在RichEdit 2.0以后你一定要使用 CHARFORMAT2 . 如果你不需要使用到 CHARFORMAT2 中新加的功能, 你仍然可以使用CHARFORMAT .CHARFORMATA STRUCT cbSize DWORD ? dwMask DWORD ? dwEffects DWORD ? yHeight DWORD ? yOffset DWORD ? crTextColor COLORREF ? bCharSet BYTE ? bPitchAndFamily BYTE ? szFaceName BYTE LF_FACESIZE dup(?) _wPad2 WORD ?

11、CHARFORMATA ENDS Field NameDescriptioncbSize该结构的大小. RichEdit控件使用该域来判断该结构的版本是 CHARFORMAT 还是 CHARFORMAT2dwMask位标记, 用来指定下面的那些成员是有效的.CFM_BOLDdwEffects 成语中的 CFE_BOLD 值是有效的.CFM_CHARSETbCharSet 成员是有效的。CFM_COLORcrTextColor 成员跟 dwEffects中的 CFE_AUTOCOLOR 值是有效的.CFM_FACEszFaceName 成员是有效的.CFM_ITALICdwEffects 成员中

12、的 CFE_ITALIC 值是有效的.CFM_OFFSETyOffset 成员是有效的.CFM_PROTECTEDdwEffects 成员中的 CFE_PROTECTED 值是有效的.CFM_SIZEyHeight 成员是有效的.CFM_STRIKEOUTdwEffects 成员中的 CFE_STRIKEOUT 值是有效的.CFM_UNDERLINEdwEffects 成员中的 CFE_UNDERLINE 值是有效的.dwEffects字符效果. 可以是以下值的组合CFE_AUTOCOLOR使用系统正文颜色CFE_BOLD粗体字符CFE_ITALIC斜体字符CFE_STRIKEOUT字符带删除

13、线CFE_UNDERLINE字符带下划线CFE_PROTECTED字符是受保护的; 企图改变字体会产生一个EN_PROTECTED 通知消息. yHeight字符高度, 单位是 twips ( 1/1440 英寸 或者 1/20 的打印机的打印点). yOffset字符偏移,单位是 twips, 从基线算起.如果该成员是正值,字符是下标,如果负值,字符是下标. crTextColor 正文颜色. 如果指定了 CFE_AUTOCOLOR 字符效果,这个值会被忽略.bCharSet字符集bPitchAndFamilyFont family and pitch. szFaceName 字体名字,是一

14、个空字符结尾的字符数组._wPad2填充通过检查这个结构,你会发现我们可以改变正文效果(粗体,斜体,删除线,下划线),正文颜色 (crTextColor) 和字体外观/大小/字符集. 值得注意的是 CFE_RPOTECTED 标志. 具有该标志的正文会被标志上受保护标志,意味着当用户试图改变它时, EN_PROTECTED 这个通知消息会被发送到父窗口.同时你可以允许该更改是是否可以进行.CHARFORMAT2 增加更多的正文风格,象字体权值,间距,正文背景色,字距调整等等.如果你不需要这些额外的功能,只要使用 CHARFORMAT即可. 要设置正文格式,你必须考虑你想要该格式应用到的正文的范

15、围.RichEdit控件引入了字符正文范围的概念.RichEdit 分派给每个字符一个从0开始数字值:控件中的第一个字符具有数字ID值为0,第二个为1.等等。要说明一个正文范围,你必须提供应RichEdit控件两个数值:范围的第一个和最后一个字符的ID值。要跟 EM_SETCHARFORMAT 一起应用字符格式,你有最多3种选择: 应用于控件中的所有正文。 (SCF_ALL) 应用于当前选定的正文。 (SCF_SELECTION) 应用于当前选定的一个单词。 (SCF_WORD 或者 SCF_SELECTION) 第一、二种情况是直观的,最后一个选择需要一点解释。如果当前选择只覆盖了词中的一个

16、或多个字符但是不是整个词,指定 SCF_WORD+SCF_SELECTION 标志将正文格式应用于整个单词。即使没有当前选定,只有插入点光标位于单词中,第三种情况下仍然会将正文格式应用到整个单词中。要使用 EM_SETCHARFORMAT, 你需要填充 CHARFORMAT (或者 CHARFORMAT2) 结构的结果成员。譬如,如果我们要设置正文颜色,需要如下一样填充 CHARFORMAT 结构:.data?cf CHARFORMAT .codemov cf.cbSize,sizeof cfmov cf.dwMask,CFM_COLORmov cf.crTextColor,0FF0000hi

17、nvoke SendMessage,hwndRichEdit,EM_SETCHARFORMAT,SCF_ALL,addr cf以上的代码片段设置RichEdit控件的正文颜色为纯蓝色。注意当 EM_SETCHARFORMAT 发生时,如果控件中没有正文,在这个消息之后键入的正文将会使用消息 EM_SETCHARFORMAT 中指定的正文格式。设置正文/保存正文对于那些经常使用Edit控件的人来说,你们肯定对使用 WM_GETTEXT/WM_SETTEXT 来设置/保存 控制中的正文的方法很熟悉。这个方法对RichEdit仍然适用,但是如果文件很大的话这个方法不再是最有效的。Edit控件限制了正

18、文长度,可以输入最多64K的正文。但是RichEdit控件可以接受比这个限制大的多的正文数据。要分配一个很大的内存块(譬如大约 10MB ) 来接受来自来自WM_GETTEXT 消息的正文是一件很麻烦的事. Richedit 控件为此提供了一个新的方法,就是 正文流Text Streaming。要设置RichEdit文本,你只需给RichEdit简单的提供一个回调函数的地址,当一切准备好时,RichEdit 会调用回调函数,并将正文缓冲区的地址传递给它。回调函数会将要发送给RichEdit的数据填入缓冲区或者将缓冲区的数据读出,然后等待下一次调用自到操作完成。 范例程序是流入设置正文和流出取出

19、正文两者的例子。你将会发现这个方法更加有效:这个缓冲区是RichEdit控件自己提供的,因此数据被分成了几个大块。这个操作包括两条消息: EM_STREAMIN 和 EM_STREAMOUT。EM_STREAMIN 和 EM_STREAMOUT 两者使用同一个语法:wParam = 格式选项.SF_RTF数据是RTF格式。SF_TEXT数据是简单正文格式。SFF_PLAINRTF只有那些对所有语系都共有的关键词才流入。SFF_SELECTION如果指定这个标志,流操作的目标就是当前选定的正文。如果你将正文流入,当前正文就会被替换,如果是流出,那么只有那些当前选定的正文才流出。如果没有指定这个标

20、志,操作就会影响到控件中的所有正文。SF_UNICODE(RichEdit 2.0 或更高版本才提供指定的是 Unicode 正文。lParam = 指向一个 EDITSTREAM 结构,该结构定义如下: EDITSTREAM STRUCT dwCookie DWORD ? dwError DWORD ? pfnCallback DWORD ? EDITSTREAM ENDSdwCookie应用程序定义的数值,将会被传递给由 pfnCallback 成员说明的回调函数。通常地我们传递一些重要的参数值给回调函数,譬如流入/流出 处理中使用到的文件句柄。dwError指示流入读或流出写操作的结果。

21、0说明没有错误。非0值可以是 EditStreamCallback 函数的返回值或者说明控件遇到了错误。 pfnCallback指向 EditStreamCallback 函数的指针,该函数是由用户定义,由RichEdit调用来传输数据的。RichEdit 将数据分开多个局部,重复地调用该函数,一次一局部地进行数据传输。EditStream 回调函数具有以下定义:EditStreamCallback proto dwCookie:DWORD, pBuffer:DWORD, NumBytes:DWORD, pBytesTransferred:DWORD你必须在程序中按照以上原型来创立回调函数。然

22、后将函数地址通过 EDITSTREAM 结构传递给EM_STREAMIN 或者 EM_STREAMOUT 。对流入操作(设置RichEdit 控件中的正文):dwCookie: 应用程序定义的数值,通过 EDITSTREAM 结构传递给 EM_STREAMIN 。 在这里我们几乎全部都是将用其内容来设置RichEdit正文的文件的句柄传给这个参数。pBuffer: 指向RichEdit提供的缓冲区。用来接受回调函数中提供的正文数据。NumBytes: 本次调用中你可以写入缓冲区(pBuffer)的最大正文字节数。你 必须 遵守这个限制, 也就是说你发送的数据的大小可以比NumBytes指定要小

23、,但是不能大于这个值。 你可以将这个数值当作pBuffer缓冲区的大小。 pBytesTransferred: 指向一个双字(DWORD),你必须设置这个值来指示你实际上传输了多少字节数据到缓冲区。 这个值通常跟 NumBytes中的值是相等的. 唯一的例外是当要传送的数据少于缓冲区提供的大小时, 譬如到达文件尾时就是了。对流出操作(读出RichEdit控件的正文):dwCookie: 跟流入操作相同. 我们一般传递想要将数据写入的文件的句柄给这个参数。pBuffer: 指向由RichEdit提供的缓冲区,里面的是RichEdit的正文。要得到其大小,你必须检查 NumBytes 的知. Nu

24、mBytes: pBuffer 指向的缓冲区的的数据的大小。pBytesTransferred: 指向一个双字(DWORD),你必须设置这个值来指示你实际上从缓冲区里读出了多少字节数据。回调函数返回0说明操作成功,而且如果还有数据需要读/写的话,RichEdit控件会继续调用它。如果操作中发生了错误,而且你想停止操作的话,你可以返回一个非0值,这样RichEdit就会丢弃pBuffer指向的数据。错误/成功返回值会在 EDITSTREAM 的 dwError 成员中返回,你可以 在SendMessage 返回后检查流操作的错误/成功状态。. 例子:下面的例子是一个简单的编辑器,你可以用来翻开一

25、个asm源文件,编辑它,然后保存。它使用了 RichEdit 控件 2.0 或者更高的版本.386.model flat,stdcalloption casemap:noneinclude masm32includewindows.incinclude masm32includeuser32.incinclude masm32includecomdlg32.incinclude masm32includegdi32.incinclude masm32includekernel32.incincludelib masm32libgdi32.libincludelib masm32libcomdl

26、g32.libincludelib masm32libuser32.libincludelib masm32libkernel32.libWinMain proto :DWORD,:DWORD,:DWORD,:DWORD.constIDR_MAINMENU equ 101IDM_OPEN equ 40001IDM_SAVE equ 40002IDM_CLOSE equ 40003IDM_SAVEAS equ 40004IDM_EXIT equ 40005IDM_COPY equ 40006IDM_CUT equ 40007IDM_PASTE equ 40008IDM_DELETE equ 40

27、009IDM_SELECTALL equ 40010IDM_OPTION equ 40011IDM_UNDOequ 40012IDM_REDOequ 40013IDD_OPTIONDLG equ 101IDC_BACKCOLORBOX equ 1000IDC_TEXTCOLORBOX equ 1001RichEditID equ 300.dataClassName db IczEditClass,0AppName db IczEdit version 1.0,0RichEditDLL db riched20.dll,0RichEditClass db RichEdit20A,0NoRichEd

28、it db Cannot find riched20.dll,0ASMFilterString db ASM Source code (*.asm),0,*.asm,0db All Files (*.*),0,*.*,0,0OpenFileFail db Cannot open the file,0WannaSave db The data in the control is modified. Want to save it?,0FileOpened dd FALSEBackgroundColor dd 0FFFFFFh; 缺省为白色TextColor dd 0; 缺省为黑色.data?hI

29、nstance dd ?hRichEdit dd ?hwndRichEdit dd ?FileName db 256 dup(?)AlternateFileName db 256 dup(?)CustomColors dd 16 dup(?).codestart:invoke GetModuleHandle, NULLmov hInstance,eaxinvoke LoadLibrary,addr RichEditDLL.if eax!=0mov hRichEdit,eaxinvoke WinMain, hInstance,0,0, SW_SHOWDEFAULTinvoke FreeLibra

30、ry,hRichEdit.elseinvoke MessageBox,0,addr NoRichEdit,addr AppName,MB_OK or MB_ICONERROR.endifinvoke ExitProcess,eaxWinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORDLOCAL wc:WNDCLASSEXLOCAL msg:MSGLOCAL hwnd:DWORDmov wc.cbSize,SIZEOF WNDCLASSEXmov wc.style, CS_HREDRAW or CS_VREDRAW

31、mov wc.lpfnWndProc, OFFSET WndProcmov wc.cbClsExtra,NULLmov wc.cbWndExtra,NULLpush hInstpop wc.hInstancemov wc.hbrBackground,COLOR_WINDOW+1mov wc.lpszMenuName,IDR_MAINMENUmov wc.lpszClassName,OFFSET ClassNameinvoke LoadIcon,NULL,IDI_APPLICATIONmov wc.hIcon,eaxmov wc.hIconSm,eaxinvoke LoadCursor,NULL

32、,IDC_ARROWmov wc.hCursor,eaxinvoke RegisterClassEx, addr wcINVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL, hInst,NULLmov hwnd,eaxinvoke ShowWindow, hwnd,SW_SHOWNORMALinvoke UpdateWindow, hwnd.while TRUEin

33、voke GetMessage, ADDR msg,0,0,0.break .if (!eax)invoke TranslateMessage, ADDR msginvoke DispatchMessage, ADDR msg.endwmov eax,msg.wParamretWinMain endpStreamInProc proc hFile:DWORD,pBuffer:DWORD, NumBytes:DWORD, pBytesRead:DWORDinvoke ReadFile,hFile,pBuffer,NumBytes,pBytesRead,0 xor eax,1retStreamIn

34、Proc endpStreamOutProc proc hFile:DWORD,pBuffer:DWORD, NumBytes:DWORD, pBytesWritten:DWORDinvoke WriteFile,hFile,pBuffer,NumBytes,pBytesWritten,0 xor eax,1retStreamOutProc endpCheckModifyState proc hWnd:DWORDinvoke SendMessage,hwndRichEdit,EM_GETMODIFY,0,0.if eax!=0invoke MessageBox,hWnd,addr WannaS

35、ave,addr AppName,MB_YESNOCANCEL.if eax=IDYESinvoke SendMessage,hWnd,WM_COMMAND,IDM_SAVE,0.elseif eax=IDCANCELmov eax,FALSEret.endif.endifmov eax,TRUEretCheckModifyState endpSetColor procLOCAL cfm:CHARFORMATinvoke SendMessage,hwndRichEdit,EM_SETBKGNDCOLOR,0,BackgroundColorinvoke RtlZeroMemory,addr cf

36、m,sizeof cfmmov cfm.cbSize,sizeof cfmmov cfm.dwMask,CFM_COLORpush TextColorpop cfm.crTextColorinvoke SendMessage,hwndRichEdit,EM_SETCHARFORMAT,SCF_ALL,addr cfmretSetColor endpOptionProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORDLOCAL clr:CHOOSECOLOR.if uMsg=WM_INITDIALOG.elseif uMsg=WM_

37、COMMANDmov eax,wParamshr eax,16.if ax=BN_CLICKEDmov eax,wParam.if ax=IDCANCELinvoke SendMessage,hWnd,WM_CLOSE,0,0.elseif ax=IDC_BACKCOLORBOXinvoke RtlZeroMemory,addr clr,sizeof clrmov clr.lStructSize,sizeof clrpush hWndpop clr.hwndOwnerpush hInstancepop clr.hInstancepush BackgroundColorpop clr.rgbRe

38、sultmov clr.lpCustColors,offset CustomColorsmov clr.Flags,CC_ANYCOLOR or CC_RGBINITinvoke ChooseColor,addr clr.if eax!=0push clr.rgbResultpop BackgroundColorinvoke GetDlgItem,hWnd,IDC_BACKCOLORBOXinvoke InvalidateRect,eax,0,TRUE.endif.elseif ax=IDC_TEXTCOLORBOXinvoke RtlZeroMemory,addr clr,sizeof cl

39、rmov clr.lStructSize,sizeof clrpush hWndpop clr.hwndOwnerpush hInstancepop clr.hInstancepush TextColorpop clr.rgbResultmov clr.lpCustColors,offset CustomColorsmov clr.Flags,CC_ANYCOLOR or CC_RGBINITinvoke ChooseColor,addr clr.if eax!=0push clr.rgbResultpop TextColorinvoke GetDlgItem,hWnd,IDC_TEXTCOL

40、ORBOXinvoke InvalidateRect,eax,0,TRUE.endif.elseif ax=IDOK;=;保存RichEdit控件的修改状态,因为更改正文颜色时改变了RichEdit控件的修改状态。; ;=invoke SendMessage,hwndRichEdit,EM_GETMODIFY,0,0push eaxinvoke SetColorpop eaxinvoke SendMessage,hwndRichEdit,EM_SETMODIFY,eax,0invoke EndDialog,hWnd,0.endif.endif.elseif uMsg=WM_CTLCOLORST

41、ATICinvoke GetDlgItem,hWnd,IDC_BACKCOLORBOX.if eax=lParaminvoke CreateSolidBrush,BackgroundColorret.elseinvoke GetDlgItem,hWnd,IDC_TEXTCOLORBOX.if eax=lParaminvoke CreateSolidBrush,TextColorret.endif.endifmov eax,FALSEret.elseif uMsg=WM_CLOSEinvoke EndDialog,hWnd,0.elsemov eax,FALSEret.endifmov eax,

42、TRUEretOptionProc endpWndProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORDLOCAL chrg:CHARRANGELOCAL ofn:OPENFILENAMELOCAL buffer256:BYTELOCAL editstream:EDITSTREAMLOCAL hFile:DWORD.if uMsg=WM_CREATEinvoke CreateWindowEx,WS_EX_CLIENTEDGE,addr RichEditClass,0,WS_CHILD or WS_VISIBLE or ES_MU

43、LTILINE or WS_VSCROLL or WS_HSCROLL or ES_NOHIDESEL,CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,hWnd,RichEditID,hInstance,0mov hwndRichEdit,eax;=; 设置正文长度限制,缺省是 64K;=invoke SendMessage,hwndRichEdit,EM_LIMITTEXT,-1,0;=; Set the default text/background color;=invoke SetColorinvoke SendMes

44、sage,hwndRichEdit,EM_SETMODIFY,FALSE,0invoke SendMessage,hwndRichEdit,EM_EMPTYUNDOBUFFER,0,0.elseif uMsg=WM_INITMENUPOPUPmov eax,lParam.if ax=0; file menu.if FileOpened=TRUE; a file is already openedinvoke EnableMenuItem,wParam,IDM_OPEN,MF_GRAYEDinvoke EnableMenuItem,wParam,IDM_CLOSE,MF_ENABLEDinvok

45、e EnableMenuItem,wParam,IDM_SAVE,MF_ENABLEDinvoke EnableMenuItem,wParam,IDM_SAVEAS,MF_ENABLED.elseinvoke EnableMenuItem,wParam,IDM_OPEN,MF_ENABLEDinvoke EnableMenuItem,wParam,IDM_CLOSE,MF_GRAYEDinvoke EnableMenuItem,wParam,IDM_SAVE,MF_GRAYEDinvoke EnableMenuItem,wParam,IDM_SAVEAS,MF_GRAYED.endif.els

46、eif ax=1; edit 菜单;=; 检查剪贴板里是否有正文,如果有的话我们就使能 Paste 菜单项。;=invoke SendMessage,hwndRichEdit,EM_CANPASTE,CF_TEXT,0.if eax=0; no text in the clipboardinvoke EnableMenuItem,wParam,IDM_PASTE,MF_GRAYED.elseinvoke EnableMenuItem,wParam,IDM_PASTE,MF_ENABLED.endif;=; 检查Undo队列时是否为空;=invoke SendMessage,hwndRichEd

47、it,EM_CANUNDO,0,0.if eax=0invoke EnableMenuItem,wParam,IDM_UNDO,MF_GRAYED.elseinvoke EnableMenuItem,wParam,IDM_UNDO,MF_ENABLED.endif;=; 检查Redo队列时是否为空;=invoke SendMessage,hwndRichEdit,EM_CANREDO,0,0.if eax=0invoke EnableMenuItem,wParam,IDM_REDO,MF_GRAYED.elseinvoke EnableMenuItem,wParam,IDM_REDO,MF_E

48、NABLED.endif;=; 检查RichEdit控件中是否有当前选定正文,有的话就使能; cut/copy/delete 菜单项。;=invoke SendMessage,hwndRichEdit,EM_EXGETSEL,0,addr chrgmov eax,chrg.cpMin.if eax=chrg.cpMax; 没有当前选定invoke EnableMenuItem,wParam,IDM_COPY,MF_GRAYEDinvoke EnableMenuItem,wParam,IDM_CUT,MF_GRAYEDinvoke EnableMenuItem,wParam,IDM_DELETE

49、,MF_GRAYED.elseinvoke EnableMenuItem,wParam,IDM_COPY,MF_ENABLEDinvoke EnableMenuItem,wParam,IDM_CUT,MF_ENABLEDinvoke EnableMenuItem,wParam,IDM_DELETE,MF_ENABLED.endif.endif.elseif uMsg=WM_COMMAND.if lParam=0; 命令菜单mov eax,wParam.if ax=IDM_OPENinvoke RtlZeroMemory,addr ofn,sizeof ofnmov ofn.lStructSiz

50、e,sizeof ofnpush hWndpop ofn.hwndOwnerpush hInstancepop ofn.hInstancemov ofn.lpstrFilter,offset ASMFilterStringmov ofn.lpstrFile,offset FileNamemov byte ptr FileName,0mov ofn.nMaxFile,sizeof FileNamemov ofn.Flags,OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXISTinvoke GetOpenFileName,addr o

51、fn.if eax!=0invoke CreateFile,addr FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0.if eax!=INVALID_HANDLE_VALUEmov hFile,eax;=; 将正文流入RichEdit控件。;=mov editstream.dwCookie,eaxmov editstream.pfnCallback,offset StreamInProcinvoke SendMessage,hwndRichEdit,EM_STREAMIN,SF_T

52、EXT,addr editstream;=; 初始化修改状态为FALSE;=invoke SendMessage,hwndRichEdit,EM_SETMODIFY,FALSE,0invoke CloseHandle,hFilemov FileOpened,TRUE.elseinvoke MessageBox,hWnd,addr OpenFileFail,addr AppName,MB_OK or MB_ICONERROR.endif.endif.elseif ax=IDM_CLOSEinvoke CheckModifyState,hWnd.if eax=TRUEinvoke SetWindo

53、wText,hwndRichEdit,0mov FileOpened,FALSE.endif.elseif ax=IDM_SAVEinvoke CreateFile,addr FileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0.if eax!=INVALID_HANDLE_VALUE:mov hFile,eax;=; 将RichEdit中的正文流出到文件中。;=mov editstream.dwCookie,eaxmov editstream.pfnCallback,offset S

54、treamOutProcinvoke SendMessage,hwndRichEdit,EM_STREAMOUT,SF_TEXT,addr editstream;=; 初始化修改状态为FALSE;=invoke SendMessage,hwndRichEdit,EM_SETMODIFY,FALSE,0invoke CloseHandle,hFile.elseinvoke MessageBox,hWnd,addr OpenFileFail,addr AppName,MB_OK or MB_ICONERROR.endif.elseif ax=IDM_COPYinvoke SendMessage,h

55、wndRichEdit,WM_COPY,0,0.elseif ax=IDM_CUTinvoke SendMessage,hwndRichEdit,WM_CUT,0,0.elseif ax=IDM_PASTEinvoke SendMessage,hwndRichEdit,WM_PASTE,0,0.elseif ax=IDM_DELETEinvoke SendMessage,hwndRichEdit,EM_REPLACESEL,TRUE,0.elseif ax=IDM_SELECTALLmov chrg.cpMin,0mov chrg.cpMax,-1invoke SendMessage,hwnd

56、RichEdit,EM_EXSETSEL,0,addr chrg.elseif ax=IDM_UNDOinvoke SendMessage,hwndRichEdit,EM_UNDO,0,0.elseif ax=IDM_REDOinvoke SendMessage,hwndRichEdit,EM_REDO,0,0.elseif ax=IDM_OPTIONinvoke DialogBoxParam,hInstance,IDD_OPTIONDLG,hWnd,addr OptionProc,0.elseif ax=IDM_SAVEASinvoke RtlZeroMemory,addr ofn,size

57、of ofnmov ofn.lStructSize,sizeof ofnpush hWndpop ofn.hwndOwnerpush hInstancepop ofn.hInstancemov ofn.lpstrFilter,offset ASMFilterStringmov ofn.lpstrFile,offset AlternateFileNamemov byte ptr AlternateFileName,0mov ofn.nMaxFile,sizeof AlternateFileNamemov ofn.Flags,OFN_FILEMUSTEXIST or OFN_HIDEREADONL

58、Y or OFN_PATHMUSTEXISTinvoke GetSaveFileName,addr ofn.if eax!=0invoke CreateFile,addr AlternateFileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0.if eax!=INVALID_HANDLE_VALUEjmp B.endif.endif.elseif ax=IDM_EXITinvoke SendMessage,hWnd,WM_CLOSE,0,0.endif.endif.elseif uMs

59、g=WM_CLOSEinvoke CheckModifyState,hWnd.if eax=TRUEinvoke DestroyWindow,hWnd.endif.elseif uMsg=WM_SIZEmov eax,lParammov edx,eaxand eax,0FFFFhshr edx,16invoke MoveWindow,hwndRichEdit,0,0,eax,edx,TRUE.elseif uMsg=WM_DESTROYinvoke PostQuitMessage,NULL.elseinvoke DefWindowProc,hWnd,uMsg,wParam,lParamret.

60、endifxor eax,eaxretWndProc endpend start;=; 资源文件;=#include resource.h#define IDR_MAINMENU 101#define IDD_OPTIONDLG 101#define IDC_BACKCOLORBOX 1000#define IDC_TEXTCOLORBOX 1001#define IDM_OPEN 40001#define IDM_SAVE 40002#define IDM_CLOSE 40003#define IDM_SAVEAS 40004#define IDM_EXIT 40005#define IDM

温馨提示

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

评论

0/150

提交评论