⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lion-tut-c33.htm

📁 内有一些代码
💻 HTM
📖 第 1 页 / 共 5 页
字号:
      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 + -