方程

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
首发于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
posted on 2012-01-16 17:39  方程  阅读(502)  评论(0)    收藏  举报