Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I den här artikeln beskrivs anpassade kontroller och hur de skiljer sig från användarkontroller. Anpassade kontroller har ingen visuell designyta och ritar sig själva med kod som användaren tillhandahåller. Den här designen skiljer sig från användarkontroller, vilket ger en visuell designyta för att gruppera flera kontroller i en enda återanvändbar enhet.
Använd anpassade kontroller när en befintlig kontroll eller användarkontroll inte är i närheten av att tillhandahålla det användargränssnitt eller interaktivitet som du behöver. De kräver mer arbete från din sida för att implementera dem fullt ut. Windows Forms tillhandahåller fortfarande tangentbords- och mushantering, men du måste implementera specifika beteenden. En anpassad kontroll innehåller inte någon designyta eftersom all ritning görs via kod i OnPaint metoden. Du kan fortfarande lägga till komponenter, till exempel en Timer, via den icke-visualiska designytan.
Basklass
När du skapar en anpassad kontroll väljer du mellan två basklasser:
-
Den här basklassen är samma som används av andra Windows Forms-kontroller. Du styr kontrollens indata och utdata direkt.
System.Windows.Forms.ScrollableControl
Den här basklassen används av vissa Windows Forms-kontroller. Det utökas
Controlgenom att lägga till möjligheten att skrolla innehållet.
Om du inte behöver rulla innehållet i den anpassade kontrollen använder Control du som basklass.
Ärvda funktioner
Eftersom basklassen för en anpassad kontroll är Controlärver du automatiskt Windows Forms-funktioner som delas av alla kontroller. Här följer några av de funktioner som du får med en anpassad kontroll:
- Tangentbords- och musinmatning.
- Layoutbeteenden, till exempel förankring och dockning.
- Stöd för tabbning.
- Begränsningar för minsta och högsta storlek.
Målning
Målning innebär att rita kontrollens visuella representation. Du utför den här uppgiften genom att åsidosätta metoden OnPaint. Mer information om hur kontroller målar finns i Måla och rita på kontroller.
När du skapar en anpassad kontroll med hjälp av Visual Studio-mallarna åsidosätter OnPaint du metoden automatiskt. Mallen gör detta eftersom du måste skriva den kod som ritar ditt kontrollelement. Här är ett exempel på vad mallen genererar:
public partial class CustomControl1 : Control
{
public CustomControl1()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
}
Public Class CustomControl1
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
'Add your custom paint code here
End Sub
End Class
Du målar en anpassad kontroll med hjälp av metoden OnPaint. Den här metoden tar ett enda argument, ett PaintEventArgs -objekt, som innehåller all information och funktionalitet som du behöver för att återge din kontroll.
PaintEventArgs innehåller två egenskaper som du använder för att återge kontrollen:
PaintEventArgs.ClipRectangle— Representerar den del av kontrollen som måste ritas om. Den här delen kan vara hela kontrollelementet eller bara en del av det.
Graphics— Representerar kontrollens grafiska yta. Den innehåller flera grafikorienterade objekt och metoder som ger dig de funktioner som krävs för att dra din kontroll.
Metoden OnPaint anropas när kontrollen ritas eller uppdateras på skärmen och PaintEventArgs.ClipRectangle objektet representerar den rektangel där målningen äger rum. Om hela kontrollen behöver uppdateras PaintEventArgs.ClipRectangle representerar storleken på hela kontrollen. Om endast en del av kontrollen behöver uppdateras representerar den bara den region som behöver ritas om. Ett exempel på ett sådant fall skulle vara när en kontroll delvis döljs av en annan kontroll i användargränssnittet, och att andra kontroller flyttas bort, den nyligen exponerade delen av kontrollen under måste ritas om.
Koden i OnPaint-metoden hos en kontroll körs när kontrollen först ritas och när den blir ogiltigförklarad. För att säkerställa att kontrollen ritas om varje gång storleken ändras, lägger du till följande rad i kontrollens konstruktor:
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.ResizeRedraw, True)
Exempel
Följande kodfragment är en anpassad kontroll som återger flera färgade rektanglar runt kontrollens kant.
protected override void OnPaint(PaintEventArgs pe)
{
Rectangle rect = this.ClientRectangle;
// Bring the width/height in by 1 pixel so the rectangle is drawn inside the control.
// Otherwise, it kind of overlaps the outside edge.
rect.Width -= 1;
rect.Height -= 1;
Pen[] colorPens = new Pen[] { Pens.Blue, Pens.BlueViolet,
Pens.AliceBlue, Pens.CornflowerBlue,
Pens.Cyan, Pens.DarkCyan };
foreach (Pen pen in colorPens)
{
pe.Graphics.DrawRectangle(pen, rect);
rect.Inflate(-1, -1);
}
// Raise the Paint event so users can custom paint if they want.
base.OnPaint(pe);
}
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim rect As Rectangle = Me.ClientRectangle
'Bring the width/height in by 1 pixel so the rectangle is drawn inside the control.
'Otherwise, it kind of overlaps the outside edge.
rect.Width -= 1
rect.Height -= 1
Dim colorPens As Pen() = {Pens.Blue, Pens.BlueViolet,
Pens.AliceBlue, Pens.CornflowerBlue,
Pens.Cyan, Pens.DarkCyan}
For Each curPen As Pen In colorPens
e.Graphics.DrawRectangle(curPen, rect)
rect.Inflate(-1, -1)
Next
'Raise the Paint event so users can custom paint if they want.
MyBase.OnPaint(e)
End Sub
Föregående kod skapar en kontroll som ser ut som följande bild:
Bakgrund
Observera att kontrollens bakgrund är målad med SystemColors.Control färgen, även om OnPaint koden inte rensar eller fyller kontrollen med en färg. Metoden OnPaintBackground(PaintEventArgs) målar upp bakgrunden innan den anropar OnPaint. Åsidosätt OnPaintBackground för att hantera bakgrundsritningen för kontrollen. Standardimplementeringen av den här metoden ritar färgen som anges av BackColor-egenskapen och bilden som anges av BackgroundImage-egenskapen.
Relaterat innehåll
.NET Desktop feedback