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

📄 031.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 3 页
字号:
  LOCAL finddata:WIN32_FIND_DATA 
  LOCAL FHandle:DWORD 

  invoke FindFirstFile,addr FileNamePattern,addr finddata 
  .if eax!=INVALID_HANDLE_VALUE 
    mov FHandle,eax 
    xor edi,edi 
    .while eax!=0 
      test finddata.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY 
      .if ZERO?
         invoke ShowFileInfo,edi, addr finddata 
         inc edi 
      .endif 
      invoke FindNextFile,FHandle,addr finddata 
    .endw 
    invoke FindClose,FHandle 
  .endif 
  ret 
FillFileInfo endp 

String2Dword proc uses ecx edi edx esi String:DWORD 
  LOCAL Result:DWORD 

  mov Result,0 
  mov edi,String 
  invoke lstrlen,String 
  .while eax!=0 
    xor edx,edx 
    mov dl,byte ptr [edi] 
    sub dl,"0" 
    mov esi,eax 
    dec esi 
    push eax 
    mov eax,edx 
    push ebx 
    mov ebx,10 
    .while esi > 0 
      mul ebx 
      dec esi 
    .endw 
    pop ebx 
    add Result,eax 
    pop eax 
    inc edi 
    dec eax 
  .endw 
  mov eax,Result 
  ret 
String2Dword endp 

CompareFunc proc uses edi lParam1:DWORD, lParam2:DWORD, SortType:DWORD 
  LOCAL buffer[256]:BYTE 
  LOCAL buffer1[256]:BYTE 
  LOCAL lvi:LV_ITEM 

  mov lvi.imask,LVIF_TEXT 
  lea eax,buffer 
  mov lvi.pszText,eax 
  mov lvi.cchTextMax,256 
  .if SortType==1 
    mov lvi.iSubItem,1 
    invoke SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi 
    invoke String2Dword,addr buffer 
    mov edi,eax 
    invoke SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi 
    invoke String2Dword,addr buffer 
    sub edi,eax 
    mov eax,edi 
  .elseif SortType==2 
    mov lvi.iSubItem,1 
    invoke SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi 
    invoke String2Dword,addr buffer 
    mov edi,eax 
    invoke SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi 
    invoke String2Dword,addr buffer 
    sub eax,edi 
  .elseif SortType==3 
    mov lvi.iSubItem,0 
    invoke SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi 
    invoke lstrcpy,addr buffer1,addr buffer 
    invoke SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi 
    invoke lstrcmpi,addr buffer1,addr buffer 
  .else 
    mov lvi.iSubItem,0 
    invoke SendMessage,hList,LVM_GETITEMTEXT,lParam1,addr lvi 
    invoke lstrcpy,addr buffer1,addr buffer 
    invoke SendMessage,hList,LVM_GETITEMTEXT,lParam2,addr lvi 
    invoke lstrcmpi,addr buffer,addr buffer1 
  .endif 
  ret 
CompareFunc endp 

UpdatelParam proc uses edi 
   LOCAL lvi:LV_ITEM 

   invoke SendMessage,hList, LVM_GETITEMCOUNT,0,0 
   mov edi,eax 
   mov lvi.imask,LVIF_PARAM 
   mov lvi.iSubItem,0 
   mov lvi.iItem,0 
   .while edi>0 
     push lvi.iItem 
     pop lvi.lParam 
     invoke SendMessage,hList, LVM_SETITEM,0,addr lvi 
     inc lvi.iItem 
     dec edi 
   .endw 
   ret 
UpdatelParam endp 

ShowCurrentFocus proc 
   LOCAL lvi:LV_ITEM 
   LOCAL buffer[256]:BYTE 

   invoke SendMessage,hList,LVM_GETNEXTITEM,-1, LVNI_FOCUSED
   mov lvi.iItem,eax 
   mov lvi.iSubItem,0 
   mov lvi.imask,LVIF_TEXT 
   lea eax,buffer 
   mov lvi.pszText,eax 
   mov lvi.cchTextMax,256 
   invoke SendMessage,hList,LVM_GETITEM,0,addr lvi 
   invoke MessageBox,0, addr buffer,addr AppName,MB_OK 
   ret 
ShowCurrentFocus endp 

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
  .if uMsg==WM_CREATE 
    invoke CreateWindowEx, NULL, addr ListViewClassName, NULL, LVS_REPORT+WS_CHILD+WS_VISIBLE, 0,0,0,0,hWnd, NULL, hInstance, NULL 
    mov hList, eax 
    invoke InsertColumn 
    invoke FillFileInfo 
    RGB 255,255,255 
    invoke SendMessage,hList,LVM_SETTEXTCOLOR,0,eax 
    RGB 0,0,0 
    invoke SendMessage,hList,LVM_SETBKCOLOR,0,eax 
    RGB 0,0,0 
    invoke SendMessage,hList,LVM_SETTEXTBKCOLOR,0,eax 
    invoke GetMenu,hWnd 
    mov hMenu,eax 
    invoke CheckMenuRadioItem,hMenu,IDM_ICON,IDM_LIST, IDM_REPORT,MF_CHECKED 
  .elseif uMsg==WM_COMMAND 
    .if lParam==0 
      invoke GetWindowLong,hList,GWL_STYLE 
      and eax,not LVS_TYPEMASK 
      mov edx,wParam 
      and edx,0FFFFh 
      push edx 
      or eax,edx 
      invoke SetWindowLong,hList,GWL_STYLE,eax 
      pop edx 
      invoke CheckMenuRadioItem,hMenu,IDM_ICON,IDM_LIST, edx,MF_CHECKED 
    .endif 
  .elseif uMsg==WM_NOTIFY 
    push edi 
    mov edi,lParam 
    assume edi:ptr NMHDR 
    mov eax,[edi].hwndFrom 
    .if eax==hList 
      .if [edi].code==LVN_COLUMNCLICK 
        assume edi:ptr NM_LISTVIEW 
        .if [edi].iSubItem==1 
          .if SizeSortOrder==0 || SizeSortOrder==2 
            invoke SendMessage,hList,LVM_SORTITEMS,1,addr CompareFunc 
            invoke UpdatelParam 
            mov SizeSortOrder,1 
          .else 
            invoke SendMessage,hList,LVM_SORTITEMS,2,addr CompareFunc 
            invoke UpdatelParam 
            mov SizeSortOrder,2 
          .endif 
        .else 
          .if FileNameSortOrder==0 || FileNameSortOrder==4 
            invoke SendMessage,hList,LVM_SORTITEMS,3,addr CompareFunc 
            invoke UpdatelParam 
            mov FileNameSortOrder,3 
          .else 
            invoke SendMessage,hList,LVM_SORTITEMS,4,addr CompareFunc 
            invoke UpdatelParam 
            mov FileNameSortOrder,4 
          .endif 
        .endif 
        assume edi:ptr NMHDR 
      .elseif [edi].code==NM_DBLCLK 
        invoke ShowCurrentFocus 
      .endif 
    .endif 
    pop edi 
  .elseif uMsg==WM_SIZE
    mov eax,lParam 
    mov edx,eax 
    and eax,0ffffh 
    shr edx,16 
    invoke MoveWindow,hList, 0, 0, eax,edx,TRUE 
  .elseif uMsg==WM_DESTROY 
    invoke PostQuitMessage,NULL 
  .else 
    invoke DefWindowProc,hWnd,uMsg,wParam,lParam 
    ret 
  .endif 
  xor eax,eax 
  ret 
WndProc endp 
end start 

分析:
当主窗口创建后要做的第一件事是创建一个列表视图控件应用程序。

  .if uMsg==WM_CREATE 
    invoke CreateWindowEx, NULL, addr ListViewClassName, NULL, LVS_REPORT+WS_CHILD+WS_VISIBLE, 0,0,0,0,hWnd, NULL, hInstance, NULL 
    mov hList, eax 

我们调用CreateWindowEx来创建窗口,并把窗口类的名称“SysListView32”传给它。缺省的显示方式是报告方式,因为您指定了LVS_REPORT标志作为它的风格。

    invoke InsertColumn 

创建列表视图控件后,我们向其中插入列。 

  LOCAL lvc:LV_COLUMN 

  mov lvc.imask,LVCF_TEXT+LVCF_WIDTH 
  mov lvc.pszText,offset Heading1 
  mov lvc.lx,150 
  invoke SendMessage,hList, LVM_INSERTCOLUMN, 0, addr lvc

我们指定第一列的宽度和列的标题条,为了在该列中显示文件的名称,我们需要在LV_COLUMN 型结构体变量的成员变量iMask中设定标志位LVCF_TEXT 或 LVCF_WIDTH。我们设定pszText为列标题条文本字符串的值,lx设定为列的宽度(以像素点为单位)。然后我们发送LVM_INSERTCOLUMN消息给列表视图控件,并把该结构体变量传递给它。

  or lvc.imask,LVCF_FMT
  mov lvc.fmt,LVCFMT_RIGHT 

插入完第一列后,我们再插入第二列,单击该列的标题条可以按文件的大小排序。因为我们需要右对齐文本,我们需要在成员变量fmt中指定标志位LVCFMT_RIGHT。我们还必须在成员变量iMask中除了标志位LVCF_TEXT 和 LVCF_WIDTH外还需要指定标志位LVCF_FMT。

  mov lvc.pszText,offset Heading2 
  mov lvc.lx,100
  invoke SendMessage,hList, LVM_INSERTCOLUMN, 1 ,addr lvc 

剩余的代码比较简单。在pszText中放入文本字符串的地址,在lx中放入列的宽度。然后发送消息LVM_INSERTCOLUMN 给列表视图控件,在参数中同时传递列号和结构体变量的地址。

当插入完列后,我们向列表控件中加入项目。

    invoke FillFileInfo 

FillFileInfo 的代码如下:

FillFileInfo proc uses edi 
  LOCAL finddata:WIN32_FIND_DATA 
  LOCAL FHandle:DWORD 

  invoke FindFirstFile,addr FileNamePattern,addr finddata 

我们调用FindFirstFile来得到第一个符合搜索标准的的文件的信息。FindFirstFile函数的原型如下

FindFirstFile proto pFileName:DWORD, pWin32_Find_Data:DWORD

pFileName 是用来匹配搜索的文件名的地址。该字符串包含了通配符。在我们的例子中是*.*,这样会搜索当前文件夹中所有的文件。

⌨️ 快捷键说明

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