📄 list_view.asm
字号:
.endif
.if (FindData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)
mov byte ptr[eax+3], 's'
.endif
INVOKE LoadListView, edi, addr FindData
inc edi
; .endif
.endif
INVOKE FindNextFile, hFind, addr FindData
.endw
INVOKE FindClose, hFind
.endif
ret
ReadTheFile endp
;=========================================================================
; Load the ListView with the file data PROCEDURE
;=========================================================================
LoadListView proc uses ebx edi row:DWORD, lpFind ; uses edi
LOCAL lvi:LV_ITEM
LOCAL sfi:SHFILEINFO
LOCAL DirSw:DWORD
LOCAL szBuff0[20]:BYTE, szBuff1[256]
INVOKE lstrcpy, addr szBuff1, addr szPath
mov edi, lpFind
;---------- [Load the list items] ----------
mov lvi.imask, LVIF_TEXT or LVIF_IMAGE or LVIF_PARAM
push row
pop lvi.iItem
push row
pop lvi.lParam
mov lvi.iSubItem, 0
lea eax, [edi.WIN32_FIND_DATA].cFileName
mov lvi.pszText, eax
INVOKE lstrcat, addr szBuff1, eax
mov lvi.iImage, 0
.if Cnt < 1000 && !TestSw
INVOKE SHGetFileInfo, addr szBuff1, 0, addr sfi, sizeof SHFILEINFO,\
SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_TYPENAME or SHGFI_ATTRIBUTES
mov eax, sfi.iIcon
mov lvi.iImage, eax
.else
.if byte ptr [edi.WIN32_FIND_DATA].cFileName == 'R'
mov lvi.iImage, 0
.elseif byte ptr [edi.WIN32_FIND_DATA].cFileName == 'G'
mov lvi.iImage, 1
.elseif byte ptr [edi.WIN32_FIND_DATA].cFileName == 'B'
mov lvi.iImage, 2
.endif
.endif
INVOKE SendMessage, hList, LVM_INSERTITEM, 0, addr lvi
;---------- [Load the sub items] ----------
and DirSw, 0
;---------- [Check for a Folder] ----------
.if byte ptr sfi.szTypeName+5 == 'F' && byte ptr sfi.szTypeName+10 == 'r'
or DirSw, 1
.endif
mov lvi.imask, LVIF_TEXT
inc lvi.iSubItem
;---------- [Get the file size] ----------
.if !DirSw
mov eax, MAXDWORD
mov ebx, [edi.WIN32_FIND_DATA].nFileSizeHigh
imul ebx
add eax, [edi.WIN32_FIND_DATA].nFileSizeLow
mov edx, eax
INVOKE BaseAscii, edx, addr szBuff0, 0, 10, 0, 0, 1
;---------- [Load the file size] ----------
lea eax, szBuff0
.else
lea eax, szDir
.endif
mov lvi.pszText, eax
INVOKE SendMessage, hList, LVM_SETITEM, 0, addr lvi
inc lvi.iSubItem
;---------- [Load the date] ----------
lea eax, cdt.dmo
mov lvi.pszText, eax
INVOKE SendMessage, hList, LVM_SETITEM, 1, addr lvi
inc lvi.iSubItem
;---------- [Load the attributes] ----------
lea eax, szArc
mov lvi.pszText, eax
INVOKE SendMessage, hList, LVM_SETITEM, 2, addr lvi
ret
LoadListView endp
;=========================================================================
; Resequence the lvi.iItem and copy to lvi.lParam PROCEDURE
;=========================================================================
Resequence proc uses edi
LOCAL lvi:LV_ITEM
INVOKE SendMessage, hList, LVM_GETITEMCOUNT, 0, 0
mov edi, eax
mov lvi.imask, LVIF_PARAM
mov lvi.iSubItem, 0
mov lvi.iItem, 0
.while (edi)
push lvi.iItem
pop lvi.lParam
INVOKE SendMessage, hList, LVM_SETITEM, 0, addr lvi
inc lvi.iItem
dec edi
.endw
ret
Resequence endp
;=========================================================================
; Display the file name PROCEDURE
;=========================================================================
DisplayFileName proc
LOCAL lvi:LV_ITEM
LOCAL szBuff[256]:BYTE
INVOKE SendMessage, hList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED
mov lvi.iItem, eax
mov lvi.iSubItem, 0
mov lvi.imask, LVIF_TEXT
lea eax, szBuff
mov lvi.pszText, eax
mov lvi.cchTextMax, 256
INVOKE SendMessage, hList, LVM_GETITEM, 0, addr lvi
INVOKE MessageBox, NULL, addr szBuff, addr AppName, MB_OK
ret
DisplayFileName endp
;=========================================================================
; Converts an ascii string to a 32 bit num value.
;=========================================================================
AsciiBase proc uses esi InPut:DWORD
;INVOKE AsciiBase, addr szBuff0
xor eax, eax
mov esi, InPut
xor ecx, ecx
xor edx, edx
mov al, [esi]
inc esi
.while al != 0
sub al, '0' ; Convert to bcd
lea ecx, [ecx+ecx*4] ; ecx = ecx * 5
lea ecx, [eax+ecx*2] ; ecx = eax + old ecx * 10
mov al, [esi]
inc esi
.endw
lea eax, [ecx+edx] ; Move to eax
ret
AsciiBase endp
;=========================================================================
; Converts a 32 bit num value to a Dec, Hex, Oct or Bin ascii string.
;=========================================================================
;INVOKE BaseAscii, cnt, addr num, 2, 10, 0, 1, 0
;InPut, OutPut, Length only needed if fill is on, Base, Insert commas, Left fill, Add terminating null
BaseAscii PROC InPut:DWORD, OutPut, Len, Base, Comma, Fill, TermA
LOCAL LBuff[32]: BYTE
pushad
xor esi, esi
mov eax, InPut ; Input
mov ebx, OutPut
mov byte ptr [ebx], '0'
.while (eax)
xor edx, edx
div Base ; Base 10, 16, 8, 2
add dl, 30h ; Convert to dec ASCII
mov LBuff[esi], dl
inc esi
.endw
xor edi, edi
mov ecx, esi
.if Len > ecx && Fill == 1 ; Zero fill
xor eax, eax
.while (eax < Len)
mov byte ptr [ebx+eax], '0'
inc eax
.endw
sub Len, ecx
add edi, Len
.endif
.while (ecx)
mov al, byte ptr LBuff[esi-1]
mov byte ptr [ebx+edi], al
inc edi
dec esi
dec ecx
.endw
.if TermA ; Insert a terminating char
mov byte ptr [ebx+edi], 0
.endif
popad
ret
BaseAscii ENDP
;=========================================================================
; Format the time and send it to the ConvDateTime structure
;=========================================================================
fmtime PROC time:SYSTEMTIME
MOVmw HoldT, time.wDay
INVOKE BaseAscii, HoldT, addr cdt.dda, 2, 10, 0, 1, 0
MOVmw HoldT, time.wMonth
INVOKE BaseAscii, HoldT, addr cdt.dmo, 2, 10, 0, 1, 0
MOVmw HoldT, time.wYear
INVOKE BaseAscii, HoldT, addr cdt.dyr, 4, 10, 0, 1, 0
MOVmw HoldT, time.wHour
INVOKE BaseAscii, HoldT, addr cdt.dhour, 2, 10, 0, 1, 0
MOVmw HoldT, time.wMinute
INVOKE BaseAscii, HoldT, addr cdt.dmin, 2, 10, 0, 1, 0
MOVmw HoldT, time.wSecond
INVOKE BaseAscii, HoldT, addr cdt.dsec, 2, 10, 0, 1, 0
lea eax, cdt.dmo
RET
fmtime ENDP
;=========================================================================
; ListViewSort PROCEDURE
;=========================================================================
ListViewSort proc uses edi lParam1:DWORD, lParam2, lParamSort
;INVOKE SendMessage, hList, LVM_SORTITEMS, 1, addr ListViewSort
LOCAL lvi:LV_ITEM
LOCAL Dir1:DWORD, Dir2
LOCAL szBuff0[256]:BYTE, szBuff1[256], Work[256]
and Dir1, 0
and Dir2, 0
mov lvi.imask, LVIF_TEXT
lea eax, szBuff0
mov lvi.pszText, eax
mov lvi.cchTextMax, 256
mov lvi.iSubItem, 1
INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam1, addr lvi
xor eax, eax
mov al, byte ptr szBuff0
mov Dir1, eax
INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam2, addr lvi
xor eax, eax
mov al, byte ptr szBuff0
mov Dir2, eax
.if lParamSort == 1 || lParamSort == 2
mov lvi.iSubItem, 0
INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam1, addr lvi
INVOKE lstrcpy, addr szBuff1, addr szBuff0
INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam2, addr lvi
.if lParamSort == 1
INVOKE lstrcmpi, addr szBuff1, addr szBuff0
.else
INVOKE lstrcmpi, addr szBuff0, addr szBuff1
.endif
.elseif lParamSort == 3 || lParamSort == 4
mov lvi.iSubItem, 1
INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam1, addr lvi
INVOKE AsciiBase, addr szBuff0
mov edi, eax
INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam2, addr lvi
INVOKE AsciiBase, addr szBuff0
.if lParamSort == 3
sub edi, eax
mov eax, edi
.else
sub eax, edi
.endif
.elseif lParamSort == 5 || lParamSort == 6
mov lvi.iSubItem, 2
INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam1, addr lvi
;---------- [Rearrange the date fields] ----------
INVOKE lstrcpy, addr Work, addr szBuff0+6
INVOKE lstrcpyn, addr Work+4, addr szBuff0, 6
INVOKE lstrcpyn, addr Work+9, addr szBuff0+11, 9
INVOKE lstrcpy, addr szBuff0, addr Work
INVOKE lstrcpy, addr szBuff1, addr szBuff0
INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam2, addr lvi
INVOKE lstrcpy, addr Work, addr szBuff0+6
INVOKE lstrcpyn, addr Work+4, addr szBuff0, 6
INVOKE lstrcpyn, addr Work+9, addr szBuff0+11, 9
INVOKE lstrcpy, addr szBuff0, addr Work
.if lParamSort == 5
INVOKE lstrcmpi, addr szBuff1, addr szBuff0
.else
INVOKE lstrcmpi, addr szBuff0, addr szBuff1
.endif
.endif
;---------- [Keep the folders on top] ----------
.if byte ptr Dir1 == '<' && byte ptr Dir2 != '<'
xor eax, eax
dec eax
ret
.elseif byte ptr Dir2 == '<' && byte ptr Dir1 != '<'
xor eax, eax
inc eax
ret
.elseif byte ptr Dir1 == '<' && byte ptr Dir2 == '<'
xor eax, eax
ret
.endif
ret
ListViewSort endp
end start
;INVOKE MessageBox, NULL, addr szPath, addr AppName, MB_OK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -