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

📄 lion-tut-c31.htm

📁 内有一些代码
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<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>&nbsp; xor 
eax,eax <BR>&nbsp; mov ah,blue <BR>&nbsp; shl eax,8 <BR>&nbsp; mov ah,green 
<BR>&nbsp; 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>&nbsp;&nbsp;invoke GetModuleHandle, NULL <BR>&nbsp; mov hInstance,eax 
<BR>&nbsp; invoke WinMain, hInstance,NULL, NULL, SW_SHOWDEFAULT <BR>&nbsp; 
invoke ExitProcess,eax <BR>&nbsp; invoke InitCommonControls <BR>WinMain proc 
hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
<BR>&nbsp;&nbsp;LOCAL wc:WNDCLASSEX <BR>&nbsp;&nbsp;LOCAL msg:MSG <BR>&nbsp; 
LOCAL hwnd:HWND<BR><BR>&nbsp; mov wc.cbSize,SIZEOF WNDCLASSEX <BR>&nbsp; mov 
wc.style, NULL <BR>&nbsp; mov wc.lpfnWndProc, OFFSET WndProc <BR>&nbsp; mov 
wc.cbClsExtra,NULL <BR>&nbsp; mov wc.cbWndExtra,NULL <BR>&nbsp; push hInstance 
<BR>&nbsp; pop wc.hInstance <BR>&nbsp; mov wc.hbrBackground,COLOR_WINDOW+1 
<BR>&nbsp; mov wc.lpszMenuName,IDM_MAINMENU <BR>&nbsp; mov 
wc.lpszClassName,OFFSET ClassName <BR>&nbsp; invoke 
LoadIcon,NULL,IDI_APPLICATION <BR>&nbsp; mov wc.hIcon,eax <BR>&nbsp; mov 
wc.hIconSm,eax <BR>&nbsp; invoke LoadCursor,NULL,IDC_ARROW <BR>&nbsp; mov 
wc.hCursor,eax <BR>&nbsp; invoke RegisterClassEx, addr wc <BR>&nbsp; invoke 
CreateWindowEx,NULL,ADDR ClassName,ADDR AppName, 
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
NULL, NULL, hInst,NULL <BR>&nbsp; mov hwnd,eax <BR>&nbsp; invoke ShowWindow, 
hwnd,SW_SHOWNORMAL <BR>&nbsp; invoke UpdateWindow, hwnd <BR>&nbsp; .while TRUE 
<BR>&nbsp;&nbsp;&nbsp; invoke GetMessage, ADDR msg,NULL,0,0 
<BR>&nbsp;&nbsp;&nbsp; .break .if (!eax) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
invoke TranslateMessage, ADDR msg <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
DispatchMessage, ADDR msg <BR>&nbsp; .endw <BR>&nbsp; mov eax,msg.wParam 
<BR>&nbsp; ret <BR>WinMain endp <BR><BR>InsertColumn proc <BR>&nbsp;&nbsp;LOCAL 
lvc:LV_COLUMN <BR><BR>&nbsp; mov lvc.imask,LVCF_TEXT+LVCF_WIDTH <BR>&nbsp; mov 
lvc.pszText,offset Heading1 <BR>&nbsp; mov lvc.lx,150 <BR>&nbsp; invoke 
SendMessage,hList, LVM_INSERTCOLUMN, 0, addr lvc<BR>&nbsp; or 
lvc.imask,LVCF_FMT<BR>&nbsp; mov lvc.fmt,LVCFMT_RIGHT <BR>&nbsp; mov 
lvc.pszText,offset Heading2 <BR>&nbsp; mov lvc.lx,100<BR>&nbsp; invoke 
SendMessage,hList, LVM_INSERTCOLUMN, 1 ,addr lvc <BR>&nbsp; ret <BR>InsertColumn 
endp <BR><BR>ShowFileInfo proc uses edi row:DWORD, lpFind:DWORD <BR>&nbsp; LOCAL 
lvi:LV_ITEM <BR>&nbsp; LOCAL buffer[20]:BYTE <BR>&nbsp; mov edi,lpFind 
<BR>&nbsp; assume edi:ptr WIN32_FIND_DATA <BR>&nbsp; mov 
lvi.imask,LVIF_TEXT+LVIF_PARAM <BR>&nbsp; push row <BR>&nbsp; pop lvi.iItem 
<BR>&nbsp; mov lvi.iSubItem,0 <BR>&nbsp; lea eax,[edi].cFileName <BR>&nbsp; mov 
lvi.pszText,eax <BR>&nbsp; push row <BR>&nbsp; pop lvi.lParam <BR>&nbsp; invoke 
SendMessage,hList, LVM_INSERTITEM,0, addr lvi <BR>&nbsp; mov lvi.imask,LVIF_TEXT 
<BR>&nbsp; inc lvi.iSubItem <BR>&nbsp; invoke wsprintf,addr buffer, addr 
template,[edi].nFileSizeLow <BR>&nbsp; lea eax,buffer <BR>&nbsp; mov 
lvi.pszText,eax <BR>&nbsp; invoke SendMessage,hList,LVM_SETITEM, 0,addr lvi 
<BR>&nbsp; assume edi:nothing <BR>&nbsp; ret <BR>ShowFileInfo endp 
<BR><BR>FillFileInfo proc uses edi <BR>&nbsp; LOCAL finddata:WIN32_FIND_DATA 
<BR>&nbsp; LOCAL FHandle:DWORD <BR><BR>&nbsp; invoke FindFirstFile,addr 
FileNamePattern,addr finddata <BR>&nbsp; .if eax!=INVALID_HANDLE_VALUE 
<BR>&nbsp;&nbsp;&nbsp; mov FHandle,eax <BR>&nbsp;&nbsp;&nbsp; xor edi,edi 
<BR>&nbsp;&nbsp;&nbsp; .while eax!=0 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test 
finddata.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .if 
ZERO?<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
ShowFileInfo,edi, addr finddata 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc edi 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .endif <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
invoke FindNextFile,FHandle,addr finddata <BR>&nbsp;&nbsp; &nbsp;.endw 
<BR>&nbsp;&nbsp;&nbsp; invoke FindClose,FHandle <BR>&nbsp; .endif <BR>&nbsp; ret 
<BR>FillFileInfo endp <BR><BR>String2Dword proc uses ecx edi edx esi 
String:DWORD <BR>&nbsp; LOCAL Result:DWORD <BR><BR>&nbsp;&nbsp;mov Result,0 
<BR>&nbsp;&nbsp;mov edi,String <BR>&nbsp; invoke lstrlen,String <BR>&nbsp; 
.while eax!=0 <BR>&nbsp;&nbsp;&nbsp; xor edx,edx <BR>&nbsp;&nbsp;&nbsp; mov 
dl,byte ptr [edi] <BR>&nbsp;&nbsp;&nbsp; sub dl,"0" <BR>&nbsp;&nbsp;&nbsp; mov 
esi,eax <BR>&nbsp;&nbsp;&nbsp; dec esi <BR>&nbsp;&nbsp;&nbsp; push eax 
<BR>&nbsp;&nbsp;&nbsp; mov eax,edx <BR>&nbsp;&nbsp;&nbsp; push ebx 
<BR>&nbsp;&nbsp;&nbsp; mov ebx,10 <BR>&nbsp;&nbsp;&nbsp; .while esi &gt; 0 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mul ebx <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
dec esi <BR>&nbsp;&nbsp;&nbsp; .endw <BR>&nbsp;&nbsp;&nbsp; pop ebx 
<BR>&nbsp;&nbsp;&nbsp; add Result,eax <BR>&nbsp;&nbsp;&nbsp; pop eax 
<BR>&nbsp;&nbsp;&nbsp; inc edi <BR>&nbsp;&nbsp;&nbsp; dec eax <BR>&nbsp; .endw 
<BR>&nbsp; mov eax,Result <BR>&nbsp; ret <BR>String2Dword endp 
<BR><BR>CompareFunc proc uses edi lParam1:DWORD, lParam2:DWORD, SortType:DWORD 
<BR>&nbsp; LOCAL buffer[256]:BYTE <BR>&nbsp; LOCAL buffer1[256]:BYTE <BR>&nbsp; 
LOCAL lvi:LV_ITEM <BR><BR>&nbsp; mov lvi.imask,LVIF_TEXT <BR>&nbsp; lea 
eax,buffer <BR>&nbsp; mov lvi.pszText,eax <BR>&nbsp; mov lvi.cchTextMax,256 
<BR>&nbsp; .if SortType==1 <BR>&nbsp;&nbsp;&nbsp; mov lvi.iSubItem,1 
<BR>&nbsp;&nbsp;&nbsp; invoke SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi 
<BR>&nbsp;&nbsp;&nbsp; invoke String2Dword,addr buffer <BR>&nbsp;&nbsp;&nbsp; 
mov edi,eax <BR>&nbsp;&nbsp;&nbsp; invoke 
SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi <BR>&nbsp;&nbsp;&nbsp; invoke 
String2Dword,addr buffer <BR>&nbsp;&nbsp;&nbsp; sub edi,eax 
<BR>&nbsp;&nbsp;&nbsp; mov eax,edi <BR>&nbsp; .elseif SortType==2 
<BR>&nbsp;&nbsp;&nbsp; mov lvi.iSubItem,1 <BR>&nbsp;&nbsp;&nbsp; invoke 
SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi <BR>&nbsp;&nbsp;&nbsp; invoke 
String2Dword,addr buffer <BR>&nbsp;&nbsp;&nbsp; mov edi,eax 
<BR>&nbsp;&nbsp;&nbsp; invoke SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi 
<BR>&nbsp;&nbsp;&nbsp; invoke String2Dword,addr buffer <BR>&nbsp;&nbsp;&nbsp; 
sub eax,edi <BR>&nbsp; .elseif SortType==3 <BR>&nbsp;&nbsp;&nbsp; mov 
lvi.iSubItem,0 <BR>&nbsp;&nbsp;&nbsp; invoke 
SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi <BR>&nbsp;&nbsp;&nbsp; invoke 
lstrcpy,addr buffer1,addr buffer <BR>&nbsp;&nbsp;&nbsp; invoke 
SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi <BR>&nbsp;&nbsp;&nbsp; invoke 
lstrcmpi,addr buffer1,addr buffer <BR>&nbsp; .else <BR>&nbsp;&nbsp;&nbsp; mov 
lvi.iSubItem,0 <BR>&nbsp;&nbsp;&nbsp; invoke 
SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi <BR>&nbsp;&nbsp;&nbsp; invoke 
lstrcpy,addr buffer1,addr buffer <BR>&nbsp;&nbsp;&nbsp; invoke 
SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi <BR>&nbsp;&nbsp;&nbsp; invoke 
lstrcmpi,addr buffer,addr buffer1 <BR>&nbsp; .endif <BR>&nbsp; ret 
<BR>CompareFunc endp <BR><BR>UpdatelParam proc uses edi <BR>&nbsp;&nbsp; LOCAL 
lvi:LV_ITEM <BR><BR>&nbsp;&nbsp; invoke SendMessage,hList, LVM_GETITEMCOUNT,0,0 
<BR>&nbsp;&nbsp; mov edi,eax <BR>&nbsp;&nbsp; mov lvi.imask,LVIF_PARAM 
<BR>&nbsp;&nbsp; mov lvi.iSubItem,0 <BR>&nbsp;&nbsp; mov lvi.iItem,0 
<BR>&nbsp;&nbsp; .while edi&gt;0 <BR>&nbsp;&nbsp;&nbsp;&nbsp; push lvi.iItem 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; pop lvi.lParam <BR>&nbsp;&nbsp;&nbsp;&nbsp; invoke 
SendMessage,hList, LVM_SETITEM,0,addr lvi <BR>&nbsp;&nbsp;&nbsp;&nbsp; inc 
lvi.iItem <BR>&nbsp;&nbsp;&nbsp;&nbsp; dec edi <BR>&nbsp;&nbsp; .endw 
<BR>&nbsp;&nbsp; ret <BR>UpdatelParam endp <BR><BR>ShowCurrentFocus proc 
<BR>&nbsp;&nbsp; LOCAL lvi:LV_ITEM <BR>&nbsp;&nbsp; LOCAL buffer[256]:BYTE 
<BR><BR>&nbsp;&nbsp; invoke SendMessage,hList,LVM_GETNEXTITEM,-1, 
LVNI_FOCUSED<BR>&nbsp;&nbsp; mov lvi.iItem,eax <BR>&nbsp;&nbsp; mov 
lvi.iSubItem,0 <BR>&nbsp;&nbsp; mov lvi.imask,LVIF_TEXT <BR>&nbsp;&nbsp; lea 
eax,buffer <BR>&nbsp;&nbsp; mov lvi.pszText,eax <BR>&nbsp;&nbsp;&nbsp;mov 
lvi.cchTextMax,256 <BR>&nbsp;&nbsp; invoke SendMessage,hList,LVM_GETITEM,0,addr 
lvi <BR>&nbsp;&nbsp; invoke MessageBox,0, addr buffer,addr AppName,MB_OK 
<BR>&nbsp;&nbsp; ret <BR>ShowCurrentFocus endp <BR><BR>WndProc proc hWnd:HWND, 
uMsg:UINT, wParam:WPARAM, lParam:LPARAM <BR>&nbsp;&nbsp;.if uMsg==WM_CREATE 
<BR>&nbsp;&nbsp;&nbsp; invoke CreateWindowEx, NULL, addr ListViewClassName, 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -