列表框中的滚动条,如何控制

midas1 2009-07-10 04:56:42
当拖动一个列表框滚动条的时候,如何让另一个列表框滚动条也同时移动?
看到论坛里面有C的例子,但是看不明白,想用汇编语言实现,谁能跟我说下
首先是如何捕获滚动条被拖动的消息,然后如何把消息发给另外一个滚动条,让它跟着动?
查了很多资料,都没看到拖动列表框滚动条的消息是什么.
...全文
92 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
紫郢剑侠 2009-07-11
  • 打赏
  • 举报
回复
WM_HSCROLL水平滚动消息
WM_VSCROLL垂直滚动消息


参数wParam的可能值有:
WM_HSCROLL消息:SB_LEFT=6,往左移。 SB_RIGHT=7,往右移。
SB_LINELEFT=0,往左移动1个单元格
SB_LINERIGHT=1,往右移动1个单元格
SB_PAGELEFT=2,往左移动较多部分。
SB_PAGERIGHT=3,往右移动较多部分。

WM_VSCROLL消息:SB_TOP=6;往上移。 SB_BOTTOM=7;往下移
SB_LINEUP=0;往上移动1个单元格
SB_LINEDOWN=1;往下移动1个单元格。
SB_PAGEUP=2,往上移动较多部分。
SB_PAGEDOWN=3,往下移动较多部分。
水平滚动与垂直滚动消息的wparam参数值实际是相同的。只不过一个是左右滚动,一个是上下滚动而已。
BAYNPU 2009-07-11
  • 打赏
  • 举报
回复
用汇编写列表框中的滚动条够你累了.
pla_007 2009-07-11
  • 打赏
  • 举报
回复
这种问题不适合用汇编来编写。
midas1 2009-07-11
  • 打赏
  • 举报
回复
非常感谢3楼,这个问题我自己解决了,不过不是通过控制滚动条,下面是我的代码
前天遇到这个问题,就是汇编中的列表框只有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



mmxqq 2009-07-11
  • 打赏
  • 举报
回复

mark

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧