📄 list_view.asm
字号:
mov eax, [edi.NMHDR].hwndFrom
.if eax == hList
.if [edi.NMHDR].code == LVN_COLUMNCLICK
.if [edi.NM_LISTVIEW].iSubItem == 0
.if !SortN
INVOKE SendMessage, hList, LVM_SORTITEMS, 1, addr ListViewSort
call Resequence
or SortN, 1
.else
INVOKE SendMessage, hList, LVM_SORTITEMS, 2, addr ListViewSort
call Resequence
and SortN, 0
.endif
.elseif [edi.NM_LISTVIEW].iSubItem == 1
.if !SortS
INVOKE SendMessage, hList, LVM_SORTITEMS, 3, addr ListViewSort
call Resequence
or SortS, 1
.else
INVOKE SendMessage, hList, LVM_SORTITEMS, 4, addr ListViewSort
call Resequence
and SortS, 0
.endif
.elseif [edi.NM_LISTVIEW].iSubItem == 2
.if !SortD
INVOKE SendMessage, hList, LVM_SORTITEMS, 5, addr ListViewSort
call Resequence
or SortD, 1
.else
INVOKE SendMessage, hList, LVM_SORTITEMS, 6, addr ListViewSort
call Resequence
and SortD, 0
.endif
.endif
.elseif [edi.NMHDR].code == NM_DBLCLK
INVOKE ReleaseCapture
call DisplayFileName
.elseif [edi.NMHDR].code == LVN_BEGINDRAG
mov eax, [edi.NM_LISTVIEW].iItem
mov ItemID, eax
mov DragMode, 1
and Diff, 0
INVOKE SetCapture, hWnd
INVOKE GetCursorPos, addr pt
INVOKE ScreenToClient, hList, addr pt
mov eax, pt.x
mov lvhit.pt.x, eax
mov eax, pt.y
mov lvhit.pt.y, eax
INVOKE SendMessage, hList, LVM_HITTEST, 0, addr lvhit
.if (lvhit.flags & LVHT_ONITEM)
INVOKE GetWindowRect, hList, addr rect
add rect.top, 2
INVOKE ClipCursor, addr rect
INVOKE SendMessage, hList, LVM_GETVIEWRECT, 0, addr rect
mov eax, rect.top
.if eax > 7fffffffh
neg eax
add rect.bottom, eax
.endif
sub rect.bottom, 66
mov rect.top, 2
INVOKE SendMessage, hList, LVM_GETITEMPOSITION, ItemID, addr pt
push pt.y
pop Diff
mov eax, lvhit.pt.y
.if Diff > eax
sub Diff, eax
.else
and Diff, 0
.endif
.endif
.endif
.endif
pop edi
.elseif wmsg == WM_MOUSEMOVE
.if DragMode
; INVOKE SendMessage, hList, LVM_ENSUREVISIBLE, ItemID, 0
INVOKE SendMessage, hList, LVM_GETITEMPOSITION, ItemID, addr pt
.if pt.x >= 0 && pt.y >= 0
INVOKE GetCursorPos, addr pt
INVOKE ScreenToClient, hList, addr pt
.if pt.x < 21 && LargeBMP || pt.x > 9000 && LargeBMP
mov pt.x, 21
.elseif pt.x > 9000 && !LargeBMP
mov pt.x, 0
.endif
push pt.y
pop eax
.if eax < rect.top && LargeBMP
push rect.top
pop pt.y
jmp Pass
.elseif eax > rect.bottom && LargeBMP
push rect.bottom
pop pt.y
jmp Pass
.elseif pt.y > 9000 && !LargeBMP
mov pt.y, 0
.endif
mov eax, Diff
add pt.y, eax
Pass:
INVOKE SendMessage, hList, LVM_SETITEMPOSITION32, ItemID, addr pt
mov lvi.imask, LVIF_STATE
mov lvi.state, 0
.endif
.endif
.elseif wmsg == WM_LBUTTONUP
and DragMode, 0
INVOKE ClipCursor, 0
INVOKE ReleaseCapture
.elseif wmsg == WM_SIZE
mov eax, lparam
mov edx, eax
and eax, 0ffffh
shr edx, 16
INVOKE MoveWindow, hList, 0, 0, eax, edx, TRUE
.elseif wmsg == WM_DESTROY
GetOut:
INVOKE ImageList_Destroy, hImageTestS
INVOKE ImageList_Destroy, hImageTestL
INVOKE PostQuitMessage, NULL
.else
DefWin:
INVOKE DefWindowProc, hwnd, wmsg, wparam, lparam
ret
.endif
Ret0:
xor eax, eax
ret
WndProc endp
;=========================================================================
; InitListView PROCEDURE
;=========================================================================
InitListView proc
LOCAL sfi:SHFILEINFO
LOCAL lvc:LV_COLUMN
; or LVS_SORTASCENDING
INVOKE CreateWindowEx, WS_EX_CLIENTEDGE, addr ListViewClass, NULL,\
WS_CHILD or WS_VISIBLE or LVS_REPORT or LVS_SHAREIMAGELISTS,\
0, 0, 0, 0, hWnd, NULL, hInst, NULL
mov hList, eax
mov eax, LVS_EX_FULLROWSELECT or LVS_EX_HEADERDRAGDROP or\
LVS_EX_SUBITEMIMAGES or LVS_EX_GRIDLINES
INVOKE SendMessage, hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, eax
INVOKE ImageList_Create, 16, 16, ILC_COLOR32, 3, 0
mov hImageTestS, eax
INVOKE LoadBitmap, hInst, IDB_BITMAPS
mov hBitmap, eax
INVOKE ImageList_Add, hImageTestS, hBitmap, NULL
INVOKE DeleteObject, hBitmap
INVOKE ImageList_Create, 32, 32, ILC_COLOR32, 3, 0
mov hImageTestL, eax
INVOKE LoadBitmap, hInst, IDB_BITMAPL
mov hBitmap, eax
INVOKE ImageList_Add, hImageTestL, hBitmap, NULL
INVOKE DeleteObject, hBitmap
INVOKE SHGetFileInfo, addr szRootPath, 0, addr sfi, sizeof SHFILEINFO,\
SHGFI_SYSICONINDEX or SHGFI_SMALLICON
mov hImageListS, eax
INVOKE SHGetFileInfo, addr szRootPath, 0, addr sfi, sizeof SHFILEINFO,\
SHGFI_SYSICONINDEX or SHGFI_LARGEICON
mov hImageListL, eax
INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_SMALL, hImageListS
INVOKE GetCurrentDirectory, lengthof szPath, addr szPath
.if byte ptr szPath+2 != '\' || eax > 3
INVOKE lstrcat, addr szPath, addr szSlashB
.endif
INVOKE SearchTreeForFile, addr szPath, addr szFile, addr szRoot
.if eax
INVOKE lstrlen, addr szRoot
sub eax, 12
INVOKE lstrcpyn, addr szRoot, addr szRoot, eax
.endif
INVOKE lstrcpy, addr lf.lfFaceName, addr FontMS
mov lf.lfHeight, -12
mov lf.lfWeight, 600
INVOKE CreateFontIndirect, addr lf
mov hFontL, eax ; Listview font
INVOKE SendMessage, hList, WM_SETFONT, hFontL, 1
INVOKE SendMessage, hList, LVM_SETTEXTCOLOR, 0, 00ffff00h
INVOKE SendMessage, hList, LVM_SETBKCOLOR, 0, 00000000h
INVOKE SendMessage, hList, LVM_SETTEXTBKCOLOR, 0, 00000000h
INVOKE GetMenu, hWnd
mov hMenu, eax
INVOKE CheckMenuRadioItem, hMenu, IDM_LARGEICON, IDM_LIST, IDM_REPORT, MF_BYCOMMAND or MF_CHECKED
mov lvc.imask, LVCF_TEXT or LVCF_WIDTH
mov lvc.pszText, offset szColName
mov lvc.lx, 150
INVOKE SendMessage, hList, LVM_INSERTCOLUMN, 0, addr lvc
or lvc.imask, LVCF_FMT
mov lvc.fmt, LVCFMT_RIGHT
mov lvc.pszText, offset szColSize
mov lvc.lx, 65
INVOKE SendMessage, hList, LVM_INSERTCOLUMN, 1, addr lvc
mov lvc.fmt, LVCFMT_LEFT
mov lvc.pszText, offset szColDate
mov lvc.lx, 135
INVOKE SendMessage, hList, LVM_INSERTCOLUMN, 2, addr lvc
mov lvc.fmt, LVCFMT_LEFT
mov lvc.pszText, offset szColAttr
mov lvc.lx, 38
INVOKE SendMessage, hList, LVM_INSERTCOLUMN, 3, addr lvc
call ReadTheFile
ret
InitListView endp
;=========================================================================
; Browse for folder PROCEDURE
;=========================================================================
BrowseForFolder proc
LOCAL pidl:DWORD
pushad
push hWnd
pop bri.hwndOwner
mov bri.pidlRoot, 0
mov bri.pszDisplayName, 0
mov eax, offset szSelect
mov bri.lpszTitle, eax
mov bri.ulFlags, BIF_RETURNONLYFSDIRS or BIF_DONTGOBELOWDOMAIN
mov bri.lpfn, 0
mov bri.lParam, 0
mov bri.iImage, 0
INVOKE SHBrowseForFolder, addr bri
.if !eax
jmp GetOut
.endif
mov pidl, eax
INVOKE SHGetPathFromIDList, pidl, addr szPath
INVOKE lstrcat, addr szPath, addr szSlashB
INVOKE SendMessage, hList, LVM_DELETEALLITEMS, 0, 0
INVOKE CoTaskMemFree, pidl
.if TestSw
and TestSw, 0
INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_SMALL, hImageListS
.endif
call ReadTheFile
.if LargeBMP
INVOKE SendMessage, hWnd, WM_COMMAND, IDM_LARGEICON, 0
.endif
GetOut:
popad
ret
BrowseForFolder endp
;=========================================================================
; Read the file PROCEDURE
;=========================================================================
ReadTheFile proc uses edi
LOCAL FindData:WIN32_FIND_DATA
LOCAL Lft:FILETIME
LOCAL time:SYSTEMTIME
LOCAL hFind:DWORD
LOCAL szBuff[256]:BYTE
INVOKE lstrcpy, addr szBuff, addr szPath
INVOKE lstrcat, addr szBuff, addr szAll
and Cnt, 0
INVOKE FindFirstFile, addr szBuff, addr FindData
.if eax != INVALID_HANDLE_VALUE
mov hFind, eax
.while (eax)
inc Cnt
INVOKE FindNextFile, hFind, addr FindData
.endw
.endif
INVOKE FindFirstFile, addr szBuff, addr FindData
.if eax != INVALID_HANDLE_VALUE
mov hFind, eax
xor edi, edi
.while eax != 0
.if byte ptr FindData.cFileName != '.'
; .if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
; .else
;---------- [Get the time] ----------
INVOKE FileTimeToLocalFileTime, addr FindData.ftLastWriteTime, addr Lft
INVOKE FileTimeToSystemTime, addr Lft, addr time
INVOKE fmtime, time.SYSTEMTIME
;---------- [Get the Attributes] ----------
INVOKE lstrcpy, addr szArc, addr szFill
mov eax, offset szArc
.if (FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
mov byte ptr[eax], 'r'
.endif
.if (FindData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)
mov byte ptr[eax+1], 'a'
.endif
.if (FindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
mov byte ptr[eax+2], 'h'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -