Tipp-Upload: VB.NET 0201: PanelMoveable
von pks
Ü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.
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 |
Verwendete API-Aufrufe: |
Download: |
' 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.