SO WIRD'S GEMACHT: Erstellen Sie eine benutzerdefinierte Schaltfläche Bildsteuerung
Dieser Dokumentation für die Vorschau nur ist und in späteren Versionen geändert. Leere Themen wurden als Platzhalter eingefügt.]
Eine Schaltfläche mit einem Bild zu erstellen, müssen Sie ein benutzerdefiniertes Steuerelement erstellen, das von der Windows Forms Control-Klasse abgeleitet ist.
So erstellen Sie eine Schaltfläche mit einem Bild
Erstellen Sie eine Klasse, die von der System.Windows.Forms.Control-Klasse abgeleitet ist.
Definieren Sie Eigenschaften in der Klasse für Schaltflächenbilder, die einen gedrückten und nicht gedrückten Zustand anzeigen.
Verwenden Sie die Invalidate-Methode, damit das Formular neu aufgebaut, wenn die Schaltfläche geklickt wird.
Überschreiben Sie die OnPaint-Methode, um das benutzerdefinierte Steuerelement mit den entsprechenden Bildern zu zeichnen.
Beispiel
Dieses Beispiel enthält eine Klasse, die ein benutzerdefiniertes Steuerelement PictureButton definiert. Es wird eine Instanz des Steuerelements auf das Formular erstellt und vom Steuerelement verwendete Bitmaps definiert.
Imports System
Imports System.Drawing
Imports System.Windows.Forms
PublicClass PictureButtonDemo
Inherits System.Windows.Forms.Form
FriendWithEvents PictureButton1 AsNew PictureButton
PublicSubNew()
' Display the OK close button.Me.MinimizeBox = FalseMe.Text = "Picture Button Demo"
' Create an instance of the PictureButton custom control.With PictureButton1
.Parent = Me
.Bounds = New Rectangle(10, 30, 150, 30)
.ForeColor = Color.White
.BackgroundImageValue = MakeBitmap(Color.Blue, _
PictureButton1.Width, PictureButton1.Height)
.PressedImageValue = MakeBitmap(Color.LightBlue, _
PictureButton1.Width, PictureButton1.Height)
.Text = "Click Me"EndWithEndSub
' Clean up any resources being used.ProtectedOverloadsOverridesSub Dispose(ByVal disposing AsBoolean)
MyBase.Dispose(disposing)
EndSub
' Create a bitmap object and fill it with the specified color. ' To make it look like a custom image, draw an ellipse in it.Function MakeBitmap(ByVal ButtonColor As Color, ByVal width AsInteger, _
ByVal height AsInteger) As Bitmap
Dim bmp AsNew Bitmap(width, height)
Dim g As Graphics = Graphics.FromImage(bmp)
g.FillRectangle(New SolidBrush(ButtonColor), 0, 0, bmp.Width, bmp.Height)
g.DrawEllipse(New Pen(Color.LightGray), 3, 3, width - 6, height - 6)
g.Dispose()
Return bmp
EndFunctionSharedSub Main()
Application.Run(New PictureButtonDemo)
EndSub
' Because PictureButton inherits from Control, ' you can use the default Click event.PrivateSub PictureButton1_Click(ByVal sender AsObject, ByVal e As EventArgs) _
Handles PictureButton1.Click
'Add code here to respond to button click. EndSubEndClass
'Button with an image custom control.PublicClass PictureButton
Inherits Control
Private backgroundImg As Image
Private pressedImg As Image
Private pressed AsBoolean = False
' Property for the background image to be drawn behind the button text.PublicProperty BackgroundImageValue() As Image
GetReturnMe.backgroundImg
EndGetSet(ByVal Value As Image)
Me.backgroundImg = Value
EndSetEndProperty
' Property for the background image to be drawn behind the button text when ' the button is pressed.PublicProperty PressedImageValue() As Image
GetReturnMe.pressedImg
EndGetSet(ByVal Value As Image)
Me.pressedImg = Value
EndSetEndProperty
' When the mouse button is pressed, set the "pressed" flag to true ' and ivalidate the form to cause a repaint. The .NET Compact Framework ' sets the mouse capture automatically.ProtectedOverridesSub OnMouseDown(ByVal e As MouseEventArgs)
Me.pressed = TrueMe.Invalidate()
MyBase.OnMouseDown(e)
EndSub
' When the mouse is released, reset the "pressed" flag ' and invalidate to redraw the button in the unpressed state.ProtectedOverridesSub OnMouseUp(ByVal e As MouseEventArgs)
Me.pressed = FalseMe.Invalidate()
MyBase.OnMouseUp(e)
EndSub
' Override the OnPaint method to draw the background image and the text.ProtectedOverridesSub OnPaint(ByVal e As PaintEventArgs)
IfMe.pressed AndAlso (Me.pressedImg IsNotNothing) Then
e.Graphics.DrawImage(Me.pressedImg, 0, 0)
Else
e.Graphics.DrawImage(Me.backgroundImg, 0, 0)
EndIf
' Draw the text if there is any.IfMe.Text.Length > 0 ThenDim size As SizeF = e.Graphics.MeasureString(Me.Text, Me.Font)
' Center the text inside the client area of the PictureButton.
e.Graphics.DrawString(Me.Text, Me.Font, New SolidBrush(Me.ForeColor), _
(Me.ClientSize.Width - size.Width) / 2, _
(Me.ClientSize.Height - size.Height) / 2)
EndIf
' Draw a border around the outside of the ' control to look like Pocket PC buttons.
e.Graphics.DrawRectangle(New Pen(Color.Black), 0, 0, _
Me.ClientSize.Width - 1, Me.ClientSize.Height - 1)
MyBase.OnPaint(e)
EndSubEndClass
using System;
using System.Drawing;
using System.Windows.Forms;
namespace PictureButton
{
publicclass PictureButtonDemo : System.Windows.Forms.Form
{
int clickCount = 0;
// Create a bitmap object and fill it with the specified color. // To make it look like a custom image, draw an ellipse in it.
Bitmap MakeBitmap(Color color, int width, int height)
{
Bitmap bmp = new Bitmap(width, height);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(new SolidBrush(color), 0, 0, bmp.Width, bmp.Height);
g.DrawEllipse(new Pen(Color.DarkGray), 3, 3, width - 6, height - 6);
g.Dispose();
return bmp;
}
// Create a new PictureButton control and hook up its properties.public PictureButtonDemo()
{
InitializeComponent();
// Display the OK close button.this.MinimizeBox = false;
PictureButton button = new PictureButton();
button.Parent = this;
button.Bounds = new Rectangle(10, 30, 150, 30);
button.ForeColor = Color.White;
button.BackgroundImage = MakeBitmap(Color.Blue, button.Width, button.Height);
button.PressedImage = MakeBitmap(Color.LightBlue, button.Width, button.Height);
button.Text = "click me";
button.Click +=new EventHandler(button_Click);
}
protectedoverridevoid Dispose( bool disposing )
{
base.Dispose( disposing );
}
privatevoid InitializeComponent()
{
this.Text = "Picture Button Demo";
}
staticvoid Main()
{
Application.Run(new PictureButtonDemo());
}
// Since PictureButton inherits from Control, we can just use the default// Click event that Control supports.privatevoid button_Click(object sender, EventArgs e)
{
this.Text = "Click Count = " + ++this.clickCount;
}
}
// This code shows a simple way to have a // button-like control that has a background image.publicclass PictureButton : Control
{
Image backgroundImage, pressedImage;
bool pressed = false;
// Property for the background image to be drawn behind the button text.public Image BackgroundImage
{
get
{
returnthis.backgroundImage;
}
set
{
this.backgroundImage = value;
}
}
// Property for the background image to be drawn behind the button text when// the button is pressed.public Image PressedImage
{
get
{
returnthis.pressedImage;
}
set
{
this.pressedImage = value;
}
}
// When the mouse button is pressed, set the "pressed" flag to true// and invalidate the form to cause a repaint. The .NET Compact Framework // sets the mouse capture automatically.protectedoverridevoid OnMouseDown(MouseEventArgs e)
{
this.pressed = true;
this.Invalidate();
base.OnMouseDown (e);
}
// When the mouse is released, reset the "pressed" flag
// and invalidate to redraw the button in the unpressed state.protectedoverridevoid OnMouseUp(MouseEventArgs e)
{
this.pressed = false;
this.Invalidate();
base.OnMouseUp (e);
}
// Override the OnPaint method to draw the background image and the text.protectedoverridevoid OnPaint(PaintEventArgs e)
{
if(this.pressed && this.pressedImage != null)
e.Graphics.DrawImage(this.pressedImage, 0, 0);
else
e.Graphics.DrawImage(this.backgroundImage, 0, 0);
// Draw the text if there is any.if(this.Text.Length > 0)
{
SizeF size = e.Graphics.MeasureString(this.Text, this.Font);
// Center the text inside the client area of the PictureButton.
e.Graphics.DrawString(this.Text,
this.Font,
new SolidBrush(this.ForeColor),
(this.ClientSize.Width - size.Width) / 2,
(this.ClientSize.Height - size.Height) / 2);
}
// Draw a border around the outside of the // control to look like Pocket PC buttons.
e.Graphics.DrawRectangle(new Pen(Color.Black), 0, 0,
this.ClientSize.Width - 1, this.ClientSize.Height - 1);
base.OnPaint(e);
}
}
}
Kompilieren des Codes
In diesem Beispiel sind Verweise auf die folgenden Namespaces erforderlich:
Siehe auch
Konzepte
Benutzerdefinierte Control Development