Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0201: PanelMoveable

 von 

Über den Tipp  

Dieser Tippvorschlag ist noch unbewertet.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Fenster

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
Form, Panel, Fenster

Der Vorschlag wurde erstellt am: 20.02.2008 14:33.
Die letzte Aktualisierung erfolgte am 20.02.2008 14:33.

Zurück zur Übersicht

Beschreibung  

oft ist einfacher statt einer weiteren Form ein Panel zu verwenden, das aber wie eine Form aussehen soll, z.Bsp. im Datenbankbereich für das Setzen von verschiedenen Filtern. Hier ein verschiebbares (und veränderbares) Panel im Form Look.

Schwierigkeitsgrad

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

Download:

Download des Beispielprojektes [12,96 KB]

' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
'
' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird.
' In den Zip-Dateien ist er jedoch zu finden.

' ------- Anfang Projektdatei PanelMoveableDemo.vbproj -------
' ---------------- Anfang Datei clsPanelMS.vb ----------------
' -----------------------------------------
'  PanelMS (Usercontrol)   VB2005
'  Panel verschieb- und veränderbar (Size)
'  mit Titelleiste
'  als Container für Steuerelemente
'  Ersatz für Form
'
'  Autor       peter.k.sauer@web.de
'  created     02.11.2007
'  update      05.11.2007
' -----------------------------------------

Imports System.Drawing.Drawing2D
Imports System.ComponentModel

Public Class PanelMS

    Inherits Panel

#Region " Events "

    Public Event ClosingByUser(ByRef Cancel As Boolean)
    Public Event ClosedByUser()

#End Region

#Region " Steuerelemente und Variable"

    Private WithEvents lblX As Label
    Private m_TitleText As String
    Private m_Moveable As Boolean
    Private m_MoveX As Integer
    Private m_MoveY As Integer
    Private m_Moving As Boolean
    Private m_SizeAble As Boolean
    Private m_Sizing As Boolean
    Private m_Cursor As String
    Private m_MinWidth As Integer
    Private m_MinHeight As Integer

#End Region

#Region " Properties "
    ''' <summary>
    ''' X-Button sichtbar
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Description("X-Button sichtbar oder nicht")> Public Property CloseButton() As Boolean
        Get
            Return lblX.Visible

        End Get

        Set(ByVal value As Boolean)
            lblX.Visible = value
            Me.Refresh()

        End Set

    End Property

    ''' <summary>
    ''' Mindesbreite Panel
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Description("Mindestbreite des Panels")> Public Property MinWidth() As Integer
        Get
            Return m_MinWidth

        End Get

        Set(ByVal value As Integer)
            m_MinWidth = value

        End Set

    End Property

    ''' <summary>
    ''' Mindesthöhe Panel
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Description("Mindesthöhe des Panels")> Public Property MinHeight() As Integer
        Get
            Return m_MinHeight

        End Get

        Set(ByVal value As Integer)
            m_MinHeight = value

        End Set

    End Property

    ''' <summary>
    ''' Panel verschiebbar
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Description("Panel durch User verschiebbar")> Public Property Moveable() As Boolean
        Get
            Return m_Moveable

        End Get

        Set(ByVal value As Boolean)
            m_Moveable = value

        End Set

    End Property

    ''' <summary>
    ''' Panelgrösse veränderbar
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Description("Panel durch User in der Grösse veränderbar")> Public Property Sizeable() As _
        Boolean

        Get
            Return m_SizeAble

        End Get

        Set(ByVal value As Boolean)
            m_SizeAble = value

        End Set

    End Property

    ''' <summary>
    ''' Text in Titelleiste
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Description("Text in Titelleiste")> Public Property TitleText() As String
        Get
            Return m_TitleText

        End Get

        Set(ByVal value As String)
            m_TitleText = value

        End Set

    End Property

#End Region

#Region " Verschieben und verändern (Size) "
    ''' <summary>
    ''' Check auf Move und Size
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub PanelMS_MouseDown(ByVal sender As Object, ByVal e As _
        System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown

        ' Cursor für Sizing gesetzt
        If Not String.IsNullOrEmpty(m_Cursor) Then
            m_Sizing = True
            Me.SuspendLayout()

            Exit Sub

        End If

        ' Cursor für Move ausserhalb Title
        If e.Y > (TitleRect.Top + TitleRect.Height) Then

            Exit Sub

        End If

        ' Cursor im Bereich Moveable
        If Moveable And (Not m_Sizing) Then
            m_MoveX = e.X
            m_MoveY = e.Y
            m_Moving = True
            Me.Cursor = Cursors.SizeAll
        End If

    End Sub

    ''' <summary>
    ''' Cursor für Sizing auf Default
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub PanelMS_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.MouseLeave

        Me.Cursor = Cursors.Default
        m_Cursor = Nothing

    End Sub

    ''' <summary>
    ''' Moving or Sizing
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub PanelMS_MouseMove(ByVal sender As Object, _
                    ByVal e As System.Windows.Forms.MouseEventArgs) _
                    Handles Me.MouseMove

        ' Grösse des Panels verändern
        ' L=Left R=Right T=Top B=Bottom
        If m_Sizing Then

            Dim Sized As Boolean = False

            If m_Cursor.IndexOf("L"c) >= 0 Then
                If (Me.Left + e.X) >= 0 Then
                    If (Me.Width + (e.X * -1)) > MinWidth Then
                        Me.Left += e.X
                        Me.Width += e.X * -1
                        Sized = True
                    End If
                End If
            End If

            If m_Cursor.IndexOf("R"c) >= 0 Then
                If (Me.Left + e.X + 3) <= Me.Parent.ClientSize.Width Then
                    If (e.X + 3) > MinWidth Then
                        Me.Width = e.X + 3
                        Sized = True
                    End If
                End If
            End If

            If m_Cursor.IndexOf("T"c) >= 0 Then
                If (Me.Top + e.Y) >= 0 Then
                    If (Me.Height + (e.Y * -1) > MinHeight) Then
                        Me.Top += e.Y
                        Me.Height += e.Y * -1
                        Sized = True
                    End If
                End If
            End If

            If m_Cursor.IndexOf("B"c) >= 0 Then
                If (Me.Top + e.Y + 5) <= Me.Parent.ClientSize.Height Then
                    If (e.Y + 5) > MinHeight Then
                        Me.Height = e.Y + 5
                        Sized = True
                    End If
                End If
            End If

            If Sized Then
                Me.Refresh()
            End If

            Exit Sub

        End If

        ' Cursor für Grösse verändern setzen
        If Sizeable And (Not m_Moving) Then

            Dim L As Integer = 5
            Dim R As Integer = Me.Width - 7
            Dim T As Integer = 3
            Dim B As Integer = Me.Height - 7

            m_Cursor = Nothing

            If (e.X <= L) And (e.Y <= T) Then
                Me.Cursor = Cursors.SizeNWSE
                m_Cursor = "LT"

            ElseIf (e.X <= L) And (e.Y >= B) Then

                Me.Cursor = Cursors.SizeNESW
                m_Cursor = "LB"

            ElseIf (e.X >= R) And (e.Y <= T) Then

                Me.Cursor = Cursors.SizeNESW
                m_Cursor = "RT"

            ElseIf (e.X >= R) And (e.Y >= B) Then

                Me.Cursor = Cursors.SizeNWSE
                m_Cursor = "RB"

            ElseIf e.X <= L Then

                Me.Cursor = Cursors.SizeWE
                m_Cursor = "L"

            ElseIf e.X >= R Then

                Me.Cursor = Cursors.SizeWE
                m_Cursor = "R"

            ElseIf e.Y <= T Then

                Me.Cursor = Cursors.SizeNS
                m_Cursor = "T"

            ElseIf e.Y >= B Then

                Me.Cursor = Cursors.SizeNS
                m_Cursor = "B"

            Else

                m_Cursor = Nothing
                Me.Cursor = Cursors.Default
            End If
        End If

        ' Panel verschieben (Move)
        If m_Moving Then

            Dim L As Point = Me.Location

            L.X = L.X + e.X - m_MoveX
            L.Y = L.Y + e.Y - m_MoveY

            If (L.X + Me.Width) > Me.Parent.ClientSize.Width Then
                L.X = Me.Parent.ClientSize.Width - Me.Width
            End If

            If L.X < 0 Then
                L.X = 0
            End If

            If (L.Y + Me.Height) > Me.Parent.ClientSize.Height Then
                L.Y = Me.Parent.ClientSize.Height - Me.Height
            End If

            If L.Y < 0 Then
                L.Y = 0
            End If

            Me.Location = L
        End If

    End Sub

    ''' <summary>
    ''' Moving oder Sizing End
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub PanelMS_MouseUp(ByVal sender As Object, ByVal e As _
        System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp

        m_Moving = False
        m_Sizing = False
        m_Cursor = Nothing
        Me.Cursor = Cursors.Default
        Me.ResumeLayout()

    End Sub

#End Region

    ''' <summary>
    ''' X-Button initialisieren
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub LabelXInit()

        lblX = New Label

        With lblX
            .Parent = Me
            .BorderStyle = Windows.Forms.BorderStyle.None
            .AutoSize = True
            .Font = New Font("Marlett", 7)
            .Text = "r"
            .BackColor = Color.FromArgb(0, 255, 0, 0)
            .ForeColor = Color.Black
            .Location = New Point(Me.ClientSize.Width - 20, 3)
            .Cursor = Cursors.Hand
            .Visible = True
        End With

    End Sub

    ''' <summary>
    ''' liefert Rect der Titeleiste
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function TitleRect() As Drawing.Rectangle

        Dim R As New Rectangle(1, 1, Me.ClientSize.Width - 2, 14)

        Return R

    End Function

    ''' <summary>
    ''' zeichnen Title mit Beschriftung, X-Button positionieren
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub PanelMS_Paint(ByVal sender As Object, _
                    ByVal e As System.Windows.Forms.PaintEventArgs) _
                    Handles Me.Paint

        Dim Gr As Graphics = e.Graphics
        Dim c1 As Color = System.Drawing.SystemColors.ActiveCaption
        Dim c2 As Color = System.Drawing.SystemColors.GradientActiveCaption
        Dim R As Rectangle = TitleRect()

        Using Br As New LinearGradientBrush(TitleRect, c1, c2, LinearGradientMode.Horizontal)
            Gr.FillRectangle(Br, TitleRect)
        End Using

        Using P As New Pen(Color.White)
            Gr.DrawRectangle(P, 0, 0, Me.ClientSize.Width - 1, Me.ClientSize.Height - 1)
        End Using

        If Not String.IsNullOrEmpty(Me.TitleText) Then

            Using Ft As New Font("Arial", 8, FontStyle.Bold)
                Using Br As New SolidBrush(SystemColors.ActiveCaptionText)
                    Gr.DrawString(Me.TitleText, Ft, Brushes.White, 5, 1)
                End Using
            End Using

        End If

        lblX.Location = New Point(Me.ClientSize.Width - 20, 3)

    End Sub

    ''' <summary>
    ''' Panel ausblenden
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub lblX_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lblX.Click

        Dim Cancel As Boolean = False

        RaiseEvent ClosingByUser(Cancel)

        If Not Cancel Then
            Me.Hide()
            RaiseEvent ClosedByUser()
        End If

    End Sub

    ''' <summary>
    ''' BringToFront
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub PanelMS_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.VisibleChanged

        If Me.Visible Then
            Me.BringToFront()
        End If

    End Sub

    ''' <summary>
    ''' Grundeinstellungen
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()

        TitleText = "Panel - ?"
        Moveable = True
        Sizeable = False
        MinWidth = 60
        MinHeight = 30

        Me.BorderStyle = Windows.Forms.BorderStyle.FixedSingle
        Me.BackColor = SystemColors.Control
        Me.ForeColor = SystemColors.WindowText
        LabelXInit()
        Me.Controls.Add(lblX)

    End Sub

    Protected Overrides Sub Finalize()

        lblX.Dispose()
        MyBase.Finalize()

    End Sub

End Class

' ----------------- Ende Datei clsPanelMS.vb -----------------
' ------------------ Anfang Datei Form1.vb  ------------------
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles Button1.Click

        PanelMS1.Hide()

    End Sub

    Private Sub PanelMS1_ClosingByUser(ByRef Cancel As Boolean) Handles PanelMS1.ClosingByUser

        Dim Msg As String = "ist das erlaubt ? "

        If MessageBox.Show(Msg, "Panel", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = _
            Windows.Forms.DialogResult.No Then

            Cancel = True
        End If

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles Button2.Click

        PanelMS1.Show()

    End Sub

    Private Sub PanelMS1_Paint(ByVal sender As System.Object, ByVal e As _
        System.Windows.Forms.PaintEventArgs)

    End Sub

End Class

' ------------------- Ende Datei Form1.vb  -------------------
' -------- Ende Projektdatei PanelMoveableDemo.vbproj --------

	

Diskussion  

Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.

Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.