📄 lion-tut-c31.htm
字号:
<P><B>CompareFunc proto lParam1:DWORD, lParam2:DWORD, lParamSort:DWORD</B></P>
<P>lParam1 和 lParam2 是 LV_ITEM型的结构体中的成员变量lParam的值。<BR>lParamSort
是发送LVM_SORTITEMS消息时参数wParam中的值</P>
<P>当列表视图控件接收到LVM_SORTITEMS消息时,当需要比较项目时它会调用在lParam中指定的比较函数。比较函数将决定那一个项目排在前面。方法很简单:如果函数返回一个负值,由(lParam代表的)第一个项目排在前,如果返回正值,第二个项目排在前。如果相等,必须返回0
。 </P>
<P>真正使得该方法能够运行的是LV_ITEM型结构体中的成员变量lParam值。当您需要排序时(譬如当您点击列的标题条时),您需要考虑好排序方案。在本例中,我们把项目的索引放到该成员变量中,这样我们可以通过发送LVM_GETITEM消息来得到项目的其它信息。注意:当项目重排序后,它们的索引也就变了。所以当重排序后,我需要在lParam参数中反应出新的索引。如果您想在用户点击列的标题条时重新排序,您需要在您的窗口过程函数中处理LVN_COLUMNCLICK通知消息。LVN_COLUMNCLICK消息是随同WM_NOTIFY消息一起发送的。</P>
<H3><FONT color=#ff0000>例子:</FONT></H3>
<P>该例子创建了一个列表视图控件,并在其中显示了当前文件夹中的文件大小和文件名。缺省的视图是报告方式的,如果您点击列标题条,标题将按升/降序重新排列。您可以通过菜单选择不同的显示方式(大图标、小图标等)。当您双击一个项目时,项目的名称将显示在一个对话框中。</P>
<P>.386 <BR>.model flat,stdcall <BR>option casemap:none <BR>include
\masm32\include\windows.inc <BR>include \masm32\include\user32.inc <BR>include
\masm32\include\kernel32.inc <BR>include \masm32\include\comctl32.inc
<BR>includelib \masm32\lib\comctl32.lib <BR>includelib \masm32\lib\user32.lib
<BR>includelib \masm32\lib\kernel32.lib <BR><BR>WinMain proto
:DWORD,:DWORD,:DWORD,:DWORD <BR><BR>IDM_MAINMENU equ 10000 <BR>IDM_ICON equ
LVS_ICON <BR>IDM_SMALLICON equ LVS_SMALLICON <BR>IDM_LIST equ LVS_LIST
<BR>IDM_REPORT equ LVS_REPORT <BR><BR>RGB macro red,green,blue <BR> xor
eax,eax <BR> mov ah,blue <BR> shl eax,8 <BR> mov ah,green
<BR> mov al,red <BR>endm <BR><BR>.data <BR>ClassName db
"ListViewWinClass",0 <BR>AppName db "Testing a ListView Control",0
<BR>ListViewClassName db "SysListView32",0 <BR>Heading1 db "Filename",0
<BR>Heading2 db "Size",0 <BR>FileNamePattern db "*.*",0 <BR>FileNameSortOrder dd
0 <BR>SizeSortOrder dd 0 <BR>template db "%lu",0<BR><BR>.data? <BR>hInstance
HINSTANCE ? <BR>hList dd ? <BR>hMenu dd ? <BR><BR>.code <BR>start:
<BR> invoke GetModuleHandle, NULL <BR> mov hInstance,eax
<BR> invoke WinMain, hInstance,NULL, NULL, SW_SHOWDEFAULT <BR>
invoke ExitProcess,eax <BR> invoke InitCommonControls <BR>WinMain proc
hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
<BR> LOCAL wc:WNDCLASSEX <BR> LOCAL msg:MSG <BR>
LOCAL hwnd:HWND<BR><BR> mov wc.cbSize,SIZEOF WNDCLASSEX <BR> mov
wc.style, NULL <BR> mov wc.lpfnWndProc, OFFSET WndProc <BR> mov
wc.cbClsExtra,NULL <BR> mov wc.cbWndExtra,NULL <BR> push hInstance
<BR> pop wc.hInstance <BR> mov wc.hbrBackground,COLOR_WINDOW+1
<BR> mov wc.lpszMenuName,IDM_MAINMENU <BR> mov
wc.lpszClassName,OFFSET ClassName <BR> invoke
LoadIcon,NULL,IDI_APPLICATION <BR> mov wc.hIcon,eax <BR> mov
wc.hIconSm,eax <BR> invoke LoadCursor,NULL,IDC_ARROW <BR> mov
wc.hCursor,eax <BR> invoke RegisterClassEx, addr wc <BR> invoke
CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInst,NULL <BR> mov hwnd,eax <BR> invoke ShowWindow,
hwnd,SW_SHOWNORMAL <BR> invoke UpdateWindow, hwnd <BR> .while TRUE
<BR> invoke GetMessage, ADDR msg,NULL,0,0
<BR> .break .if (!eax) <BR>
invoke TranslateMessage, ADDR msg <BR> invoke
DispatchMessage, ADDR msg <BR> .endw <BR> mov eax,msg.wParam
<BR> ret <BR>WinMain endp <BR><BR>InsertColumn proc <BR> LOCAL
lvc:LV_COLUMN <BR><BR> mov lvc.imask,LVCF_TEXT+LVCF_WIDTH <BR> mov
lvc.pszText,offset Heading1 <BR> mov lvc.lx,150 <BR> invoke
SendMessage,hList, LVM_INSERTCOLUMN, 0, addr lvc<BR> or
lvc.imask,LVCF_FMT<BR> mov lvc.fmt,LVCFMT_RIGHT <BR> mov
lvc.pszText,offset Heading2 <BR> mov lvc.lx,100<BR> invoke
SendMessage,hList, LVM_INSERTCOLUMN, 1 ,addr lvc <BR> ret <BR>InsertColumn
endp <BR><BR>ShowFileInfo proc uses edi row:DWORD, lpFind:DWORD <BR> LOCAL
lvi:LV_ITEM <BR> LOCAL buffer[20]:BYTE <BR> mov edi,lpFind
<BR> assume edi:ptr WIN32_FIND_DATA <BR> mov
lvi.imask,LVIF_TEXT+LVIF_PARAM <BR> push row <BR> pop lvi.iItem
<BR> mov lvi.iSubItem,0 <BR> lea eax,[edi].cFileName <BR> mov
lvi.pszText,eax <BR> push row <BR> pop lvi.lParam <BR> invoke
SendMessage,hList, LVM_INSERTITEM,0, addr lvi <BR> mov lvi.imask,LVIF_TEXT
<BR> inc lvi.iSubItem <BR> invoke wsprintf,addr buffer, addr
template,[edi].nFileSizeLow <BR> lea eax,buffer <BR> mov
lvi.pszText,eax <BR> invoke SendMessage,hList,LVM_SETITEM, 0,addr lvi
<BR> assume edi:nothing <BR> ret <BR>ShowFileInfo endp
<BR><BR>FillFileInfo proc uses edi <BR> LOCAL finddata:WIN32_FIND_DATA
<BR> LOCAL FHandle:DWORD <BR><BR> invoke FindFirstFile,addr
FileNamePattern,addr finddata <BR> .if eax!=INVALID_HANDLE_VALUE
<BR> mov FHandle,eax <BR> xor edi,edi
<BR> .while eax!=0 <BR> test
finddata.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY
<BR> .if
ZERO?<BR> invoke
ShowFileInfo,edi, addr finddata
<BR> inc edi
<BR> .endif <BR>
invoke FindNextFile,FHandle,addr finddata <BR> .endw
<BR> invoke FindClose,FHandle <BR> .endif <BR> ret
<BR>FillFileInfo endp <BR><BR>String2Dword proc uses ecx edi edx esi
String:DWORD <BR> LOCAL Result:DWORD <BR><BR> mov Result,0
<BR> mov edi,String <BR> invoke lstrlen,String <BR>
.while eax!=0 <BR> xor edx,edx <BR> mov
dl,byte ptr [edi] <BR> sub dl,"0" <BR> mov
esi,eax <BR> dec esi <BR> push eax
<BR> mov eax,edx <BR> push ebx
<BR> mov ebx,10 <BR> .while esi > 0
<BR> mul ebx <BR>
dec esi <BR> .endw <BR> pop ebx
<BR> add Result,eax <BR> pop eax
<BR> inc edi <BR> dec eax <BR> .endw
<BR> mov eax,Result <BR> ret <BR>String2Dword endp
<BR><BR>CompareFunc proc uses edi lParam1:DWORD, lParam2:DWORD, SortType:DWORD
<BR> LOCAL buffer[256]:BYTE <BR> LOCAL buffer1[256]:BYTE <BR>
LOCAL lvi:LV_ITEM <BR><BR> mov lvi.imask,LVIF_TEXT <BR> lea
eax,buffer <BR> mov lvi.pszText,eax <BR> mov lvi.cchTextMax,256
<BR> .if SortType==1 <BR> mov lvi.iSubItem,1
<BR> invoke SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi
<BR> invoke String2Dword,addr buffer <BR>
mov edi,eax <BR> invoke
SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi <BR> invoke
String2Dword,addr buffer <BR> sub edi,eax
<BR> mov eax,edi <BR> .elseif SortType==2
<BR> mov lvi.iSubItem,1 <BR> invoke
SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi <BR> invoke
String2Dword,addr buffer <BR> mov edi,eax
<BR> invoke SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi
<BR> invoke String2Dword,addr buffer <BR>
sub eax,edi <BR> .elseif SortType==3 <BR> mov
lvi.iSubItem,0 <BR> invoke
SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi <BR> invoke
lstrcpy,addr buffer1,addr buffer <BR> invoke
SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi <BR> invoke
lstrcmpi,addr buffer1,addr buffer <BR> .else <BR> mov
lvi.iSubItem,0 <BR> invoke
SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi <BR> invoke
lstrcpy,addr buffer1,addr buffer <BR> invoke
SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi <BR> invoke
lstrcmpi,addr buffer,addr buffer1 <BR> .endif <BR> ret
<BR>CompareFunc endp <BR><BR>UpdatelParam proc uses edi <BR> LOCAL
lvi:LV_ITEM <BR><BR> invoke SendMessage,hList, LVM_GETITEMCOUNT,0,0
<BR> mov edi,eax <BR> mov lvi.imask,LVIF_PARAM
<BR> mov lvi.iSubItem,0 <BR> mov lvi.iItem,0
<BR> .while edi>0 <BR> push lvi.iItem
<BR> pop lvi.lParam <BR> invoke
SendMessage,hList, LVM_SETITEM,0,addr lvi <BR> inc
lvi.iItem <BR> dec edi <BR> .endw
<BR> ret <BR>UpdatelParam endp <BR><BR>ShowCurrentFocus proc
<BR> LOCAL lvi:LV_ITEM <BR> LOCAL buffer[256]:BYTE
<BR><BR> invoke SendMessage,hList,LVM_GETNEXTITEM,-1,
LVNI_FOCUSED<BR> mov lvi.iItem,eax <BR> mov
lvi.iSubItem,0 <BR> mov lvi.imask,LVIF_TEXT <BR> lea
eax,buffer <BR> mov lvi.pszText,eax <BR> mov
lvi.cchTextMax,256 <BR> invoke SendMessage,hList,LVM_GETITEM,0,addr
lvi <BR> invoke MessageBox,0, addr buffer,addr AppName,MB_OK
<BR> ret <BR>ShowCurrentFocus endp <BR><BR>WndProc proc hWnd:HWND,
uMsg:UINT, wParam:WPARAM, lParam:LPARAM <BR> .if uMsg==WM_CREATE
<BR> invoke CreateWindowEx, NULL, addr ListViewClassName,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -