又是一个鼠标滚轮拉动的问题!!!愁愁愁!!!

selectme 2007-03-06 06:30:06
我自己做了一个控件,然后把它放到了窗体中的PictureBox控件当中。一切运行正常且良好,但是运行起来这个控件在窗体中比较多,为了用户能够浏览到下面的部分,我没有办法只能在PictureBox控件旁边加上了一个VScrollBar控件,然后写代码:
Picture1.Top = -VScroll1.Value

就想当拉动这个VScrollBar控件的时候,PictureBox控件能够移动显示出下面的需要浏览的控件

请问高手,怎么样才能使鼠标滚轮让这个VScrollBar控件向下拉动实现我的功能???

拜求拜求!!!!!!
...全文
355 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
angelwing559 2007-03-07
  • 打赏
  • 举报
回复
谢谢了,收藏
DengXingJie 2007-03-07
  • 打赏
  • 举报
回复
此方法与yachong(蚜虫)的类似

'模组中
Option Explicit

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const GWL_WNDPROC As Long = (-4)
Private Const WM_MOUSEWHEEL As Long = &H20A
Private m_OldWindowProc As Long

Public Sub HookWheel()
m_OldWindowProc = SetWindowLong(Form1.hWnd, GWL_WNDPROC, AddressOf pvWindowProc)
End Sub

Private Function pvWindowProc(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Select Case wMsg

Case WM_MOUSEWHEEL
Select Case wParam
Case Is > 0
SendKeys "{Up}"
Case Else
SendKeys "{Down}"
End Select
End Select
pvWindowProc = CallWindowProc(m_OldWindowProc, hWnd, wMsg, wParam, lParam)
End Function


'窗体中
Option Explicit

Private Sub Form_Load()
Call HookWheel
End Sub

Private Sub Pic2_Click()
VScroll1.SetFocus
End Sub
DengXingJie 2007-03-07
  • 打赏
  • 举报
回复
你需要设置VScroll的LargeChange及SmallChange两个属性的值

你要的是支持滑轮刚刚没有看清题,等下我再给你找点资料
selectme 2007-03-07
  • 打赏
  • 举报
回复
杰西你的方法我试过了,然后我再用上了蚜虫的代码,然后滚动滚轮看到Picture1微微地再跟着鼠标滚轮在上下动,但是,是很小很小的范围...

还有为什么要达到可以显示所有控件呢?
DengXingJie 2007-03-07
  • 打赏
  • 举报
回复
用两个PictureBox来实现
第一个Pic1设为你想要在FORM中显示的大小
第二个Pic2做大一点,大到能全部显示你要显示的所有控件(你的控件就放在Pic2中)
然后把Pic2放在Pic1中,
最后用Pic2.Top = -VScroll1.Value
你试试看
yachong 2007-03-07
  • 打赏
  • 举报
回复
我试验是可以的,鼠标滚轮可以滚动VScrollBar
说说你那里是怎么不行?表现是什么?
selectme 2007-03-07
  • 打赏
  • 举报
回复
其实只要鼠标滚轮让这个VScrollBar控件滚动就应该实现功能了
selectme 2007-03-07
  • 打赏
  • 举报
回复
还是不行,希望今天能有高人解决一下,希望蚜虫老大能回来再看看
kmlxk0 2007-03-06
  • 打赏
  • 举报
回复
...标准处理就是用subclass

控件内subclassing可以参考hookmenu的源代码
selectme 2007-03-06
  • 打赏
  • 举报
回复
暂时好像不行,请再关注一下
yachong 2007-03-06
  • 打赏
  • 举报
回复
Private Sub Form_Load()
lngPreProc = SetWindowLong(Picture1.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Private Sub Form_Unload(Cancel As Integer)
SetWindowLong Picture1.hwnd, GWL_WNDPROC, lngPreProc
End Sub
=======================================================================
模块内容:
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public lngPreProc As Long

Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error Resume Next
If uMsg <> 522 Then
WindowProc = CallWindowProc(lngPreProc, hwnd, uMsg, wParam, lParam)
Else '滚轮
On Error Resume Next
With Form1.VScroll1
If wParam > 0 Then
.Value = .Value - .SmallChange
Else
.Value = .Value + .SmallChange
End If
End With
End If
End Function

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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