-
-
[原创]同步两个列表框 WIN32汇编语言
-
发表于: 2009-7-11 09:56 3368
-
前天遇到这个问题,就是汇编中的列表框只有1列,但是我的数据需要两列显示,怎么办呢?于是就想到再加一个列表框,但是两个列表框怎么同步呢?我开始的想法是,同步两个列表框,肯定要控制两个列表框的滚动条,但是在查了很多资料后,做了很多实验后发现,拖动列表框滚动条的时候,并没有响应的消息,当然也可能是我没有拦截到.同时我发现,选中项目和显示项目都是有相应消息的,于是我就通过一个时钟来控制两个列表框选中同样的项目并显示同样的项目,就写出了下面的代码,程序执行后,效果不错,很象多列的列表框,呵呵
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDD_DLG1 equ 1000
IDC_LST1 equ 1001
IDC_LST2 equ 1002
IDC_UDC1 equ 100
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szTestOut db "%08X", 0
szTestOut1 db "%d", 0
@dwTemp1 db 100 dup(0)
@dwTemp2 db 100 dup(0)
.const
szModel db 'hookdll.dll',0
.code
addrstr proc hWnd ;向列表框中添加数据
mov ecx,1
.while ecx!=100
invoke wsprintf,addr @dwTemp1,addr szTestOut,eax
invoke SendDlgItemMessage,hWnd,IDC_LST1,LB_ADDSTRING,0,addr @dwTemp1
inc ecx
invoke wsprintf,addr @dwTemp2,addr szTestOut1,ecx
invoke SendDlgItemMessage,hWnd,IDC_LST2,LB_ADDSTRING,0,addr @dwTemp2
imul eax,ecx
.endw
ret
addrstr endp
_proctime proc hwnd,wmsg,idevent,dwtime ;时钟周期函数
invoke SendDlgItemMessage,hwnd,IDC_LST1,LB_GETCURSEL,0,0 ;获取列表框1的当前选中项
invoke SendDlgItemMessage,hwnd,IDC_LST2,LB_SETCURSEL,eax,0 ;同步列表框2的当前选中项
invoke SendDlgItemMessage,hwnd,IDC_LST1,LB_GETTOPINDEX,0,0 ;获取列表框1的当前显示项目
invoke SendDlgItemMessage,hwnd,IDC_LST2,LB_SETTOPINDEX,eax,0 ;获取列表框2的当前显示项目
ret
_proctime endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
mov eax,wMsg
;********************************************************************
.if eax == WM_CLOSE
invoke KillTimer,hWnd,IDC_UDC1 ;停止时钟周期
invoke EndDialog,hWnd,NULL
;********************************************************************
.elseif eax == WM_INITDIALOG
invoke SetTimer,hWnd,IDC_UDC1,100,addr _proctime ;设置时钟周期以及时钟回调函数
invoke addrstr,hWnd
.elseif eax == WM_COMMAND
;********************************************************************
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle,NULL
invoke DialogBoxParam,eax,IDD_DLG1,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDD_DLG1 equ 1000
IDC_LST1 equ 1001
IDC_LST2 equ 1002
IDC_UDC1 equ 100
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szTestOut db "%08X", 0
szTestOut1 db "%d", 0
@dwTemp1 db 100 dup(0)
@dwTemp2 db 100 dup(0)
.const
szModel db 'hookdll.dll',0
.code
addrstr proc hWnd ;向列表框中添加数据
mov ecx,1
.while ecx!=100
invoke wsprintf,addr @dwTemp1,addr szTestOut,eax
invoke SendDlgItemMessage,hWnd,IDC_LST1,LB_ADDSTRING,0,addr @dwTemp1
inc ecx
invoke wsprintf,addr @dwTemp2,addr szTestOut1,ecx
invoke SendDlgItemMessage,hWnd,IDC_LST2,LB_ADDSTRING,0,addr @dwTemp2
imul eax,ecx
.endw
ret
addrstr endp
_proctime proc hwnd,wmsg,idevent,dwtime ;时钟周期函数
invoke SendDlgItemMessage,hwnd,IDC_LST1,LB_GETCURSEL,0,0 ;获取列表框1的当前选中项
invoke SendDlgItemMessage,hwnd,IDC_LST2,LB_SETCURSEL,eax,0 ;同步列表框2的当前选中项
invoke SendDlgItemMessage,hwnd,IDC_LST1,LB_GETTOPINDEX,0,0 ;获取列表框1的当前显示项目
invoke SendDlgItemMessage,hwnd,IDC_LST2,LB_SETTOPINDEX,eax,0 ;获取列表框2的当前显示项目
ret
_proctime endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
mov eax,wMsg
;********************************************************************
.if eax == WM_CLOSE
invoke KillTimer,hWnd,IDC_UDC1 ;停止时钟周期
invoke EndDialog,hWnd,NULL
;********************************************************************
.elseif eax == WM_INITDIALOG
invoke SetTimer,hWnd,IDC_UDC1,100,addr _proctime ;设置时钟周期以及时钟回调函数
invoke addrstr,hWnd
.elseif eax == WM_COMMAND
;********************************************************************
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle,NULL
invoke DialogBoxParam,eax,IDD_DLG1,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start

赞赏
他的文章
- [求助]基于TCP的FLASH网页游戏如何调试 11860
- [求助]一个注册帐号问题 14738
- [求助][求助]请问安卓下有没有类似OllyDBG的动态调试工具 13721
- [求助]一个国外软件,通过网络验证的注册码 4469
- [求助]软件跟踪调试项目,数据转图片如何实现,高手看过来,酬金3000元。 4888
谁下载
cache
小虾
ysoni
amdey
iislove
回心转意
muyen
foxjinlin
dttom
hackroad
kagayaki
yzwyq
上网鱼
AChinese
阳小子
轩辕小聪
vvsky
shuimoyan
whyhnlsj
薛凌云xly
ccgto
fatalzero
落叶清风
独孤剑圣
dahubaobao
bozer
cmdxhz
taotzu
ptcql
chenqaing
我最贵
vistaisok
leivn
hyp
哈哈在世
wanghg
colcn
sssccc
yanexp
ImHolly
tlj
太粗糙了
jackozoo
AmaranthF
mycdba
DRIFT漂移
赞赏
雪币:
留言: