IDE: Visual Studio, C # .net, Type = Windows-Formularanwendung
Hallo, In den Panel-Eigenschaften habe ich den Randstil auf Fixed Single festgelegt.
Wenn ich meine Anwendung starte, wird mir die graue Farbe angezeigt. Ich weiß nicht, wie man die Rahmenfarbe ändert ... Ich habe es im Paint Event von Panel versucht
private void HCp_Paint(object sender, PaintEventArgs e)
{
Panel p = sender as Panel;
ControlPaint.DrawBorder(e.Graphics, p.DisplayRectangle, Color.Yellow, ButtonBorderStyle.Inset);
}
es gibt mir die Grenze wie folgt:
http://i772.photobucket.com/albums/yy9/yogeshkmrsoni/giving_zps877730fc.png
und ich möchte einen festen Rand wie folgt:
http://i772.photobucket.com/albums/yy9/yogeshkmrsoni/want_zps081e3591.png
Ich bin in der Lage, FixedSingle Border zu erhalten, aber es ist in der Farbe Grau, die standardmäßig vom System oder der IDE übernommen wird.
Also pls mir vor, wie ich es in gelber Farbe mache.
Sie können eine eigene Panel
-Klasse erstellen und im Client-Bereich einen Rahmen zeichnen:
[System.ComponentModel.DesignerCategory("Code")]
public class MyPanel : Panel
{
public MyPanel()
{
SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
}
protected override void OnPaint(PaintEventArgs e)
{
using (SolidBrush brush = new SolidBrush(BackColor))
e.Graphics.FillRectangle(brush, ClientRectangle);
e.Graphics.DrawRectangle(Pens.Yellow, 0, 0, ClientSize.Width - 1, ClientSize.Height - 1);
}
}
Ich fand diesen Beitrag hilfreich:
https://vicky4147.wordpress.com/2007/03/04/wie-der-zum-auch-auchzoll-bord-around-aform-or-control/
Ich stelle auch die Auffüllung des Panels auf die Stärke des Randes ein, so dass Steuerelemente im Panel den Rand nicht überlappen und ihn ausblenden. In meinem Fall habe ich die Polsterung sonst nicht verwendet, also war es eine gute Lösung, aber es könnte schwieriger werden, wenn Sie die Polsterung auch für mehr als nur die Grenze verwenden möchten.
nur für den Fall, dass Sie kein benutzerdefiniertes Panel erstellen möchten als Sinatra antwortete:
private void panel1_Paint(object sender, PaintEventArgs e)
{
ControlPaint.DrawBorder(e.Graphics, this.panel1.ClientRectangle, Color.DarkBlue, ButtonBorderStyle.Solid);
}
Wenn Sie sich nicht die Mühe machen möchten, ein Panel zu untergliedern, können Sie einfach ein weiteres Panel erstellen, das in jeder Dimension um 2 Pixel größer ist, die Rahmenfarbe festlegen und direkt hinter dem Panel platzieren, das einen Rahmen benötigt. Dies sind nur ein paar Klicks in der IDE ...
Nach einer Problemumgehung beim Erstellen meines benutzerdefinierten Bedienfelds. Ich musste ein anderes Tweak anwenden, um die Überlappung des Rahmens zu lösen, wenn die Größe des untergeordneten Steuerelements> Größe des Bedienfelds. In dem Tweak anstelle des Bedienfelds, das den Rahmen zeichnet, wird es vom übergeordneten Steuerelement gezeichnet.
Public Class SharpPanel : Inherits Panel
Sub New()
Padding = New Padding(2)
SetStyle(ControlStyles.SupportsTransparentBackColor, True)
SetStyle(ControlStyles.ResizeRedraw, True)
SetStyle(ControlStyles.UserPaint, True)
SetStyle(ControlStyles.AllPaintingInWmPaint, True)
SetStyle(ControlStyles.ContainerControl, True)
SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
SetStyle(ControlStyles.ContainerControl, True)
Width = 100
Height = 100
TabStop = False
End Sub
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
Dim p As Control = Me.Parent
Dim gr As Graphics = p.CreateGraphics
Dim rec As Rectangle = Me.ClientRectangle
If Me.VerticalScroll.Visible Then
rec.Width = rec.Width + SystemInformation.VerticalScrollBarWidth
End If
If Me.HorizontalScroll.Visible Then
rec.Height = rec.Height + SystemInformation.HorizontalScrollBarHeight
End If
rec.Location = Me.Location
rec.Inflate(1, 1)
gr.DrawRectangle(New Pen(Color.Pink), rec)
End sub
End Class