asm也疯狂!masm32完成的listview类,采用自行开发的oop.inc包

首先说明,我的计划太大,我希望重新封装所有的标准控件和全部API,这样一个人力量是不够的,所以在这里我想说我真心希望有MASM的FANS联系我(QQ:318493),大家一起发力完成这个伟大的类库,打垮恶心的mfc,对mfc我真的很看不惯

;================================codes by guokeno1================================;
.386
.model flat,stdcall
option casemap:none

include d:/masm32/oop/jeffoop/oop.inc
include d:/masm32/include/windows.inc
include d:/masm32/include/kernel32.inc
includelib d:/masm32/lib/kernel32.lib
include d:/masm32/include/user32.inc
includelib d:/masm32/lib/user32.lib
include  d:/MASM32/include/comctl32.inc
includelib d:/masm32/lib/comctl32.lib
include  D:/MASM32/include/shell32.inc
INCLUDELIB D:/MASM32/lib/shell32.lib

include D:/masm32/oop/jeffoop/simplewindow/simplewindow.inc
include d:/masm32/oop/jeffoop/include/icon.inc
CLASS ALISTVIEW
 METHOD ALISTVIEW_init,HPARENT
 METHOD ALISTVIEW_release
 @HWND MEMBER ?
 @HPARENT MEMBER ?
 @HIMAGELIST MEMBER ?
 @LEFT MEMBER ?
 @TOP MEMBER ?
 @WIDTH MEMBER ?
 @HEIGHT MEMBER ?
 @VIEWMODE MEMBER ?
 @BACKCOLOR MEMBER ?
 @FONTCOLOR MEMBER ?
 @SICONLIST MEMBER ?
 @LICONLIST MEMBER ?
 METHOD BUILDLISTVIEW,MODE
 METHOD SETVIEW,MODE
 METHOD INSERTCOLUMN,LPCOLUMNNAME,ISUBCOLUMN,CWIDTH,CALIGNMENT
 METHOD INSERTITEM,LPITEMNAME,IITEM,ISUBITEM,HIMAGE
 METHOD UPDATALPARAM
 METHOD REMOVEITEM,LPITEMNAME
 METHOD MODIFYITEM,LPITEMNAME,IITEM,ISUBITEM,HIMAGE
 METHOD SEARCHITEM,LPITEMNAME,@START
 METHOD SETFOCUS,IITEM
 METHOD SORT,ISUBITEM,SORTPROC
 VIRTUAL V_SORTPROC
ALISTVIEW ENDC

.data
hProcess dd ?
lpWindow dd ?
lpListView dd ?

.code
include D:/masm32/oop/jeffoop/simplewindow/simplewindow.asm
include d:/masm32/oop/jeffoop/asm/icon.asm
;================================codes for AWINDOW================================;
ALISTVIEW_SORTPROC PROC USES EBX EDI ESI LPARAM1:DWORD,LPARAM2:DWORD,_LPARAM:DWORD;NOT COMPLETEED
 LOCAL NAME1[256]:BYTE
 LOCAL NAME2[256]:BYTE
 LOCAL LVI:LV_ITEM
 invoke RtlZeroMemory,ADDR NAME1,256
 invoke RtlZeroMemory,ADDR NAME2,256
 MOV EBX,lpListView
 GETCLASS ALISTVIEW
  mov LVI.imask,LVIF_TEXT 
  LEA EAX,NAME1
  MOV LVI.pszText,EAX
  MOV LVI.cchTextMax,255
  mov eax,LPARAM1
  MOV LVI.iItem,eax
  MOV EAX,_LPARAM
  MOV LVI.iSubItem,eax
  invoke SendMessage,[EBX].@HWND,LVM_GETITEM,0,addr LVI
  LEA EAX,NAME2
  MOV LVI.pszText,EAX
  MOV EAX,LPARAM2
  MOV LVI.iItem,EAX
  invoke SendMessage,[EBX].@HWND,LVM_GETITEM,0,addr LVI
  invoke lstrcmp,addr NAME1,addr NAME2
 RELEASECLASS
 RET
ALISTVIEW_SORTPROC ENDP

AWINDOW_WNDPROCA PROC hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
 local _HICON:DWORD
    .IF uMsg==WM_DESTROY                          
        invoke PostQuitMessage,NULL   
 .ELSEIF uMsg==WM_CREATE
  NEW AIMAGE
  GETCLASS AIMAGE
   EXERT ICONFROMFILE,STRINGA("TEST.ICO")
   MOV _HICON,EAX
   DEL AIMAGE,EBX
  RELEASECLASS
  NEW ALISTVIEW,hWnd
  MOV lpListView,ebx
  GETCLASS ALISTVIEW
   MOV [EBX].@LEFT,100
   MOV [EBX].@TOP,100
   MOV [EBX].@WIDTH,200
   MOV [EBX].@HEIGHT,200
   EXERT BUILDLISTVIEW,LVS_REPORT
   EXERT SETVIEW,LVS_ICON
   EXERT INSERTCOLUMN,STRINGA("TALENT"),0,80,LVCFMT_CENTER
   EXERT INSERTCOLUMN,STRINGA("FOOL"),1,80,LVCFMT_CENTER
   EXERT INSERTITEM,STRINGA("JEFF"),0,-1,_HICON
   EXERT INSERTITEM,STRINGA("GUOKE"),0,1,0
   EXERT INSERTITEM,STRINGA("BUDISM"),1,-1,_HICON
   EXERT INSERTITEM,STRINGA("RAYWILL"),1,1,0
   EXERT SETFOCUS,0
   EXERT SETFOCUS,1
   EXERT SORT,0,OFFSET ALISTVIEW_SORTPROC
   PUSH EBX
   NEW AIMAGE
  GETCLASS AIMAGE
   EXERT ICONFROMFILE,STRINGA("APP.ICO")
  RELEASECLASS
   MOV EDI,EBX
   $EDI AIMAGE
   POP EBX
  GETCLASS ALISTVIEW
   EXERT SEARCHITEM,STRINGA("BUDISM"),0
   EXERT MODIFYITEM,STRINGA("STUDY MACHINE"),EAX,0,[EDI].@HANDLE
   DEL AIMAGE,EDI
   @EDI
  RELEASECLASS
    .ELSE
        invoke DefWindowProc,hWnd,uMsg,wParam,lParam    
        ret
    .ENDIF
    xor eax,eax
    ret 
AWINDOW_WNDPROCA ENDP


;================================codes for ALISTVIEW================================;
ALISTVIEW_BUILDLISTVIEW PROC USES EBX EDI ESI MODE:DWORD
 LOCAL sfi:SHFILEINFO
 GETCLASS ALISTVIEW
  MOV EDX,MODE
  OR EDX,WS_CHILD OR WS_VISIBLE OR LVS_SHAREIMAGELISTS
  INVOKE CreateWindowEx, WS_EX_CLIENTEDGE,STRINGA("SysListView32"),NULL,/
       EDX,[EBX].@LEFT,[EBX].@TOP,[EBX].@WIDTH,[EBX].@HEIGHT,[EBX].@HPARENT,NULL,hProcess,NULL
  MOV [EBX].@HWND,EAX     
  MOV EAX,MODE
  MOV [EBX].@VIEWMODE,EAX
        mov eax,LVS_EX_FULLROWSELECT or LVS_EX_HEADERDRAGDROP or LVS_EX_SUBITEMIMAGES or LVS_EX_GRIDLINES
        INVOKE SendMessage,[ebx].@HWND, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, eax
        INVOKE SHGetFileInfo,STRINGA("C:/"), 0, addr sfi, sizeof SHFILEINFO,SHGFI_SYSICONINDEX or SHGFI_ICON
        mov [EBX].@LICONLIST, eax
        INVOKE SHGetFileInfo,STRINGA("C:/"), 0, addr sfi, sizeof SHFILEINFO,SHGFI_SYSICONINDEX or SHGFI_SMALLICON
        mov [EBX].@SICONLIST, eax
        INVOKE SendMessage,[ebx].@HWND, LVM_SETIMAGELIST, LVSIL_NORMAL,[EBX].@LICONLIST  
  INVOKE SendMessage,[ebx].@HWND,LVM_SETIMAGELIST,LVSIL_SMALL,[EBX].@SICONLIST
 RELEASECLASS
 RET
ALISTVIEW_BUILDLISTVIEW ENDP

ALISTVIEW_SETVIEW PROC USES EBX EDI ESI MODE:DWORD
 GETCLASS ALISTVIEW
  invoke GetWindowLong,[EBX].@HWND,GWL_STYLE
  and eax,not LVS_TYPEMASK
  mov ecx,MODE
  .IF ECX!=LVS_ICON && ECX!=LVS_SMALLICON && ECX!=LVS_LIST && ECX!=LVS_REPORT
   MOV EAX,0
   RET
  .ENDIF
  OR EAX,MODE
  INVOKE SetWindowLong,[ebx].@HWND,GWL_STYLE,eax
  PUSH MODE
  POP [EBX].@VIEWMODE
 RELEASECLASS
 RET
ALISTVIEW_SETVIEW ENDP

ALISTVIEW_INSERTITEM PROC USES EBX EDI ESI LPITEMNAME:DWORD,IITEM:DWORD,ISUBITEM:DWORD,HIMAGE:DWORD
 LOCAL lvi:LV_ITEM
 GETCLASS ALISTVIEW
  MOV EAX,IITEM
  MOV lvi.lParam,EAX
  MOV lvi.iItem,eax
  mov eax,ISUBITEM
  mov lvi.iSubItem,eax
  mov eax,LPITEMNAME
  MOV lvi.pszText,eax
  MOV EDX,LVIF_TEXT or LVIF_PARAM
  .IF HIMAGE!=0
   OR EDX,LVIF_IMAGE
   MOV EAX,HIMAGE
   MOV lvi.iImage,EAX
  .ELSE
   MOV lvi.iImage,-1
  .ENDIF
  mov lvi.imask,edx
  .IF ISUBITEM==-1
   MOV lvi.iSubItem,0
   INVOKE SendMessage,[ebx].@HWND,LVM_INSERTITEM,0,addr lvi  
  .ELSE
   mov lvi.imask, LVIF_TEXT
   INVOKE SendMessage,[ebx].@HWND,LVM_SETITEM,0,addr lvi
  .ENDIF
  EXERT UPDATALPARAM
 RELEASECLASS
 RET
ALISTVIEW_INSERTITEM ENDP

ALISTVIEW_UPDATALPARAM PROC USES EBX EDI ESI
 LOCAL LVI:LV_ITEM
 GETCLASS ALISTVIEW
  invoke SendMessage,[EBX].@HWND,LVM_GETITEMCOUNT,0,0
  .if eax==0
   ret
  .endif
  dec eax
  xor ecx,ecx
  .repeat
   MOV LVI.imask,LVIF_PARAM
   MOV LVI.lParam,ecx
   mov LVI.iItem,ecx
   mov LVI.iSubItem,0
   PUSH EAX
   PUSH ECX
   invoke SendMessage,[EBX].@HWND,LVM_SETITEM,0,ADDR LVI
   POP ECX
   POP EAX
   INC ECX
  .UNTIL ecx>eax
 RELEASECLASS
 RET
ALISTVIEW_UPDATALPARAM ENDP

ALISTVIEW_INSERTCOLUMN PROC USES EBX EDI ESI LPCOLUMNNAME:DWORD,ISUBCOLUMN:DWORD,CWIDTH:DWORD,CALIGNMENT:DWORD
 LOCAL lvc:LV_COLUMN
 GETCLASS ALISTVIEW
         mov     EAX,LVCF_TEXT or LVCF_WIDTH or LVCF_FMT or LVCF_SUBITEM
   MOV   lvc.imask,eax
   MOV  EAX,LPCOLUMNNAME
         mov     lvc.pszText,EAX
   MOV   EAX,CWIDTH
         mov     lvc.lx,EAX
   MOV  EAX,CALIGNMENT
   MOV   lvc.fmt,EAX
   mov  eax,ISUBCOLUMN
   mov  lvc.iSubItem,eax
   INVOKE  SendMessage, [EBX].@HWND, LVM_INSERTCOLUMN,ISUBCOLUMN, addr lvc  
 RELEASECLASS
 RET
ALISTVIEW_INSERTCOLUMN ENDP

ALISTVIEW_release proc uses ebx edi esi
 mov eax,1
 ret
ALISTVIEW_release endp

ALISTVIEW_SEARCHITEM PROC USES EBX EDI ESI LPITEMNAME:DWORD,@START:DWORD
 LOCAL LVF:LVFINDINFO
 GETCLASS ALISTVIEW
  MOV LVF.flags,LVFI_STRING
  MOV EAX,LPITEMNAME
  MOV LVF.psz,EAX
  LEA EAX,LVF
  invoke SendMessage,[EBX].@HWND,LVM_FINDITEM,@START,EAX
 RELEASECLASS
 RET
ALISTVIEW_SEARCHITEM ENDP

ALISTVIEW_REMOVEITEM PROC USES EBX EDI ESI LPITEMNAME:DWORD
 GETCLASS ALISTVIEW
  EXERT SEARCHITEM,LPITEMNAME,0
  .IF EAX!=-1
   INVOKE SendMessage,[EBX].@HWND,LVM_DELETEITEM,EAX,0
   EXERT UPDATALPARAM
  .ENDIF
 RELEASECLASS
 RET
ALISTVIEW_REMOVEITEM ENDP

ALISTVIEW_MODIFYITEM PROC USES EBX EDI ESI LPITEMNAME:DWORD,IITEM:DWORD,ISUBITEM:DWORD,HIMAGE:DWORD
 LOCAL LVI:LV_ITEM
 INVOKE RtlZeroMemory,ADDR LVI,SIZEOF LVI
 GETCLASS ALISTVIEW
  .IF LPITEMNAME!=0
   PUSH LPITEMNAME
   POP LVI.pszText
   OR LVI.imask,LVIF_TEXT
  .ENDIF
  .IF HIMAGE!=-1 && ISUBITEM==0
   OR LVI.imask,LVIF_IMAGE
   PUSH HIMAGE
   POP LVI.iImage
  .ENDIF
  .IF ISUBITEM!=-1
   PUSH ISUBITEM
   POP LVI.iSubItem
  .ENDIF
  invoke SendMessage,[ebx].@HWND,LVM_SETITEM,0,ADDR LVI
 RELEASECLASS
 RET
ALISTVIEW_MODIFYITEM ENDP

ALISTVIEW_SETFOCUS PROC USES EBX EDI ESI IITEM:DWORD
 LOCAL LVI:LVITEM
 INVOKE RtlZeroMemory,ADDR LVI,SIZEOF LVI
 GETCLASS ALISTVIEW
  MOV LVI.imask,LVIF_STATE
  MOV LVI.state,LVIS_SELECTED
  MOV LVI.stateMask,LVIS_SELECTED
  MOV EAX,IITEM
  MOV LVI.iItem,EAX
  MOV LVI.iSubItem,0
  invoke SendMessage,[ebx].@HWND,LVM_SETITEMSTATE,IITEM,addr LVI
  invoke SetFocus,[ebx].@HWND
 RELEASECLASS
 RET
ALISTVIEW_SETFOCUS ENDP

ALISTVIEW_SORT PROC USES EDI ESI EBX ISUBITEM:DWORD,SORTPROC:DWORD
 GETCLASS ALISTVIEW
  OVERRIDE V_SORTPROC,SORTPROC
  invoke SendMessage,[ebx].@HWND,LVM_SORTITEMS,ISUBITEM,[EBX].V_SORTPROC
  EXERT UPDATALPARAM
 RELEASECLASS
 RET
ALISTVIEW_SORT ENDP

ALISTVIEW_init PROC uses ebx edi esi HPARENT:DWORD
 GETCLASS ALISTVIEW
  INVOKE RtlZeroMemory,ebx,sizeof ALISTVIEW
  MOV EAX,HPARENT
  MOV [EBX].@HPARENT,EAX
  MOV EAX,ALISTVIEW_BUILDLISTVIEW
  MOV [EBX].BUILDLISTVIEW,EAX
  MOV EAX,ALISTVIEW_SETVIEW
  MOV [EBX].SETVIEW,EAX
  MOV EAX,ALISTVIEW_INSERTCOLUMN
  MOV [EBX].INSERTCOLUMN,EAX
  MOV EAX,ALISTVIEW_INSERTITEM
  MOV [EBX].INSERTITEM,EAX
  MOV EAX,ALISTVIEW_MODIFYITEM
  MOV [EBX].MODIFYITEM,EAX
  MOV EAX,ALISTVIEW_UPDATALPARAM
  MOV [EBX].UPDATALPARAM,EAX
  MOV EAX,ALISTVIEW_SEARCHITEM
  MOV [EBX].SEARCHITEM,EAX
  MOV EAX,ALISTVIEW_SORT
  MOV [EBX].SORT,EAX
  mov eax,ALISTVIEW_SETFOCUS
  MOV [EBX].SETFOCUS,EAX
  mov eax,ALISTVIEW_release
  mov [ebx].ALISTVIEW_release,eax
  RET
 RELEASECLASS
 RET 
ALISTVIEW_init endp
;================================function main====================================;
MAIN:
 invoke GetModuleHandle,0
 MOV hProcess,EAX
 INVOKE InitCommonControls
 NEW AWINDOW,STRINGA("WINDOW WITH LISTVIEW"),STRINGA("LISTVIEW CLASS")
 MOV lpWindow,EBX
 GETCLASS AWINDOW
  OVERRIDE V_WNDPROC,AWINDOW_WNDPROCA
  MOV [EBX].@LEFT,CW_USEDEFAULT
  MOV [EBX].@TOP,CW_USEDEFAULT
  MOV [EBX].@WIDTH,CW_USEDEFAULT
  MOV [EBX].@HEIGHT,CW_USEDEFAULT
  EXERT BUILDWINDOW,0,SW_SHOWDEFAULT
 RELEASECLASS
 invoke ExitProcess,0
END MAIN 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值