Hallo,
ich hab ein UserControl mit einem Panel, was mir Probleme mit dem scrollen bereitet. AutoScroll ist natürlich true. Ich habe folgenden Code:
EDIT: Der Code steht in dem UserControl
Private filter As ScrollPanelMessageFilter
Private Sub Panel1_Scroll(ByVal sender As System.Object, ByVal e As _
System.Windows.Forms.ScrollEventArgs) Handles Panel1.Scroll
lblScrollValue.Text = e.NewValue.ToString
End Sub
Private Sub btnScroll_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btnScroll.Click
ScrollToBottom()
End Sub
Public Sub ScrollToBottom()
Panel1.VerticalScroll.Value = Panel1.DisplayRectangle.Height - _
Panel1.ClientRectangle.Height
End Sub
Private Sub ViewerList_MouseEnter(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.MouseEnter, Panel1.MouseEnter
filter = New ScrollPanelMessageFilter(Me.Panel1)
Application.AddMessageFilter(filter)
End Sub
Private Sub ViewerList_MouseLeave(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.MouseLeave
Application.RemoveMessageFilter(filter)
End Sub
Private Class ScrollPanelMessageFilter
Implements IMessageFilter
Private Panel As Panel
Private panelHasFocus As Boolean = False
Const WM_MOUSEWHEEL As Integer = &H20A
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal _
hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal _
lParam As Integer) As Integer
Public Sub New(ByVal Panel As Panel)
Me.Panel = Panel
AddFocusEvents(Panel)
End Sub
Private Sub AddFocusEvents(ByVal parentControl As Control)
' Für jedes Control die entsprechenden Events hinzufügen
For Each ctrl As Control In parentControl.Controls
If ctrl.Controls.Count = 0 Then
' Events hinzufügen
AddHandler ctrl.GotFocus, AddressOf control_GotFocus
AddHandler ctrl.LostFocus, AddressOf control_LostFocus
Else
' Methode rekursiv ausführen, wenn Sub-Control Controls enthält
AddFocusEvents(ctrl)
End If
Next
End Sub
Private Sub control_GotFocus(ByVal sender As Object, ByVal e As EventArgs)
panelHasFocus = True
End Sub
Private Sub control_LostFocus(ByVal sender As Object, ByVal e As _
EventArgs)
panelHasFocus = False
End Sub
Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) _
As Boolean Implements _
System.Windows.Forms.IMessageFilter.PreFilterMessage
If m.Msg = WM_MOUSEWHEEL And Panel.CanFocus And Not panelHasFocus And _
Panel.VerticalScroll.Visible Then
Dim rect As Rectangle = Panel.RectangleToScreen( _
Panel.ClientRectangle)
Dim cursorPoint As New Point(Cursor.Position.X, Cursor.Position.Y)
' If-Abfrage, wenn Scrollen nur möglich sein soll, wenn der
' Mauszeiger
' über dem Panel ist
' If (cursorPoint.X > rect.X And cursorPoint.X < rect.X +
' rect.Width) And (cursorPoint.Y > rect.Y And cursorPoint.Y <
' rect.Y + rect.Height) Then
SendMessage(CInt(Panel.Handle), m.Msg, CInt(m.WParam), CInt( _
m.LParam))
Return True
' End If
End If
Return False
End Function
End Class Mit dem ScrollPanelMessageFilter kann ich das Panel scrollen, sobald ich mit der Maus über dem userControl bin. Aber das wird nicht mehr zurückgesetzt, wenn ich das UserControl verlasse? Das wäre mein erstes Problem. Mein zweites Problem ist das Scrollen bis ganz nach unten. Dazu habe ich ienen Button, der das bezwecken soll, allerdings bleibt die Scrollbar an der gleichen Stelle (gescrollt wird trotzdem!). Gibts dafür eine Lösung?
Beitrag wurde zuletzt am 12.09.08 um 16:26:09 editiert. |