?? ztssplit v1.11.asm
字號:
;*************************************************************
;* Author: 一塊三毛錢
;* E_mail: crazy_soft@163.net
;* Homepage: http://zhongts.yeah.net
;*************************************************************
;* Compile: Hutch's Masm32
;* Create Time: 2002.6.5
;* Modify: 2003.10.17
;* Description: 文件分割器 V1.11
;*************************************************************
.386
.model flat,stdcall
option casemap:none
;****************************************************************************************
include ztsSplit V1.11.inc
;****************************************************************************************
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
SetToolTip proto :DWORD
GetFolder proto :DWORD,:DWORD
SizeEditProc proto :DWORD,:DWORD,:DWORD,:DWORD
FileEditProc proto :DWORD,:DWORD,:DWORD,:DWORD
FolderEditProc proto :DWORD,:DWORD,:DWORD,:DWORD
Split proto :DWORD,:DWORD,:DWORD
Merge proto :DWORD,:DWORD
;****************************************************************************************
.data
AppName db "ztsSplit",0
DlgName db "DLG_MAIN",0
TooltipClassName db "Tooltips_class32",0
strSysMenu db "窗口處在最上",0
strBtnStart01 db "分割(&C)",0
strBtnStart02 db "合并(&M)",0
strMergeExt db ".mrg",0
strTitleSplit db "選擇要分割的文件",0
strTitleMerge db "選擇要合并的文件",0
strFilterSplit db "所有文件(*.*)",0,"*.*",0,0
strFilterMerge db "合并信息文件(*.mrg)",0,"*.mrg",0,0
strBrowseTitle db "選擇文件存放目錄:",0
strError01 db "打開文件出錯",0
strError02 db "文件創建錯誤",0
strError03 db "文件太小,不需要分割",0
strError04 db "請先指定分割的大小",0
strError05 db "請先選擇需要分割/合并的文件",0
strError06 db "請選擇分割/合并后文件存放的目錄",0
strError07 db "沒有合并信息,不能正確合并文件",0
strCopyright db "ztsmrg1.1該文件由分割軟件 ztsSplit 生成",0
format1 db "%03d",0
.data?
hInstance HINSTANCE ?
hMainWnd dd ?
hToolTip dd ? ;工具提示控件的句柄
hSysMenu dd ? ;系統菜單句柄
hProgress dd ? ;進度條句柄
hEditFile dd ? ;文件名編輯框句柄
hEditFolder dd ? ;目錄編輯框句柄
hEditSize dd ? ;分割大小編輯框句柄
hBtnStart dd ? ;分割/合并按鈕的句柄
hBtnExit dd ? ;退出按鈕的句柄
hBtnFile dd ?
hBtnFolder dd ?
bSplitOrMerge BOOL ? ;分割還是合并
bKbOrMb BOOL ? ;分割大小的單位是 KB 還是 MB
bSizeEditFocus BOOL ? ;“分割大小”編輯框是否擁有焦點
bFileEditFocus BOOL ? ;“文件名”編輯框是否擁有焦點
bFolderEditFocus BOOL ? ;“目錄”編輯框是否擁有焦點
strPath db MAX_PATH dup (?) ;接收拖動來的文件名
strFolder db MAX_PATH dup (?) ;文件所在的目錄
strFileName db MAX_PATH dup (?) ;可執行文件路徑
strModuleDir db MAX_PATH dup (?) ;可執行文件所在的目錄
strIniFilePath db MAX_PATH dup (?)
ofn OPENFILENAME <?>
bi BROWSEINFO <?>
OldSizeEditProc dd ?
OldFileEditProc dd ?
OldFolderEditProc dd ?
;****************************************************************************************
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,addr DlgName,NULL,addr DlgProc,0
invoke ExitProcess,eax
invoke InitCommonControls
;對話框窗口過程**************************************************************************
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
local rect:RECT
local pt:POINT
.IF uMsg==WM_CLOSE
invoke EndDialog, hWnd, NULL
.ELSEIF uMsg==WM_INITDIALOG
push hWnd
pop hMainWnd
;設置圖標
invoke LoadIcon, hInstance, IDI_MAIN
invoke SendMessage, hWnd, WM_SETICON, ICON_SMALL, eax
;添加系統菜單項:“窗口處在最上”
invoke GetSystemMenu, hWnd, FALSE ;取得系統菜單的句柄
mov hSysMenu, eax ;句柄 => hSysMenu
invoke AppendMenu, hSysMenu, MF_SEPARATOR, NULL,NULL ;插入分隔線
invoke AppendMenu, hSysMenu, MF_STRING or MF_CHECKED, IDM_SYSMENU, addr strSysMenu ;插入"窗口處在最上"菜單
invoke SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE
;取得幾個控件的句柄
invoke GetDlgItem, hWnd, IDC_PROGRESS
mov hProgress, eax
invoke GetDlgItem, hWnd, IDC_EDIT_FILE
mov hEditFile, eax
invoke GetDlgItem, hWnd, IDC_EDIT_FOLDER
mov hEditFolder, eax
invoke GetDlgItem, hWnd, IDC_EDIT_SIZE
mov hEditSize, eax
invoke GetDlgItem, hWnd, IDC_BTN_START
mov hBtnStart, eax
invoke GetDlgItem, hWnd, IDC_BTN_EXIT
mov hBtnExit, eax
invoke GetDlgItem, hWnd, IDC_BTN_FILE
mov hBtnFile, eax
invoke GetDlgItem, hWnd, IDC_BTN_FOLDER
mov hBtnFolder, eax
;初始化為“分割文件”“KB”方式
invoke GetDlgItem, hWnd, IDC_RADIO_SPLIT
invoke SendMessage, eax, BM_SETCHECK,BST_CHECKED,0
mov bSplitOrMerge, TRUE
invoke GetDlgItem, hWnd, IDC_RADIO_KB
invoke SendMessage, eax, BM_SETCHECK,BST_CHECKED,0
mov bKbOrMb, TRUE
;創建工具提示控件
invoke CreateWindowEx, NULL, addr TooltipClassName, NULL, TTS_ALWAYSTIP, \
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, \
NULL, NULL, hInstance, NULL
mov hToolTip, eax
invoke SetWindowPos, hToolTip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE
;設置所有的提示信息
invoke SetToolTip, hWnd
;子類化編輯框控件
invoke SetWindowLong, hEditSize, GWL_WNDPROC, addr SizeEditProc
mov OldSizeEditProc, eax
mov bSizeEditFocus, FALSE
invoke SetWindowLong, hEditFile, GWL_WNDPROC, addr FileEditProc
mov OldFileEditProc, eax
mov bFileEditFocus, FALSE
invoke SetWindowLong, hEditFolder, GWL_WNDPROC, addr FolderEditProc
mov OldFolderEditProc, eax
mov bFolderEditFocus, FALSE
invoke SetFocus, hEditFile ;設置焦點,加了這條語句后下面要用 mov eax, FLASE / ret ,否則無效
mov eax, FALSE
ret
.ELSEIF uMsg==WM_COMMAND
mov eax, wParam
and eax, 0ffffh
.IF eax==IDC_RADIO_SPLIT ;切換到分割狀態
.IF !bSplitOrMerge
invoke GetDlgItem, hWnd, IDC_EDIT_SIZE
invoke EnableWindow, eax, TRUE
invoke GetDlgItem, hWnd, IDC_RADIO_KB
invoke EnableWindow, eax, TRUE
invoke GetDlgItem, hWnd, IDC_RADIO_MB
invoke EnableWindow, eax, TRUE
invoke GetDlgItem, hWnd, IDC_BTN_START
invoke SetWindowText, eax, addr strBtnStart01
mov bSplitOrMerge, TRUE
.ENDIF
.ELSEIF eax==IDC_RADIO_MERGE ;切換到合并狀態
.IF bSplitOrMerge
invoke GetDlgItem, hWnd, IDC_EDIT_SIZE
invoke EnableWindow, eax, FALSE
invoke GetDlgItem, hWnd, IDC_RADIO_KB
invoke EnableWindow, eax, FALSE
invoke GetDlgItem, hWnd, IDC_RADIO_MB
invoke EnableWindow, eax, FALSE
invoke GetDlgItem, hWnd, IDC_BTN_START
invoke SetWindowText, eax, addr strBtnStart02
mov bSplitOrMerge, FALSE
.ENDIF
.ELSEIF eax==IDC_RADIO_KB ;分割大小的單位是 KB
.IF !bKbOrMb
mov bKbOrMb, TRUE
invoke SetFocus, hEditSize ;“分割大小”編輯框得到焦點
.ENDIF
.ELSEIF eax==IDC_RADIO_MB ;分割大小的單位是 MB
.IF bKbOrMb
mov bKbOrMb, FALSE
invoke SetFocus, hEditSize ;“分割大小”編輯框得到焦點
.ENDIF
.ELSEIF eax==IDC_BTN_FILE ;選擇要分割/合并的文件
mov ofn.lStructSize, sizeof ofn
push hWnd
pop ofn.hwndOwner
push hInstance
pop ofn.hInstance
mov ofn.lpstrFile, offset strPath ;接收文件名
mov ofn.nMaxFile, MAX_PATH
mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_HIDEREADONLY or OFN_EXPLORER or OFN_LONGNAMES
.IF bSplitOrMerge ;分割狀態
mov ofn.lpstrFilter, offset strFilterSplit ;文件過濾器
mov ofn.lpstrTitle, offset strTitleSplit ;標題文本
.ELSE ;合并狀態
mov ofn.lpstrFilter, offset strFilterMerge ;文件過濾器
mov ofn.lpstrTitle, offset strTitleMerge ;標題文本
.ENDIF
invoke GetOpenFileName, addr ofn
.IF eax
invoke SetDlgItemText, hWnd, IDC_EDIT_FILE, addr strPath
invoke GetFolder, addr strFolder, addr strPath
invoke SetDlgItemText, hWnd, IDC_EDIT_FOLDER, addr strFolder
.IF bSplitOrMerge
invoke SetFocus, hEditSize ;“分割大小”編輯框得到焦點
.ELSE
invoke SetFocus, hBtnStart ;“分割/合并”按鈕得到焦點
.ENDIF
.ENDIF
.ELSEIF eax==IDC_BTN_FOLDER ;選擇分割/合并后文件的存放目錄
invoke RtlZeroMemory, addr bi, sizeof BROWSEINFO ;內存清零
push hWnd
pop bi.hwndOwner
mov eax, offset strFolder ;接收目錄字符串
mov bi.pszDisplayName, eax
mov eax, offset strBrowseTitle ;目錄選擇框上面的文本
mov bi.lpszTitle, eax
mov bi.ulFlags, BIF_RETURNONLYFSDIRS ;選擇目錄
invoke SHBrowseForFolder, addr bi
.IF eax
invoke SHGetPathFromIDList, eax, addr strFolder ;轉換 PIDL 為目錄名
invoke StrLen, addr strFolder ;取得字符串長度
mov esi, offset strFolder ;esi 指向開始的位置
add esi, eax ;esi 指向結束的位置
cmp BYTE ptr [esi-1], '\' ;判斷是不是以'\'結尾
je labelExit
mov BYTE ptr [esi], '\' ;如果不是則添加一個'\'
mov BYTE ptr [esi+1], 0
labelExit:
invoke SetDlgItemText, hWnd, IDC_EDIT_FOLDER, addr strFolder
invoke SetForegroundWindow, hWnd ;激活窗口
.IF bSplitOrMerge
invoke SetFocus, hEditSize ;“分割大小”編輯框得到焦點
.ELSE
invoke SetFocus, hBtnStart ;“分割/合并”按鈕得到焦點
.ENDIF
.ENDIF
.ELSEIF eax==IDC_BTN_START
invoke EnableWindow,hBtnStart,FALSE
.IF bSplitOrMerge
invoke GetDlgItemInt, hWnd, IDC_EDIT_SIZE, NULL, FALSE
.IF bKbOrMb
shl eax, 10
.ELSE
shl eax, 20
.ENDIF
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
invoke EnableWindow,hBtnStart,TRUE
.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 ;激活窗口
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -