📄 opensave.asm
字号:
_InitOpenSaveDlg proto
_GetOpenFileName proto:DWORD ,:DWORD
_GetSaveFileName proto:DWORD ,:DWORD
_GetOpenFile PROTO:DWORD
_GetSaveFile PROTO:DWORD
_OpenFile proto:DWORD
_SaveFile proto:DWORD
_GetModify proto
.data?
ofn_open OPENFILENAME <?>
ofn_save OPENFILENAME <?>
szFileter db 255 dup(?)
;DEBUG=0
.code
;----------------打开文件------------
_InitOpenSaveDlg proc
m2m ofn_open.hwndOwner,hWnd
m2m ofn_open.hInstance,hInstance
mov ofn_open.lStructSize,sizeof ofn_open
mov ofn_open.lpstrFile,offset szFileName
mov ofn_open.nMaxFile,MAX_PATH
invoke _IniGetStr,0,ctext('fileter')
mov eax,lpIniBuf
invoke lstrcpy,addr szFileter,eax
push eax
.while BYTE ptr [eax]
.if BYTE ptr [eax]=='|'
mov BYTE ptr [eax],0
.endif
inc eax
.endw
pop ofn_open.lpstrFilter
invoke RtlMoveMemory,addr ofn_save,addr ofn_open,sizeof OPENFILENAME
mov ofn_open.Flags,OFN_HIDEREADONLY or OFN_FILEMUSTEXIST or OFN_EXPLORER
mov ofn_save.Flags,OFN_HIDEREADONLY or OFN_OVERWRITEPROMPT
ret
_InitOpenSaveDlg endp
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
_GetOpenFileName proc,lpBuf,@hwnd
mov eax,lpBuf
mov BYTE ptr [eax],0
mov ofn_open.lpstrFile,eax
m2m ofn_open.hwndOwner,@hwnd
invoke GetOpenFileName,addr ofn_open
.if eax
mov eax,ofn_open.lpstrFile
.endif
ret
_GetOpenFileName endp
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
_GetSaveFileName proc lpBuf,@hwnd
mov eax,lpBuf
mov BYTE ptr [eax],0
mov ofn_save.lpstrFile,eax
m2m ofn_open.hwndOwner,@hwnd
invoke GetSaveFileName,addr ofn_save
.if eax
mov eax,ofn_save.lpstrFile
.endif
ret
_GetSaveFileName endp
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
_OpenFile proc uses ecx esi edi lpFile
local @szBuf[MAX_PATH ]:BYTE ,nSize
local @hFile,@FileLen,byteReaded,wParam
invoke CreateFile,lpFile,GENERIC_READ or GENERIC_WRITE ,0,0,OPEN_EXISTING,0,0
cmp eax,INVALID_HANDLE_VALUE
jz _err_
mov @hFile,eax
invoke GetFileSize,eax,NULL
mov nSize,eax
.if eax>HUGE_FILE
;内存映射的方法打开
invoke MessageBox,hWnd,addr szHugeFile,addr szAppName,20h+MB_OKCANCEL
.if eax==IDCANCEL
invoke CloseHandle,@hFile
xor eax,eax
ret
.else
invoke lstrcmpi,lpFile,addr szFileName
.if eax==0
ret
.endif
invoke CreateFileMapping,@hFile,0,PAGE_READWRITE ,0,0,0
test eax,eax
jz _err_
mov wParam, eax
invoke MapViewOfFile,eax, FILE_MAP_WRITE,0,0,0
test eax,eax
jz _err_
push eax
call _Release
pop lpMemFile
invoke EnableMenuItem,hMenu,1003,MF_GRAYED ;保存,另存为不可用
invoke EnableMenuItem,hMenu,1004,MF_GRAYED
invoke CloseHandle,wParam
mov dwFileType,FILE_MAP
.endif
.else
;一般的方法打开文件
add eax,EXTRASIZE
__alloc eax
test eax,eax
jz _err_
push eax
lea ecx,wParam
invoke ReadFile,@hFile,eax,nSize,ecx,0
invoke EnableMenuItem,hMenu,1003,MF_ENABLED ;保存,另存为可用
invoke EnableMenuItem,hMenu,1004,MF_ENABLED
call _Release
pop lpMemFile
mov dwFileType,FILE_NORMAL
.endif
invoke _HisMenuAdd,lpFile;添加到历史文件
invoke CloseHandle,@hFile
m2m dwFileSize,nSize
invoke _InitData ,0
invoke _SetWindowTitle,hWnd,lpFile
invoke lstrcpy,addr szFileName,lpFile
call _ReDraw
and FLAG_ALL,NOT FLAG_FILECHANGE
mov eax,TRUE
jmp _ret_
_err_:
call _ShowError
_ret_:
ret
_OpenFile endp
;-------------------保存文件-------------
_SaveFile proc uses edi esi ecx lpFile
local @hFile,wParam
local @szBuf[255]:BYTE
invoke CreateFile,lpFile,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0
cmp eax,INVALID_HANDLE_VALUE
je _err_
mov @hFile,eax
invoke WriteFile,@hFile,lpMemFile,dwFileSize,addr wParam,NULL
test eax,eax
jz _err_
invoke CloseHandle,@hFile
.if dwFileType==FILE_NORMAL
invoke _SetWindowTitle,hWnd,lpFile
invoke lstrcpy,addr szFileName,lpFile
invoke _HisMenuAdd,lpFile
.endif
and FLAG_ALL,not FLAG_FILECHANGE
mov eax,TRUE
jmp _ret_
_err_:
call _ShowError
_ret_:
ret
_SaveFile endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -