首发于www.aogosoft.com
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for listview
; by 小青蛙, http://hi.baidu.com/ahaisoft
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Listview.asm
; 在对话框中使用listview控件自定背景和行高的例子
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   .386
   .model flat, stdcall
   option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include   windows.inc
include   user32.inc
includelib user32.lib
include   kernel32.inc
includelib kernel32.lib
include   comctl32.inc
includelib comctl32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLG_MAIN equ 1000
IDC_LSV   equ 1001
IDM_MAIN equ 10000
IDM_SUBITEM equ 10001
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   .data?
hInstance dd ?
hListView dd ?
hPopupMenu dd ?
   .const
szCol1       db '序号',0
szCol2       db '文本',0
szCol3       db '时间',0
szText       db '测试文本',0
szFmt        db '%d',0
szFmtime      db 'HH:mm:ss',0
szFmtItem     db '序号:%s',13,10,'文本:%s',13,10,'时间:%s',0
szSelected    db '选中项目',0
szTitle      db 'ListView示例程序',0
szAbout      db 'ListView间隔背景及自定行高例子.',13,10,13,10
           db 'By 小青蛙',13,10,'http://www.aogosoft.com',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_initListView proc uses ebx hWnd
   local lvc:LV_COLUMN
   local lvi:LV_ITEM
   local lvf:LVFINDINFO
   local @stTime:SYSTEMTIME
   local @szbuf[128]:BYTE 
;********************************************************************
; 设置ListView全行选择,网格等样式.
;********************************************************************
   mov eax,LVS_EX_FULLROWSELECT or LVS_EX_GRIDLINES or LVS_EX_SUBITEMIMAGES
   invoke SendMessage,hWnd,LVM_SETEXTENDEDLISTVIEWSTYLE,0,eax
;********************************************************************
;调整ImageList高,就可调整listView行高
;********************************************************************
   invoke ImageList_Create,0,32,ILC_COLORDDB or ILC_MASK,0,0
   invoke SendMessage,hWnd,LVM_SETIMAGELIST,LVSIL_SMALL,eax
;********************************************************************
; 初始化ListView控件
;********************************************************************
   mov lvc.imask, LVCF_FMT or LVCF_TEXT or LVCF_WIDTH or LVIR_ICON
   mov lvc.fmt, LVCFMT_LEFT
   mov lvc.lx, 40
   mov lvc.pszText, offset szCol1
   invoke SendMessage,hWnd,LVM_INSERTCOLUMN,0,addr lvc
   mov lvc.lx, 100
   mov lvc.pszText, offset szCol2
   invoke SendMessage,hWnd,LVM_INSERTCOLUMN,1,addr lvc
   mov lvc.lx, 120
   mov lvc.pszText, offset szCol3
   invoke SendMessage,hWnd,LVM_INSERTCOLUMN,2,addr lvc
;********************************************************************
; 写入一些数据到ListView
;********************************************************************
   mov ebx,10
   .repeat
    invoke wsprintf,addr @szbuf,offset szFmt,ebx
   
    mov lvf.flags,LVFI_STRING
    lea eax,@szbuf
    mov lvf.psz,eax
    mov lvf.vkDirection,0
   
    mov lvi.imask, LVIF_TEXT
    mov lvi.iSubItem, 0
    lea eax,@szbuf
    mov lvi.pszText,eax
  
    mov lvi.iItem, 0
    invoke SendMessage,hWnd,LVM_INSERTITEM,0,addr lvi
    inc lvi.iSubItem
    mov   lvi.pszText,offset szText
    invoke SendMessage,hWnd,LVM_SETITEM,0,addr lvi
    inc lvi.iSubItem
    invoke GetLocalTime,addr @stTime
    invoke GetTimeFormat,LOCALE_USER_DEFAULT,TIME_FORCE24HOURFORMAT,\
     addr @stTime,offset szFmtime,addr @szbuf,sizeof @szbuf
    lea eax,@szbuf
    mov lvi.pszText,eax
    invoke SendMessage,hWnd,LVM_SETITEM,0,addr lvi
    dec ebx
   .until ! ebx
   ret
_initListView endp
_ProcDlgMain proc uses edi hWnd,wMsg,wParam,lParam
   local @stRect:RECT
   local lvi:LV_ITEM
   local @pt:POINT
   local @szItem1
   local @szItem2[32]:BYTE
   local @szItem3[32]:BYTE
   local @szbuf[128]:BYTE
  
   mov eax,wMsg
   .if eax == WM_NOTIFY
    mov edi,lParam
    assume edi:ptr NMLVCUSTOMDRAW
    mov eax,[edi].nmcd.hdr.code
    .if eax== NM_CUSTOMDRAW
     mov eax,[edi].nmcd.dwDrawStage
     .if eax==CDDS_PREPAINT
      invoke SetWindowLong,hWnd,DWL_MSGRESULT,CDRF_NOTIFYITEMDRAW
     .elseif eax==CDDS_ITEMPREPAINT
      mov eax,[edi].nmcd.dwItemSpec
      and eax,1
      dec eax
      and eax,(0C6FFC6h-0FFCBFFh) ;=(a-b)+b=a
      add eax,0FFCBFFh   ;(0)+b=b
      mov [edi].clrTextBk,eax
      mov [edi].clrText,0990066h
      invoke SetWindowLong,hWnd,DWL_MSGRESULT,CDRF_NEWFONT
     .endif
    .endif
    ASSUME edi:nothing
   ;********************************************************************
    mov eax,wParam
    .if eax==IDC_LSV
     mov eax,lParam
    ;********************************************************
    ; 将鼠标双击结果显示出来
    ;********************************************************
     .if [eax].NMHDR.code == NM_DBLCLK
      mov ecx, (NM_LISTVIEW ptr [eax]).iItem
      mov lvi.iItem, ecx
      mov lvi.iSubItem, 0
      mov lvi.imask, LVIF_STATE
      mov lvi.stateMask, 3
      invoke SendDlgItemMessage,hWnd,IDC_LSV,LVM_GETITEM,0,addr lvi
      ; -------------------------------
      ; Is selected this item?
      ; -------------------------------
      mov eax, lvi.state
      .if eax==3
       mov      lvi.imask,LVIF_TEXT
       lea eax, @szItem1
       mov lvi.pszText,eax
       mov lvi.cchTextMax,sizeof @szItem1
       invoke SendMessage,hListView,LVM_GETITEM,0,addr lvi
       inc lvi.iSubItem
       lea eax,@szItem2
       mov lvi.pszText,eax
       mov lvi.cchTextMax,sizeof @szItem2
       invoke SendMessage,hListView,LVM_GETITEM,0,addr lvi
       inc lvi.iSubItem
       lea eax,@szItem3
       mov lvi.pszText,eax
       mov lvi.cchTextMax,sizeof @szItem3
       invoke SendMessage,hListView,LVM_GETITEM,0,addr lvi
       invoke wsprintf,addr @szbuf,offset szFmtItem,\
        addr @szItem1,addr @szItem2,addr @szItem3
       invoke MessageBox,hWnd,addr @szbuf,offset szSelected,MB_OK
      .endif
     
    ;********************************************************
    ; 右击鼠标弹出菜单
    ;********************************************************
     .elseif [eax].NMHDR.code == NM_RCLICK
      invoke GetCursorPos, addr @pt
      invoke TrackPopupMenu,hPopupMenu,TPM_LEFTALIGN or TPM_RIGHTBUTTON,\
       @pt.x,@pt.y,0,hWnd,NULL
     .endif
    .endif
   .elseif eax==WM_COMMAND
    mov eax,wParam
    movzx eax,ax
    .if eax==IDM_SUBITEM
     invoke MessageBox,hWnd,offset szAbout,\
      offset szTitle,MB_ICONINFORMATION or MB_OK
    .endif
   .elseif eax == WM_SIZE
    invoke GetClientRect,hWnd,addr @stRect
    invoke SetWindowPos,hListView,HWND_BOTTOM,\
     0,0,@stRect.right,@stRect.bottom,SWP_SHOWWINDOW
   .elseif eax == WM_INITDIALOG
    invoke GetDlgItem,hWnd,IDC_LSV
    mov hListView,eax
    invoke _initListView,eax
    invoke LoadMenu,hInstance,IDM_MAIN
    invoke GetSubMenu,eax,0
    mov hPopupMenu,eax
   .elseif eax == WM_CLOSE
    invoke EndDialog,hWnd,NULL
;********************************************************************
   .else
    mov eax,FALSE
    ret
   .endif
   mov eax,TRUE
   ret
_ProcDlgMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
   invoke GetModuleHandle,NULL
   mov hInstance,eax
   invoke InitCommonControls
   invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
   invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   end start
;rc file
#define IDD_DLG 1000
#define IDC_LSV 1001
#define IDM_MAIN 10000
#define IDM_ 10001
IDD_DLG DIALOGEX 6,6,235,148
CAPTION "ListView"
FONT 8,"MS Sans Serif",0,0
STYLE 0x10CF0800
BEGIN
   CONTROL "",IDC_LSV,"SysListView32",0x50010001,2,1,232,144,0x00000200
END
IDM_MAIN MENU
BEGIN
   POPUP "&POPUP"
   BEGIN
     MENUITEM "关于本程序(&A)...",IDM_
   END
END