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

📄 list_view.asm

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