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号