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

📄 list_view.asm

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