?? ztssplit v1.11.asm
字號:
.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[256]:BYTE ;被分割的文件名(包括擴展名)
local filetitle[256]:BYTE ;文件名(不包括擴展名)
local fileExt[10]:BYTE ;擴展名
local filename[MAX_PATH]:BYTE ;文件名(包括路徑和擴展名)
local ActualReaded:DWORD ;實際讀出來的字節
local BufCount:DWORD ;記錄每個分割文件已經寫入的字節
local number:DWORD ;分割文件的個數
pushad
;沒指定需要分割的文件
mov esi, lpfile
mov al, byte ptr [esi]
.IF al == 0
invoke MessageBox, hMainWnd, addr strError05, addr AppName, MB_OK or MB_ICONERROR
popad
ret
.ENDIF
;沒指定分割后文件存放的目錄
mov esi, lpfolder
mov al, byte ptr [esi]
.IF al == 0
invoke MessageBox, hMainWnd, addr strError06, addr AppName, MB_OK or MB_ICONERROR
popad
ret
.ENDIF
;沒指定分割大小
.IF blocksize==0
invoke MessageBox, hMainWnd, addr strError04, addr AppName, MB_OK or MB_ICONERROR
popad
ret
.ENDIF
;打開文件失敗
invoke CreateFile, lpfile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL
.IF eax==INVALID_HANDLE_VALUE
invoke MessageBox, hMainWnd, addr strError01, addr AppName, MB_OK or MB_ICONERROR
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -