win32汇编环境下,双击窗口程序内生成的listview列表控件的某行,并提取其内容的示例程序

;上源码,仔细研究里面的几条备注就理解原理了

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; Sample code for < Win32ASM Programming >

; by 罗云彬, http://asm.yeah.net

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; FirstWindow.asm

; 窗口程序的模板代码

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 使用 nmake 或下列命令进行编译和链接:

; ml /c /coff FirstWindow.asm

; Link /subsystem:windows FirstWindow.obj

;抄了罗云彬的模版,特留上面内容

;提取窗口程序内生成的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

;运行效果

;双击后

相关推荐
我在人间贩卖青春14 天前
汇编之伪指令
汇编·伪指令
我在人间贩卖青春14 天前
汇编之伪操作
汇编·伪操作
济61714 天前
FreeRTOS基础--堆栈概念与汇编指令实战解析
汇编·嵌入式·freertos
myloveasuka14 天前
汇编TEST指令
汇编
我在人间贩卖青春14 天前
汇编编程驱动LED
汇编·点亮led
我在人间贩卖青春14 天前
汇编和C编程相互调用
汇编·混合编程
myloveasuka15 天前
寻址方式笔记
汇编·笔记·计算机组成原理
请输入蚊子15 天前
《操作系统真象还原》 第六章 完善内核
linux·汇编·操作系统·bochs·操作系统真像还原
myloveasuka15 天前
指令格式举例
汇编·笔记·计算机组成原理
我在人间贩卖青春16 天前
汇编之分支跳转指令
汇编·arm·分支跳转