📄 ztssplit.asm
字号:
invoke Split, addr strPath, addr strFolder, eax
invoke SendMessage, hProgress, PBM_SETPOS, 0, 0
.ELSE
invoke Merge, addr strPath, addr strFolder
invoke SendMessage, hProgress, PBM_SETPOS, 0, 0
.ENDIF
.ELSEIF eax==IDC_BTN_EXIT
invoke SendMessage, hWnd, WM_CLOSE, 0, 0
.ENDIF
.ELSEIF uMsg==WM_SYSCOMMAND
mov eax,wParam
movzx eax,ax
.IF eax==IDM_SYSMENU
invoke GetMenuState, hSysMenu, IDM_SYSMENU, MF_BYCOMMAND
.IF (eax & MF_CHECKED) ;判断菜单是否是选中的
invoke CheckMenuItem, hSysMenu, IDM_SYSMENU, MF_UNCHECKED
invoke SetWindowPos, hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE
.ELSE
invoke CheckMenuItem, hSysMenu, IDM_SYSMENU, MF_CHECKED
invoke SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE
.ENDIF
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
.ENDIF
.ELSEIF uMsg==WM_DROPFILES
invoke DragQueryFile, wParam, 0, addr strPath, MAX_PATH ;得到文件路径
invoke GetFileAttributes, addr strPath ;取得文件属性,判断是否文件夹
and eax, FILE_ATTRIBUTE_DIRECTORY
.IF eax ;如果是文件夹
invoke SetDlgItemText, hWnd, IDC_EDIT_FOLDER, addr strPath
invoke SetForegroundWindow, hWnd ;激活窗口
.IF bSplitOrMerge
invoke SetFocus, hEditSize ;“分割大小”编辑框得到焦点
.ELSE
invoke SetFocus, hBtnStart ;“分割/合并”按钮得到焦点
.ENDIF
.ELSE
.IF bSplitOrMerge ;当前为分割状态
invoke SetDlgItemText, hWnd, IDC_EDIT_FILE, addr strPath
invoke GetFolder, addr strFolder, addr strPath
invoke SetDlgItemText, hWnd, IDC_EDIT_FOLDER, addr strFolder
invoke SetForegroundWindow, hWnd ;激活窗口
invoke SetFocus, hEditSize ;“分割大小”编辑框得到焦点
.ELSE ;当前为合并状态
mov esi, offset strPath
invoke StrLen, addr strPath
add esi, eax
sub esi, 4
invoke lstrcmp, esi, addr strMergeExt ;判断最后 4 个字符是否为 ".mrg"
.IF eax==0
invoke SetDlgItemText, hWnd, IDC_EDIT_FILE, addr strPath
invoke GetFolder, addr strFolder, addr strPath
invoke SetDlgItemText, hWnd, IDC_EDIT_FOLDER, addr strFolder
invoke SetForegroundWindow, hWnd ;激活窗口
invoke SetFocus, hBtnStart ;“分割/合并”按钮得到焦点
.ENDIF
.ENDIF
.ENDIF
invoke DragFinish,wParam ;释放内存
.ELSE
mov eax,FALSE
ret
.ENDIF
mov eax,TRUE
ret
DlgProc endp
;==========================================
; 设置所有提示信息
;==========================================
SetToolTip proc hWnd:DWORD
local ti:TOOLINFO
mov ti.cbSize, sizeof TOOLINFO
mov ti.uFlags, TTF_SUBCLASS or TTF_IDISHWND
push hWnd
pop ti.hWnd
;先设置主界面提示信息
push hWnd
pop ti.uId
mov ti.lpszText, offset strMainTip
invoke SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti
;------------------------------------------------
; 设置其他控件的提示信息
;------------------------------------------------
;“分割文件”单选框提示信息
invoke GetDlgItem, hWnd, IDC_RADIO_SPLIT
mov ti.uId, eax
mov ti.lpszText, offset strSplitTip
invoke SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti
;“合并文件”单选框提示信息
invoke GetDlgItem, hWnd, IDC_RADIO_MERGE
mov ti.uId, eax
mov ti.lpszText, offset strMergeTip
invoke SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti
;“文件名”编辑框提示信息
invoke GetDlgItem, hWnd, IDC_EDIT_FILE
mov ti.uId, eax
mov ti.lpszText, offset strFileTip
invoke SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti
;“目录”编辑框提示信息
invoke GetDlgItem, hWnd, IDC_EDIT_FOLDER
mov ti.uId, eax
mov ti.lpszText, offset strFolderTip
invoke SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti
;“选择文件”按钮提示信息
invoke GetDlgItem, hWnd, IDC_BTN_FILE
mov ti.uId, eax
mov ti.lpszText, offset strBtnFileTip
invoke SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti
;“选择文件夹”按钮提示信息
invoke GetDlgItem, hWnd, IDC_BTN_FOLDER
mov ti.uId, eax
mov ti.lpszText, offset strBtnFolderTip
invoke SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti
;“分割大小”编辑框提示信息
invoke GetDlgItem, hWnd, IDC_EDIT_SIZE
mov ti.uId, eax
mov ti.lpszText, offset strSizeTip
invoke SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti
;“KB”单选框提示信息
invoke GetDlgItem, hWnd, IDC_RADIO_KB
mov ti.uId, eax
mov ti.lpszText, offset strKbTip
invoke SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti
;“MB”单选框提示信息
invoke GetDlgItem, hWnd, IDC_RADIO_MB
mov ti.uId, eax
mov ti.lpszText, offset strMbTip
invoke SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti
;进度条提示信息
invoke GetDlgItem, hWnd, IDC_PROGRESS
mov ti.uId, eax
mov ti.lpszText, offset strProgressTip
invoke SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti
;“分割/合并”按钮提示信息
invoke GetDlgItem, hWnd, IDC_BTN_START
mov ti.uId, eax
mov ti.lpszText, offset strStartTip
invoke SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti
;“退出”按钮提示信息
invoke GetDlgItem, hWnd, IDC_BTN_EXIT
mov ti.uId, eax
mov ti.lpszText, offset strExitTip
invoke SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti
ret
SetToolTip endp
;==========================================
; 根据文件名得到文件夹
;==========================================
GetFolder proc lpFolder:HWND, lpFile:DWORD
;把 lpFile 地址处的字符串传送到 lpFolder 地址处
mov esi, lpFile
mov edi, lpFolder
invoke StrLen, lpFile
mov ecx, eax
rep movsd
mov esi, lpFolder ; esi 指向 lpFolder,也就是字符串开始的位置
add esi, eax ; esi 加上 eax(字符串长度)后指向字符串结束的位置
dec esi ; esi 指向字符串末尾的一个字符
;从字符串末尾向前测试每一个字符,如果为 '\' 则说明再往前就是文件夹
labelTest:
cmp BYTE ptr [esi], '\'
je labelExit
dec esi
jmp labelTest
labelExit:
inc esi
mov BYTE ptr [esi], 0
ret
GetFolder endp
;==========================================
; “分割大小”编辑框窗口过程
; 当窗口获得焦点时选中所有文本
;==========================================
SizeEditProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_SETFOCUS
mov bSizeEditFocus, TRUE ;拥有焦点
invoke SendMessage, hWnd, EM_SETSEL, 0, -1 ;选中全部文本
invoke CallWindowProc, OldSizeEditProc, hWnd, uMsg, wParam, lParam
ret
.ELSEIF uMsg==WM_LBUTTONDOWN
.IF !bSizeEditFocus ;如果没有焦点
invoke SetFocus, hWnd ;则设置焦点
.ELSE ;如果已经有焦点,则按缺省处理
invoke CallWindowProc, OldSizeEditProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
.ELSEIF uMsg==WM_KILLFOCUS
mov bSizeEditFocus, FALSE ;失去焦点
invoke CallWindowProc, OldSizeEditProc, hWnd, uMsg, wParam, lParam
ret
.ELSE
invoke CallWindowProc, OldSizeEditProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
xor eax, eax
ret
SizeEditProc endp
;==================================================
; “文件名”编辑框窗口过程
; 当窗口获得焦点时光标滚到最后,方便修改
; 当窗口失去焦点时光标滚到最前,方便观看
;==================================================
FileEditProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_SETFOCUS
mov bFileEditFocus, TRUE ;拥有焦点
invoke SendMessage, hWnd, WM_GETTEXTLENGTH, 0, 0 ;取得文本长度
invoke SendMessage, hWnd, EM_SETSEL, eax, eax ;光标滚到最后
invoke CallWindowProc, OldFileEditProc, hWnd, uMsg, wParam, lParam
ret
.ELSEIF uMsg==WM_LBUTTONDOWN
.IF !bFileEditFocus ;如果没有焦点
invoke SetFocus, hWnd ;则设置焦点
.ELSE ;如果已经有焦点,则按缺省处理
invoke CallWindowProc, OldFileEditProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
.ELSEIF uMsg==WM_KILLFOCUS
mov bFileEditFocus, FALSE ;失去焦点
invoke SendMessage, hWnd, EM_SETSEL, 0, 0 ;光标滚到最前
invoke CallWindowProc, OldFileEditProc, hWnd, uMsg, wParam, lParam
ret
.ELSE
invoke CallWindowProc, OldFileEditProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
xor eax, eax
ret
FileEditProc endp
;==================================================
; “目录”编辑框窗口过程
; 当窗口获得焦点时光标滚到最后,方便修改
; 当窗口失去焦点时光标滚到最前,方便观看
;==================================================
FolderEditProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_SETFOCUS
mov bFolderEditFocus, TRUE ;拥有焦点
invoke SendMessage, hWnd, WM_GETTEXTLENGTH, 0, 0 ;取得文本长度
invoke SendMessage, hWnd, EM_SETSEL, eax, eax ;光标滚到最后
invoke CallWindowProc, OldFolderEditProc, hWnd, uMsg, wParam, lParam
ret
.ELSEIF uMsg==WM_LBUTTONDOWN
.IF !bFolderEditFocus ;如果没有焦点
invoke SetFocus, hWnd ;则设置焦点
.ELSE ;如果已经有焦点,则按缺省处理
invoke CallWindowProc, OldFolderEditProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
.ELSEIF uMsg==WM_KILLFOCUS
mov bFolderEditFocus, FALSE ;失去焦点
invoke SendMessage, hWnd, EM_SETSEL, 0, 0 ;光标滚到最前
invoke CallWindowProc, OldFolderEditProc, hWnd, uMsg, wParam, lParam
ret
.ELSE
invoke CallWindowProc, OldFolderEditProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
xor eax, eax
ret
FolderEditProc endp
;=========================================
; 分割过程
; 参数:待分割文件,存放目录,分割大小
;=========================================
Split proc lpfile:DWORD, lpfolder:DWORD, blocksize:DWORD
local hSourceFile, hDestFile:DWORD
local hMrgFile:DWORD
local buffer[1024]:BYTE ;缓冲区
local sourcefilename[128]:BYTE ;被分割的文件名(包括扩展名)
local filetitle[128]:BYTE ;文件名(不包括扩展名)
local fileExt[10]:BYTE ;扩展名
local filename[128]:BYTE ;文件名(包括路径和扩展名)
local ActualReaded:DWORD ;实际读出来的字节
local BufCount:DWORD ;记录每个分割文件已经写入的字节
local number:DWORD ;分割文件的个数
;没指定需要分割的文件
mov esi, lpfile
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -