📄 list_view.asm
字号:
title Listview
comment '*==============================*'
comment '* Programmed by Ewayne Wagner *'
comment '* E-MAIL: yooper@kalamazoo.net *'
comment '*==============================*'
.586
.model flat, STDCALL
option casemap: none ; Case sensitive
include \MASM32\include\Windows.inc
include \MASM32\include\user32.inc
include \Masm32\include\gdi32.inc
include \MASM32\include\kernel32.inc
include \MASM32\include\comctl32.inc
include \MASM32\include\imagehlp.inc
include \MASM32\include\shell32.inc
include \MASM32\include\ole32.inc
includelib \MASM32\lib\user32.lib
includelib \Masm32\lib\gdi32.lib
includelib \MASM32\lib\kernel32.lib
includelib \MASM32\lib\comctl32.lib
includelib \MASM32\LIB\imagehlp.LIB
includelib \MASM32\lib\shell32.lib
includelib \MASM32\lib\ole32.lib
WinMain PROTO :DWORD, :DWORD, :DWORD, :DWORD
LoadListView PROTO :DWORD, :DWORD
ListViewSort PROTO :DWORD, :DWORD, :DWORD
BaseAscii PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
fmtime PROTO :SYSTEMTIME
IDM_MAINMENU equ 10000
IDB_BITMAPS equ 301
IDB_BITMAPL equ 302
IDM_OPEN equ 401
IDM_EXIT equ 402
IDM_TEST equ 403
IDM_LARGEICON equ 500 ;LVS_ICON
IDM_SMALLICON equ 502 ;LVS_SMALLICON
IDM_LIST equ 503 ;LVS_LIST
IDM_REPORT equ 501 ;LVS_REPORT
IDM_ALIGNLEFT equ 601 ;LVA_ALIGNLEFT ; 1
IDM_ALIGNTOP equ 602 ;LVA_ALIGNTOP ; 2
IDM_DEFAULT equ 600 ;LVS_DEFAULT ; 0
IDM_SNAPTOGRID equ 605 ;LVS_SNAPTOGRID ; 5
MOVmw MACRO Var1, Var2
lea esi, Var2
lea edx, Var1
REPEAT 2
mov al, [esi]
mov [edx], al
inc esi
inc edx
ENDM
ENDM
.const
ClassName db 'ListViewWindow',0
AppName db 'A ListView Control',0
ListViewClass db 'SysListView32',0
FontMS db 'MS Sans Serif',0
szColName db 'Filename',0
szColSize db 'Size',0
szColDate db 'Date Time',0
szColAttr db 'Attr',0
szSelect db 'Select A Folder',0
szAll db '*.*',0
template db '%lu',0
szRootPath db 'C:\',0
szSlashB db '\',0
szDir db '<DIR>',0
szRGB db 'RGB\',0
szFill db '----',0
szFile db 'GREEN.txt',0
.data?
hInst dd ?
hWnd dd ?
hList dd ?
hTree dd ?
hMenu dd ?
hFontL dd ?
hImageListS dd ?
hImageListL dd ?
hImageTestS dd ?
hImageTestL dd ?
hBitmap dd ?
HoldT dd ?
.data
szArc db 4 dup(?),0
szRoot db 256 dup(?)
szPath db 256 dup(?)
SortN dd 0
SortS dd 0
SortD dd 0
Cnt dd 0
TestSw dd 0
SmallBMP dd 0
LargeBMP dd 0
DragMode dd 0
ItemID dd 0
Diff dd 0
DATETIME struct
dmo BYTE 2 dup(?)
BYTE '/'
dda BYTE 2 dup(?)
BYTE '/'
dyr BYTE 4 dup(?)
BYTE ' '
dhour BYTE 2 dup(?)
BYTE ':'
dmin BYTE 2 dup(?)
BYTE ':'
dsec BYTE 2 dup(?)
BYTE 0
DATETIME ends
cdt DATETIME <>
lf LOGFONT <>
bri BROWSEINFO <>
pt POINT <?>
rect RECT <>
.code
start:
INVOKE GetModuleHandle, NULL
mov hInst, eax
INVOKE InitCommonControls
INVOKE WinMain, hInst, NULL, NULL, SW_SHOWDEFAULT
INVOKE ExitProcess, eax
;=========================================================================
; WinMain PROCEDURE
;=========================================================================
WinMain proc hinst:DWORD, hPrevInst, CmdLine, CmdShow
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, NULL
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground, COLOR_WINDOW+1
mov wc.lpszMenuName, IDM_MAINMENU
mov wc.lpszClassName, offset ClassName
INVOKE LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
INVOKE LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
INVOKE RegisterClassEx, addr wc
;---------- [Center the window] ----------
INVOKE GetSystemMetrics, SM_CXSCREEN
sub eax, 416
shr eax, 1
push eax
INVOKE GetSystemMetrics, SM_CYSCREEN
sub eax, 290
shr eax, 1
pop ebx
INVOKE CreateWindowEx, NULL, addr ClassName, addr AppName,\
WS_OVERLAPPEDWINDOW,\
ebx, eax, 416, 290, NULL, NULL, hInst, NULL
mov hWnd, eax
INVOKE ShowWindow, hWnd, SW_SHOWNORMAL
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 PROCEDURE
;=========================================================================
WndProc proc hwnd:DWORD, wmsg, wparam, lparam
LOCAL lvhit:LV_HITTESTINFO
LOCAL lvi:LV_ITEM
LOCAL szBuff[256]:BYTE
.if wmsg == WM_CREATE
push hwnd
pop hWnd
call InitListView
INVOKE SendMessage, hList, LVM_SORTITEMS, 1, addr ListViewSort
call Resequence
mov SortN, 1
.elseif wmsg == WM_COMMAND
.if lparam == 0
mov eax, wparam
cwde
.if eax == IDM_OPEN
call BrowseForFolder
INVOKE SendMessage, hList, LVM_SORTITEMS, 1, addr ListViewSort
call Resequence
mov SortN, 1
jmp Ret0
.elseif eax == IDM_EXIT
jmp GetOut
.elseif eax == IDM_TEST
mov TestSw, 1
INVOKE lstrcpy, addr szPath, addr szRoot
INVOKE lstrcat, addr szPath, addr szRGB
.if !LargeBMP
INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_SMALL, hImageTestS
.else
INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_NORMAL, hImageTestL
.endif
INVOKE SendMessage, hList, LVM_DELETEALLITEMS, 0, 0
call ReadTheFile
jmp DefWin
.endif
;---------- [Get the Listview Menu item] ----------
INVOKE GetWindowLong, hList, GWL_STYLE
and eax, not LVS_TYPEMASK
mov edx, wparam
and edx, 0FFFFh
mov wparam, edx
.if edx > 499 && edx < 504
sub edx, 500
or eax, edx
push eax
.elseif edx > 599 && edx < 606
sub edx, 600
.else
jmp DefWin
.endif
.if wparam > 599
.if LargeBMP || SmallBMP
.if SmallBMP
or eax, 2
.endif
.if wparam == 600 ; Default
; or eax, 100h
.elseif wparam == 601 ; Align left
or eax, 800h
.elseif wparam == 602 ; Align top
.if (eax & LVS_ALIGNLEFT)
xor eax, 800h
.endif
.endif
INVOKE SetWindowLong, hList, GWL_STYLE, eax
jmp Arrange
.else
jmp DefWin
.endif
.endif
and LargeBMP, 0
and SmallBMP, 0
.if edx == LVS_ICON
or LargeBMP, 1
.if !TestSw
INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_NORMAL, hImageListL
.else
INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_NORMAL, hImageTestL
.endif
.else
.if edx == LVS_SMALLICON
or SmallBMP, 1
.endif
.if !TestSw
INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_SMALL, hImageListS
.else
INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_SMALL, hImageTestS
.endif
.endif
pop eax
INVOKE SetWindowLong, hList, GWL_STYLE, eax
.if edx == LVS_ICON || LVS_SMALLICON
INVOKE SendMessage, hList, LVM_ARRANGE, LVA_DEFAULT, 0
.endif
Arrange:
.if wparam > 599
mov edx, wparam
sub edx, 600
INVOKE SendMessage, hList, LVM_ARRANGE, edx, 0
.endif
mov edx, wparam
.if edx > 499 && edx < 504
INVOKE CheckMenuRadioItem, hMenu, IDM_LARGEICON, IDM_LIST, edx, MF_BYCOMMAND OR MF_CHECKED
.else
INVOKE CheckMenuRadioItem, hMenu, IDM_DEFAULT, IDM_SNAPTOGRID, edx, MF_BYCOMMAND OR MF_CHECKED
.endif
.endif
.elseif wmsg == WM_NOTIFY
push edi
mov edi, lparam
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -