提供邢台企业做网站西宁房地产网站建设
;运行效果

;双击后

;上源码,仔细研究里面的几条备注就理解原理了
;提取窗口程序内生成的listview列表控件的内容示例程序
 ;抄下面源码,可以在radasm里面直接编译运行。主要的部分加了备注。
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
         .386
         .model flat,stdcall
         option casemap:none
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 ; Include 文件定义
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 include        windows.inc
 include        gdi32.inc
 includelib    gdi32.lib
 include        user32.inc
 includelib    user32.lib
 include        kernel32.inc
 includelib    kernel32.lib
include        gdi32.inc         ;加入这个
 includelib    gdi32.lib         ;加入这个
 include         comctl32.inc      ;加入这个
 includelib      comctl32.lib      ;加入这个
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 ; 数据段
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
         .data?
hInstance    dd        ?
 hWinMain    dd        ?
h_List dd ?
        .const
 szClassName    db    'MyClass',0
 szCaptionMain    db    'win32汇编环境窗口程序listview列表控件点击排序示例',0
sz_Colon_Signal    db        ':',0   ;冒号
 sz_Enter_Signal    db        0dh,0ah,0      ;回车换行符
 szDblickName_List  db        "当前双击的是",0 
szlistViewClassName db "SysListView32",0 ;加这个
Heading1          db        "序号",0   ;第1列名称
 Heading2          db        "姓名",0   ;第1列名称
 Heading3          db        "性别",0 
Heading2_1        db        "刘备",0   ;第2列第1行字符串
 Heading2_2        db        "绍婵",0   ;第2列第2行字符串 
 Heading2_3        db        "关羽",0
 Heading2_4        db        "西施",0
Heading3_1        db        "男",0 
 Heading3_2        db        "女",0
 Heading3_3        db        "男",0 
 Heading3_4        db        "女",0 
                 .data
                  
 sztemplate        db        "%d",0   ;格式化序号用
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 ; 代码段
         .code
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 RGB macro red,green,blue ;颜色宏,让listview列表控件好看点
   xor eax,eax 
   mov ah,blue 
   shl eax,8 
   mov ah,green 
   mov al,red 
 endm 
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 _ShowCurrentFocus proc    ;提取被双击到的某项内容
         LOCAL lvi:LV_ITEM 
         LOCAL szbuffer[256]:BYTE 
         LOCAL szAllShowbuffer[256]:BYTE
         
         invoke  RtlZeroMemory,addr szbuffer,sizeof szbuffer
         invoke  RtlZeroMemory,addr szAllShowbuffer,sizeof szAllShowbuffer                      ;缓冲区清空,防止此片内存有残留内容。
         
         invoke SendMessage,h_List,LVM_GETNEXTITEM,-1, LVNI_FOCUSED    ;LVM_GETNEXTITEM消息搜索有指定属性的行,比如指定LVNI_FOCUSED属性,而LVNI_FOCUSED就是具有焦点,即被选中的行
         mov lvi.iItem,eax 
         
         mov lvi.iSubItem,0 
         mov lvi.imask,LVIF_TEXT 
         lea eax,szbuffer 
         mov lvi.pszText,eax 
         mov lvi.cchTextMax,256 
         invoke SendMessage,h_List,LVM_GETITEM,0,addr lvi 
         invoke lstrcat,addr szAllShowbuffer,addr Heading1
         invoke lstrcat,addr szAllShowbuffer,addr sz_Colon_Signal   ;加冒号
         invoke lstrcat,addr szAllShowbuffer,addr szbuffer          ;加提取到的数据
         invoke lstrcat,addr szAllShowbuffer,addr sz_Enter_Signal   ;加回车换行
    
         mov lvi.iSubItem,1 
         mov lvi.imask,LVIF_TEXT 
         lea eax,szbuffer 
         mov lvi.pszText,eax 
         mov lvi.cchTextMax,256 
         invoke SendMessage,h_List,LVM_GETITEM,0,addr lvi 
         invoke lstrcat,addr szAllShowbuffer,addr Heading2
         invoke lstrcat,addr szAllShowbuffer,addr sz_Colon_Signal
         invoke lstrcat,addr szAllShowbuffer,addr szbuffer
         invoke lstrcat,addr szAllShowbuffer,addr sz_Enter_Signal   ;加回车换行
    
         mov lvi.iSubItem,2 
         mov lvi.imask,LVIF_TEXT 
         lea eax,szbuffer 
         mov lvi.pszText,eax 
         mov lvi.cchTextMax,256 
         invoke SendMessage,h_List,LVM_GETITEM,0,addr lvi 
         invoke lstrcat,addr szAllShowbuffer,addr Heading3
         invoke lstrcat,addr szAllShowbuffer,addr sz_Colon_Signal
         invoke lstrcat,addr szAllShowbuffer,addr szbuffer
       
         invoke MessageBox,0, addr szAllShowbuffer,addr szDblickName_List,MB_OK or MB_ICONINFORMATION 
         ret 
 _ShowCurrentFocus endp 
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 _ShowListViewInfo proc             ;显示列表视图里的每项信息
     LOCAL lvItem:LV_ITEM
     LOCAL @buffer[10]:byte
     
     ;以下填充第1行的内容
     mov lvItem.imask,LVIF_TEXT    
     mov lvItem.iItem, 0      ;0为第1列,从0开始计算
     mov lvItem.iSubItem, 0   ;0为第1行
     invoke wsprintf,addr @buffer, addr sztemplate,1      ;格式化第1列第1行要显示的字符串
     lea eax, @buffer
     mov lvItem.pszText, eax
     mov lvItem.cchTextMax, sizeof Heading1
     invoke SendMessage, h_List, LVM_INSERTITEM, 0, addr lvItem
         
     mov lvItem.imask,LVIF_TEXT  
     mov lvItem.iSubItem,1
     lea eax,offset Heading2_1
     mov lvItem.pszText,eax 
     invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem
   
     mov lvItem.imask,LVIF_TEXT  
     mov lvItem.iSubItem,2
     lea eax,offset Heading3_1
     mov lvItem.pszText,eax 
     invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem
   
     ;以下填充第2行的内容
     mov lvItem.iItem, 1
     mov lvItem.iSubItem, 0  
     invoke wsprintf,addr @buffer, addr sztemplate,2      ;第1列第2行字符串
     lea eax, @buffer
     mov lvItem.pszText, eax
     invoke SendMessage, h_List, LVM_INSERTITEM, 0, addr lvItem
     
     mov lvItem.imask,LVIF_TEXT  
     mov lvItem.iSubItem,1
     lea eax,offset Heading2_2
     mov lvItem.pszText,eax 
     invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem
   
     mov lvItem.imask,LVIF_TEXT  
     mov lvItem.iSubItem,2
     lea eax,offset Heading3_2
     mov lvItem.pszText,eax 
     invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem
     
     ;以下填充第3行的内容
     mov lvItem.iItem, 2
     mov lvItem.iSubItem, 0
     invoke wsprintf,addr @buffer, addr sztemplate,3      ;第1列第3行字符串
     lea eax, @buffer
     mov lvItem.pszText, eax
     invoke SendMessage, h_List, LVM_INSERTITEM, 0, addr lvItem
     
     mov lvItem.imask,LVIF_TEXT  
     mov lvItem.iSubItem,1
     lea eax,offset Heading2_3
     mov lvItem.pszText,eax 
     invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem
   
     mov lvItem.imask,LVIF_TEXT  
     mov lvItem.iSubItem,2
     lea eax,offset Heading3_3
     mov lvItem.pszText,eax 
     invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem
     
     ;以下填充第4行的内容
     mov lvItem.iItem, 3
     mov lvItem.iSubItem, 0
     invoke wsprintf,addr @buffer, addr sztemplate,4      ;第1列第4行字符串
     lea eax, @buffer
     mov lvItem.pszText, eax
     invoke SendMessage, h_List, LVM_INSERTITEM, 0, addr lvItem
     
     mov lvItem.imask,LVIF_TEXT  
     mov lvItem.iSubItem,1
     lea eax,offset Heading2_4
     mov lvItem.pszText,eax 
     invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem
   
     mov lvItem.imask,LVIF_TEXT  
     mov lvItem.iSubItem,2
     lea eax,offset Heading3_4
     mov lvItem.pszText,eax 
     invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem
    
   ret 
 _ShowListViewInfo endp 
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 _List_InsertColumn proc                                       ;插入列数及名称的函数
   LOCAL lvc:LV_COLUMN 
  mov lvc.imask,LVCF_TEXT+LVCF_WIDTH
   mov lvc.pszText,offset Heading1  ;第1列的标题栏名称
   mov lvc.lx,100     ;宽度
   invoke SendMessage,h_List, LVM_INSERTCOLUMN, 0, addr lvc
   
   or lvc.imask,LVCF_FMT
   mov lvc.fmt,LVCFMT_LEFT
   mov lvc.pszText,offset Heading2  ;第2列的标题栏名称 
   mov lvc.lx,150
   invoke SendMessage,h_List, LVM_INSERTCOLUMN, 1 ,addr lvc 
   
   mov lvc.pszText,offset Heading3
   mov lvc.lx,125
   invoke SendMessage,h_List, LVM_INSERTCOLUMN, 2 ,addr lvc 
    
   ret 
 _List_InsertColumn endp 
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 ; 窗口过程
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 _ProcWinMain    proc    uses ebx edi esi,hWnd,uMsg,wParam,lParam
         local    @stPs:PAINTSTRUCT
         local    @stRect:RECT
         local    @hDc
         
         LOCAL   @DEFAULT_GUI_FONT,@OLD_DEFAULT_GUI_FONT   ;加入这个,字体使用
        mov    eax,uMsg
 ;********************************************************************
         .if    eax ==    WM_PAINT
             invoke    BeginPaint,hWnd,addr @stPs
            invoke    EndPaint,hWnd,addr @stPs
         .elseif    eax ==    WM_CREATE
             mov    eax,hWnd
             mov    hWinMain,eax
             
                         invoke  GetStockObject,DEFAULT_GUI_FONT   
                         mov @DEFAULT_GUI_FONT,eax 
                    invoke  CreateWindowEx, NULL, addr szlistViewClassName, NULL, LVS_REPORT or WS_CHILD or WS_VISIBLE, \                           ;名单列表视图
                            0,0,0,0,hWnd, NULL, hInstance, NULL 
                         mov     h_List, eax 
                         mov     eax,LVS_EX_FULLROWSELECT or LVS_EX_GRIDLINES or LVS_EX_SUBITEMIMAGES    ;设置ListView全行选择,网格等样式.
                         invoke  SendMessage,h_List,LVM_SETEXTENDEDLISTVIEWSTYLE,0,eax
                         invoke  ImageList_Create,0,35,ILC_COLORDDB or ILC_MASK,0,0                      ;调整ImageList高,就可调整listView行高,就是把它撑大点
                         invoke  SendMessage,h_List,LVM_SETIMAGELIST,LVSIL_SMALL,eax            
                         invoke  SendMessage,h_List,WM_SETFONT,@DEFAULT_GUI_FONT,TRUE
                         
                         RGB 0,0,0 
                         invoke  SendMessage,h_List,LVM_SETTEXTCOLOR,0,eax    ;设置文本颜色
                         RGB 131,175,155
                         invoke  SendMessage,h_List,LVM_SETBKCOLOR,0,eax      ;设置背景颜色
                         RGB 131,175,155
                         invoke  SendMessage,h_List,LVM_SETTEXTBKCOLOR,0,eax  ;设置文本背景颜色
                         
                         invoke    MoveWindow,h_List,0,0,375,520,TRUE            ;调整列表视图的位置才能显示出来
                         invoke  _List_InsertColumn                            ;调用初始化ListView控件的函数 
                         invoke  _ShowListViewInfo                             ;调用初始化显示列表视图内容的函数
          .elseif eax== WM_NOTIFY                                       ;当事件发生或控件需要一些信息时,由公共控件发送到其父窗口。
                         push edi 
                         mov edi,lParam                  ;接收到了 WM_NOTIFY 消息后,lParam 包含了指向 NMHDR 型结构体变量的指针。我们通过把列表视图控件的值和 NMHDR 型                                            
                         assume edi:ptr NMHDR            ;结构体变量中的 hwndFrom 成员变量的值比较来判断,如果相等的话就可以确定消息是列表视图控件发送的 
                         mov eax,[edi].hwndFrom 
                         .if eax==h_List 
                                 .if [edi].code==NM_DBLCLK            ;双击项目显示第一条信息
                                         invoke _ShowCurrentFocus     ;调用提取listview控件内容并弹出信息的函数
                                 .endif 
                         .endif 
                         pop edi 
 ;********************************************************************
         .elseif    eax ==    WM_CLOSE
             invoke    DestroyWindow,hWinMain
             invoke    PostQuitMessage,NULL
 ;********************************************************************
         .else
             invoke    DefWindowProc,hWnd,uMsg,wParam,lParam
             ret
         .endif
 ;********************************************************************
         xor    eax,eax
         ret
_ProcWinMain    endp
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 _WinMain    proc
         local    @stWndClass:WNDCLASSEX
         local    @stMsg:MSG
         
                 invoke    InitCommonControls     ;加上这句
         invoke    GetModuleHandle,NULL
         mov    hInstance,eax
         invoke    RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
 ;********************************************************************
 ; 注册窗口类
 ;********************************************************************
         invoke    LoadCursor,0,IDC_ARROW
         mov    @stWndClass.hCursor,eax
         push    hInstance
         pop    @stWndClass.hInstance
         mov    @stWndClass.cbSize,sizeof WNDCLASSEX
         mov    @stWndClass.style,CS_HREDRAW or CS_VREDRAW
         mov    @stWndClass.lpfnWndProc,offset _ProcWinMain
         mov    @stWndClass.hbrBackground,COLOR_WINDOW + 1
         mov    @stWndClass.lpszClassName,offset szClassName
         invoke    RegisterClassEx,addr @stWndClass
 ;********************************************************************
 ; 建立并显示窗口
 ;********************************************************************
         invoke    CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
             WS_OVERLAPPEDWINDOW,\
             100,100,395,420,\
             NULL,NULL,hInstance,NULL
         mov    hWinMain,eax
         invoke    ShowWindow,hWinMain,SW_SHOWNORMAL
         invoke    UpdateWindow,hWinMain
 ;********************************************************************
 ; 消息循环
 ;********************************************************************
         .while    TRUE
             invoke    GetMessage,addr @stMsg,NULL,0,0
             .break    .if eax    == 0
             invoke    TranslateMessage,addr @stMsg
             invoke    DispatchMessage,addr @stMsg
         .endw
         ret_WinMain    endp
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 start:
         call    _WinMain
         invoke    ExitProcess,NULL
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
         end    start
