WIN32汇编语言教程:第09章 通用控件 · 9.4 使用Richedit控件(2)
.data
stFind FINDREPLACE <sizeof FINDREPLACE,0,0,FR_DOWN,szFindText,\
0,sizeof szFindText,0,0,0,0>
.const
FINDMSGSTRING db 'commdlg_FindReplace',0
SzClassName db 'Wordpad',0
szCaptionMain db '记事本',0
szDllEdit db 'RichEd20.dll',0
szClassEdit db 'RichEdit20A',0
szNotFound db '字符串未找到!',0
szFilter db 'Text Files(*.txt)',0,'*.txt',0
db 'All Files(*.*)',0,'*.*',0,0
szDefaultExt db 'txt',0
szErrOpenFile db '无法打开文件!',0
szModify db '文件已修改,是否保存?',0
szFont db '宋体',0
;####################################################################
; 代码段
;####################################################################
.code
;####################################################################
; Richedit的流操作
;####################################################################
_ProcStream proc uses ebx edi esi _dwCookie,_lpBuffer,_dwBytes,_lpBytes
.if _dwCookie
invoke ReadFile,hFile,_lpBuffer,_dwBytes,_lpBytes,0
.else
invoke WriteFile,hFile,_lpBuffer,_dwBytes,_lpBytes,0
.endif
xor eax,eax
ret
_ProcStream endp
;####################################################################
; 保存文件,如果没有打开或创建文件则调用“另存为”子程序
;####################################################################
_SaveFile proc
local @stES:EDITSTREAM
mov @stES.dwCookie,FALSE
mov @stES.dwError,NULL
mov @stES.pfnCallback,offset _ProcStream
invoke SendMessage,hWinEdit,EM_STREAMOUT,SF_TEXT,addr @stES
invoke SendMessage,hWinEdit,EM_SETMODIFY,FALSE,0
ret
_SaveFile endp
;####################################################################
; 打开及输入文件
;####################################################################
_OpenFile proc
local @stOF:OPENFILENAME
local @stES:EDITSTREAM
;********************************************************************
; 显示“打开文件”对话框
;********************************************************************
invoke RtlZeroMemory,addr @stOF,sizeof @stOF
mov @stOF.lStructSize,sizeof @stOF
push hWinMain
pop @stOF.hwndOwner
mov @stOF.lpstrFilter,offset szFilter
mov @stOF.lpstrFile,offset szFileName
mov @stOF.nMaxFile,MAX_PATH
mov @stOF.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST
mov @stOF.lpstrDefExt,offset szDefaultExt
invoke GetOpenFileName,addr @stOF
.if eax
;********************************************************************
; 创建文件
;********************************************************************
invoke CreateFile,addr szFileName,GENERIC_READ or GENERIC_WRITE,\
FILE_SHARE_READ or FILE_SHARE_WRITE,0,OPEN_EXISTING,\
FILE_ATTRIBUTE_NORMAL,0
.if eax == INVALID_HANDLE_VALUE
invoke MessageBox,hWinMain,addr szErrOpenFile,\
NULL,MB_OK or MB_ICONSTOP
ret
.endif
push eax
.if hFile
invoke CloseHandle,hFile
.endif
pop eax
mov hFile,eax
;********************************************************************
; 读入文件
;********************************************************************
mov @stES.dwCookie,TRUE
mov @stES.dwError,NULL
mov @stES.pfnCallback,offset _ProcStream
invoke SendMessage,hWinEdit,EM_STREAMIN,\
SF_TEXT,addr @stES
invoke SendMessage,hWinEdit,EM_SETMODIFY,FALSE,0
.endif
ret
_OpenFile endp
;####################################################################
; 允许继续操作则返回TRUE
;####################################################################
_CheckModify proc
local @dwReturn
mov @dwReturn,TRUE
invoke SendMessage,hWinEdit,EM_GETMODIFY,0,0
.if eax && hFile
invoke MessageBox,hWinMain,addr szModify,\
addr szCaptionMain,\
MB_YESNOCANCEL or MB_ICONQUESTION
.if eax == IDYES
call _SaveFile
.elseif eax == IDCANCEL
mov @dwReturn,FALSE
.endif
.endif
mov eax,@dwReturn
ret
_CheckModify endp
;####################################################################
; 查找文字
;####################################################################
_FindText proc
local @stFindText:FINDTEXTEX
;********************************************************************
; 设置查找范围
;********************************************************************
invoke SendMessage,hWinEdit,EM_EXGETSEL,\
0,addr @stFindText.chrg
上页:第09章 通用控件 · 9.4 使用Richedit控件(1) 下页:第09章 通用控件 · 9.4 使用Richedit控件(3)
第09章 通用控件
版权所有 © 云南伯恩科技 证书:粤ICP备09170368号