📄 listview.asm
字号:
include .\head.inc
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
FillFileInfo PROTO
ExecuteFile proto
UpdatelParam PROTO
CompareFunc PROTO :DWORD,:DWORD,:DWORD
ShowFileInfo PROTO :DWORD,:DWORD
ShowPathInfo PROTO :DWORD,:DWORD
.const
IDR_MENU equ 101
IDR_ICON1 equ 114
IDR_ICON2 equ 115
IDR_ICON3 equ 116
IDR_BITMAP1 equ 117
IDR_BITMAP2 equ 118
IDR_BITMAP3 equ 119
IDR_BITMAP4 equ 120
IDR_BITMAP5 equ 123
IDM_LARGE equ LVS_ICON
IDM_SMALL equ LVS_SMALLICON
IDM_LIST equ LVS_LIST
IDM_DETAIL equ LVS_REPORT
.data
ClassName db "ListViewClass",0
ListViewClassName db "SYSLISTVIEW32",0
TitleName db "列表视图",0
List1 db "名称",0
List2 db "大小",0
List3 db "类型",0
List4 db "建立时间",0
FileName db "*.*",0
char db "%lu",0
folder db "文件夹",0
TxtExtend db ".txt",0
txt db "文本文件",0
DocExtend db ".doc",0
doc db "Word文件",0
ExeExtend db ".exe",0
exe db "可执行文件",0
BmpExtend db ".bmp",0
bmp db "位图文件",0
other db "其他文件",0
NoExe db "这不是可执行文件,故不能执行!",0
CurrentDirect db ".",0
ParentDirect db "..",0
CreateDateTime db 50 dup (0)
interval db "-",0
interval_space db " ",0
interval_colon db ":",0
FileNameSortOrder dd 0
SizeSortOrder dd 0
.data?
hInstance HINSTANCE ?
hListView HANDLE ?
hImageList HANDLE ?
nmhdr NMHDR <>
Rect RECT <>
hMenu HMENU ?
temp db 20 dup (?)
Date_Time SYSTEMTIME <>
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke WinMain, NULL,NULL,NULL, SW_SHOWDEFAULT
invoke ExitProcess,eax
invoke InitCommonControls
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
mov eax, hInstance
mov wc.hInstance,eax
invoke GetStockObject,WHITE_BRUSH
mov wc.hbrBackground,eax
mov wc.lpszMenuName,IDR_MENU
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_WINLOGO
mov wc.hIcon,eax
mov wc.hIconSm,0
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,WS_EX_CLIENTEDGE+WS_EX_APPWINDOW,addr ClassName,\
addr TitleName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,200,\
NULL,NULL,hInst,NULL
mov hwnd,eax
invoke GetMenu,hwnd
mov hMenu,eax
invoke ShowWindow,hwnd,CmdShow
invoke UpdateWindow,hwnd
.while TRUE
invoke GetMessage, addr msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage,addr msg
invoke DispatchMessage, addr msg
.endw
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
local lvc:LV_COLUMN
local hIcon:DWORD
local hBitmap:DWORD
.if uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.elseif uMsg==WM_CREATE
invoke CreateWindowEx,NULL,addr ListViewClassName,NULL,WS_CHILD+WS_VISIBLE\
+LVS_REPORT,0,0,0,0,hWnd,NULL,hInstance,NULL
mov hListView,eax
invoke ImageList_Create,16,16,ILC_COLOR32,8,10
mov hImageList,eax
invoke LoadIcon,hInstance,IDR_ICON1
mov hIcon,eax
invoke ImageList_AddIcon,hImageList,hIcon
invoke LoadIcon,hInstance,IDR_ICON2
mov hIcon,eax
invoke ImageList_AddIcon,hImageList,hIcon
invoke LoadIcon,hInstance,IDR_ICON3
mov hIcon,eax
invoke ImageList_AddIcon,hImageList,hIcon
invoke LoadBitmap,hInstance,IDR_BITMAP1
mov hBitmap,eax
invoke ImageList_Add,hImageList,hBitmap,NULL
invoke LoadBitmap,hInstance,IDR_BITMAP2
mov hBitmap,eax
invoke ImageList_Add,hImageList,hBitmap,NULL
invoke LoadBitmap,hInstance,IDR_BITMAP3
mov hBitmap,eax
invoke ImageList_Add,hImageList,hBitmap,NULL
invoke LoadBitmap,hInstance,IDR_BITMAP4
mov hBitmap,eax
invoke ImageList_Add,hImageList,hBitmap,NULL
invoke LoadBitmap,hInstance,IDR_BITMAP5
mov hBitmap,eax
invoke ImageList_Add,hImageList,hBitmap,NULL
invoke SendMessage,hListView,LVM_SETIMAGELIST,LVSIL_SMALL ,hImageList
mov lvc.imask,LVCF_FMT+LVCF_TEXT+LVCF_WIDTH
mov lvc.fmt,LVCFMT_CENTER
mov lvc.lx,120
mov lvc.pszText,offset List1
invoke SendMessage,hListView,LVM_INSERTCOLUMN,0,addr lvc
mov lvc.imask,LVCF_TEXT+LVCF_IMAGE+LVCF_WIDTH+LVCF_FMT
mov lvc.pszText,offset List2
mov lvc.fmt, LVCFMT_BITMAP_ON_RIGHT+LVCFMT_LEFT
mov lvc.iImage,0
mov lvc.lx,80
invoke SendMessage,hListView,LVM_INSERTCOLUMN,1,addr lvc
mov lvc.imask,LVCF_FMT+LVCF_TEXT+LVCF_WIDTH
mov lvc.pszText,offset List3
invoke SendMessage,hListView,LVM_INSERTCOLUMN,2,addr lvc
mov lvc.pszText,offset List4
mov lvc.lx,150
invoke SendMessage,hListView,LVM_INSERTCOLUMN,3,addr lvc
invoke FillFileInfo
.elseif uMsg==WM_SIZE
invoke GetClientRect,hWnd,addr Rect
invoke MoveWindow,hListView,0,0,Rect.right,Rect.bottom,TRUE
.elseif uMsg==WM_NOTIFY
push edi
mov edi,lParam
assume edi:ptr NMHDR
.if [edi].code==LVN_COLUMNCLICK
assume edi:ptr NM_LISTVIEW
.if [edi].iSubItem==1
.if SizeSortOrder==0||SizeSortOrder==2
invoke SendMessage,hListView,LVM_SORTITEMS,1,addr CompareFunc
invoke UpdatelParam
mov SizeSortOrder,1
mov lvc.imask,LVCF_TEXT+LVCF_IMAGE
mov lvc.pszText,offset List2
mov lvc.iImage,1
mov lvc.lx,80
invoke SendMessage,hListView,LVM_SETCOLUMN,1,addr lvc
.else
invoke SendMessage,hListView,LVM_SORTITEMS,2,addr CompareFunc
invoke UpdatelParam
mov SizeSortOrder,2
mov lvc.pszText,offset List2
mov lvc.fmt, LVCFMT_BITMAP_ON_RIGHT+LVCFMT_LEFT
mov lvc.iImage,0
mov lvc.lx,80
invoke SendMessage,hListView,LVM_SETCOLUMN,1,addr lvc
.endif
.elseif [edi].iSubItem==0
.if FileNameSortOrder==0||FileNameSortOrder==4
invoke SendMessage,hListView,LVM_SORTITEMS,3,addr CompareFunc
invoke UpdatelParam
mov FileNameSortOrder,3
.else
invoke SendMessage,hListView,LVM_SORTITEMS,4,addr CompareFunc
invoke UpdatelParam
mov FileNameSortOrder,4
.endif
.endif
.elseif [edi].hdr.code==NM_DBLCLK
invoke ExecuteFile
.endif
pop edi
.elseif uMsg==WM_COMMAND
.if !lParam
mov edx,lParam
.if edx==IDM_LARGE
invoke SendMessage,hListView,LVM_SETIMAGELIST,LVSIL_NORMAL,hImageList
.else
invoke SendMessage,hListView,LVM_SETIMAGELIST,LVSIL_SMALL,hImageList
.endif
invoke GetWindowLong,hListView,GWL_STYLE
and eax,not LVS_TYPEMASK;相关位清0
mov edx,wParam
mov edx,wParam
push edx
or eax,edx
invoke SetWindowLong,hListView,GWL_STYLE,eax
pop edx
invoke CheckMenuRadioItem,hMenu,IDM_LARGE,IDM_LIST,edx,MF_CHECKED
.endif
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
FillFileInfo proc uses edi
local finddata:WIN32_FIND_DATA
local hFind:DWORD
invoke FindFirstFile,addr FileName,addr finddata
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -