⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 list_view.asm

📁 用汇编语言编写的ListView控件 使用示例程序。
💻 ASM
📖 第 1 页 / 共 3 页
字号:
         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 + -