📄 lion-tut-c33.htm
字号:
EditStreamCallback 函数的返回值或者说明控件遇到了错误。 </FONT></TD></TR>
<TR bgColor=#ffffcc>
<TD><B><FONT face="MS Sans Serif" size=-1>pfnCallback</FONT></B></TD>
<TD><FONT face="MS Sans Serif" size=-1> 指向 EditStreamCallback 函数的指针,该函数是由用户定义,由RichEdit调用来传输数据的。RichEdit 将数据分开多个部分,重复地调用该函数,一次一部分地进行数据传输。</FONT></TD></TR></TBODY></TABLE>
<P><FONT face=Tahoma size=-1>EditStream 回调函数具有以下定义:</FONT></P><PRE><FONT face=Tahoma> <B><FONT color=#990099>EditStreamCallback</FONT> proto <FONT color=#cc00cc>dwCookie</FONT>:DWORD,<BR> <FONT color=#cc00cc>pBuffer</FONT>:DWORD,
<FONT color=#cc00cc>NumBytes</FONT>:DWORD,
<FONT color=#cc00cc>pBytesTransferred</FONT>:DWORD</B></FONT></PRE>
<P><FONT face=Tahoma size=-1>你必须在程序中按照以上原型来创建回调函数。然后将函数地址通过 <FONT
color=#006666><B>EDITSTREAM</B></FONT> 结构传递给<FONT
color=#006666><B>EM_STREAMIN</B></FONT> 或者 <FONT
color=#006666><B>EM_STREAMOUT</B></FONT> 。</FONT></P>
<P><FONT face=Tahoma size=-1>对流入操作(设置RichEdit 控件中的正文)</FONT><FONT face=Tahoma>:</FONT></P><PRE><FONT face=Tahoma> <FONT color=#660066><B><FONT color=#990099>dwCookie</FONT></B></FONT>: 应用程序定义的数值,通过 <FONT color=#006666><B>EDITSTREAM</B></FONT> 结构传递给 <FONT color=#006666><B>EM_STREAMIN</B></FONT> 。
在这里我们几乎全部都是将用其内容来设置RichEdit正文的文件的句柄传给这个参数。</FONT><FONT face=Tahoma>
<FONT color=#990099><B>pBuffer</B></FONT>: 指向RichEdit提供的缓冲区。用来接受回调函数中提供的正文数据。
<FONT color=#990099><B>NumBytes</B></FONT>: 本次调用中你可以写入缓冲区(pBuffer)的最大正文字节数。你 <FONT color=#000099><B>必须</B></FONT> 遵守这个限制,
也就是说你发送的数据的大小可以比NumBytes指定要小,但是不能大于这个值。
你可以将这个数值当作pBuffer缓冲区的大小。
<B><FONT color=#990099>pBytesTransferred</FONT></B>: 指向一个双字(DWORD),你必须设置这个值来指示你实际上传输了多少字节数据到缓冲区。
这个值通常跟 <FONT color=#990099><B>NumBytes</B></FONT>中的值是相等的. 唯一的例外是当要传送的数据少于缓冲区提供的大小时,
譬如到达文件尾时就是了。</FONT></PRE>
<P><FONT face=Tahoma><FONT size=-1>对流出操作(读出RichEdit控件的正文):</FONT></FONT><FONT face=Tahoma><FONT
size=-1></FONT></FONT><FONT face=Tahoma><FONT size=-1></FONT></FONT></P><PRE><FONT face=Tahoma> <FONT color=#ffffff><B><FONT color=#990099>dwCookie</FONT></B></FONT>: 跟流入操作相同. 我们一般传递想要将数据写入的文件的句柄给这个参数。
<FONT color=#990099><B>pBuffer</B></FONT>: 指向由RichEdit提供的缓冲区,里面的是RichEdit的正文。要得到其大小,你必须检查 <FONT color=#990099><B>NumBytes</B></FONT> 的知. <FONT color=#990099><B>
NumBytes</B></FONT>: pBuffer 指向的缓冲区的的数据的大小。
<FONT color=#990099><B>pBytesTransferred</B></FONT>: 指向一个双字(DWORD),你必须设置这个值来指示你实际上从缓冲区里读出了多少字节数据。</FONT><FONT face=Tahoma><FONT size=-1></FONT></FONT></PRE>
<P><FONT face=Tahoma size=-1>回调函数返回0说明操作成功,而且如果还有数据需要读/写的话,RichEdit控件会继续调用它。如果操作中发生了错误,而且你想停止操作的话,你可以返回一个非0值,这样RichEdit就会丢弃pBuffer指向的数据。错误/成功返回值会在
<FONT color=#990000><B>EDITSTREAM</B></FONT> 的 <FONT color=#006666><B>dwError</B></FONT> 成员中返回,你可以 在<FONT color=#006666><B>SendMessage</B></FONT> 返回后检查流操作的错误/成功状态。. </FONT><FONT face=Tahoma><FONT
size=-1></FONT></FONT></P>
<H3><FONT color=#0000cc
face="Times New Roman, Times, serif">例子:</FONT></H3>
<P><FONT face=Tahoma size=-1>下面的例子是一个简单的编辑器,你可以用来打开一个asm源文件,编辑它,然后保存。它使用了 RichEdit 控件 2.0 或者更高的版本.</FONT></P><PRE align="left"><B><FONT face=Tahoma>.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\gdi32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
.const
IDR_MAINMENU equ 101
IDM_OPEN equ 40001
IDM_SAVE equ 40002
IDM_CLOSE equ 40003
IDM_SAVEAS equ 40004
IDM_EXIT equ 40005
IDM_COPY equ 40006
IDM_CUT equ 40007
IDM_PASTE equ 40008
IDM_DELETE equ 40009
IDM_SELECTALL equ 40010
IDM_OPTION equ 40011
IDM_UNDO equ 40012
IDM_REDO equ 40013
IDD_OPTIONDLG equ 101
IDC_BACKCOLORBOX equ 1000
IDC_TEXTCOLORBOX equ 1001
RichEditID equ 300
.data
ClassName db "<FONT color=#0000ff>IczEditClass</FONT>",0
AppName db "<FONT color=#0000ff>IczEdit version 1.0</FONT>",0
RichEditDLL db "<FONT color=#0000ff>riched20.dll</FONT>",0
RichEditClass db "<FONT color=#0000ff>RichEdit20A</FONT>",0
NoRichEdit db "<FONT color=#0000ff>Cannot find riched20.dll</FONT>",0
ASMFilterString db "<FONT color=#0000ff>ASM Source code (*.asm)</FONT>",0,"*<FONT color=#0000ff>.asm</FONT>",0
db "<FONT color=#0000ff>All Files (*.*)</FONT>",0,"<FONT color=#0000ff>*.*</FONT>",0,0
OpenFileFail db "<FONT color=#0000ff>Cannot open the file</FONT>",0
WannaSave db "<FONT color=#0000ff>The data in the control is modified. Want to save it?</FONT>",0
FileOpened dd FALSE
BackgroundColor dd 0FFFFFFh <FONT color=#006666>; 缺省为白色</FONT>
TextColor dd 0 <FONT color=#006666>; 缺省为黑色</FONT>
.data?
hInstance dd ?
hRichEdit dd ?
hwndRichEdit dd ?
FileName db 256 dup(?)
AlternateFileName db 256 dup(?)
CustomColors dd 16 dup(?)
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
<FONT color=#ff0033> invoke LoadLibrary,addr RichEditDLL</FONT>
.if eax!=0
mov hRichEdit,eax
invoke WinMain, hInstance,0,0, SW_SHOWDEFAULT
invoke FreeLibrary,hRichEdit
.else
invoke MessageBox,0,addr NoRichEdit,addr AppName,MB_OK or MB_ICONERROR
.endif
invoke ExitProcess,eax
WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:DWORD
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,IDR_MAINMENU
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInst,NULL
mov hwnd,eax
invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.while TRUE
invoke GetMessage, ADDR msg,0,0,0
.break .if (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endw
mov eax,msg.wParam
ret
WinMain endp
<FONT color=#003399>StreamInProc</FONT> proc hFile:DWORD,pBuffer:DWORD, NumBytes:DWORD, pBytesRead:DWORD
invoke ReadFile,hFile,pBuffer,NumBytes,pBytesRead,0
xor eax,1
ret
<FONT color=#003399>StreamInProc</FONT> endp
<FONT color=#003399>StreamOutProc</FONT> proc hFile:DWORD,pBuffer:DWORD, NumBytes:DWORD, pBytesWritten:DWORD
invoke WriteFile,hFile,pBuffer,NumBytes,pBytesWritten,0
xor eax,1
ret
<FONT color=#003399>StreamOutProc</FONT> endp
<FONT color=#003399>CheckModifyState</FONT> proc hWnd:DWORD
invoke SendMessage,hwndRichEdit,EM_GETMODIFY,0,0
.if eax!=0
invoke MessageBox,hWnd,addr WannaSave,addr AppName,MB_YESNOCANCEL
.if eax==IDYES
invoke SendMessage,hWnd,WM_COMMAND,IDM_SAVE,0
.elseif eax==IDCANCEL
mov eax,FALSE
ret
.endif
.endif
mov eax,TRUE
ret
<FONT color=#003399>CheckModifyState</FONT> endp
<FONT color=#003399>SetColor</FONT> proc
LOCAL cfm:CHARFORMAT
invoke SendMessage,hwndRichEdit,EM_SETBKGNDCOLOR,0,BackgroundColor
invoke RtlZeroMemory,addr cfm,sizeof cfm
mov cfm.cbSize,sizeof cfm
mov cfm.dwMask,CFM_COLOR
push TextColor
pop cfm.crTextColor
invoke SendMessage,hwndRichEdit,EM_SETCHARFORMAT,SCF_ALL,addr cfm
ret
<FONT color=#003399>SetColor</FONT> endp
<FONT color=#003399>OptionProc</FONT> proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
LOCAL clr:CHOOSECOLOR
.if uMsg==WM_INITDIALOG
.elseif uMsg==WM_COMMAND
mov eax,wParam
shr eax,16
.if ax==BN_CLICKED
mov eax,wParam
.if ax==IDCANCEL
invoke SendMessage,hWnd,WM_CLOSE,0,0
.elseif ax==IDC_BACKCOLORBOX
invoke RtlZeroMemory,addr clr,sizeof clr
mov clr.lStructSize,sizeof clr
push hWnd
pop clr.hwndOwner
push hInstance
pop clr.hInstance
push BackgroundColor
pop clr.rgbResult
mov clr.lpCustColors,offset CustomColors
mov clr.Flags,CC_ANYCOLOR or CC_RGBINIT
invoke ChooseColor,addr clr
.if eax!=0
push clr.rgbResult
pop BackgroundColor
invoke GetDlgItem,hWnd,IDC_BACKCOLORBOX
invoke InvalidateRect,eax,0,TRUE
.endif
.elseif ax==IDC_TEXTCOLORBOX
invoke RtlZeroMemory,addr clr,sizeof clr
mov clr.lStructSize,sizeof clr
push hWnd
pop clr.hwndOwner
push hInstance
pop clr.hInstance
push TextColor
pop clr.rgbResult
mov clr.lpCustColors,offset CustomColors
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -