ButtonRenderer 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
提供一些方法,这些方法使用或不使用视觉样式呈现按钮控件。 此类不能被继承。
public ref class ButtonRenderer sealed
public ref class ButtonRenderer abstract sealed
public sealed class ButtonRenderer
public static class ButtonRenderer
type ButtonRenderer = class
Public NotInheritable Class ButtonRenderer
Public Class ButtonRenderer
- 继承
-
ButtonRenderer
示例
下面的代码示例演示如何创建自定义控件,该控件使用 DrawButton 该方法绘制按钮。 单击按钮时,控件在原始按钮的边界内绘制一个较小的按钮,并且该控件使用 DrawParentBackground 该方法绘制原始按钮的其余部分。
#using <System.dll>
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;
using namespace System::Windows::Forms::VisualStyles;
namespace ButtonRendererSample
{
public ref class CustomButton : public Control
{
private:
Rectangle clickRectangleValue;
private:
PushButtonState state;
public:
CustomButton()
{
__super::Control();
this->Size = System::Drawing::Size(100, 40);
this->Location = Point(50, 50);
this->Font = SystemFonts::IconTitleFont;
this->Text = "Click here";
clickRectangleValue = Rectangle();
state = PushButtonState::Normal;
}
// Define the bounds of the smaller pressed button.
public:
property Rectangle ClickRectangle
{
Rectangle get()
{
clickRectangleValue.X = ClientRectangle.X +
(int)(.2 * ClientRectangle.Width);
clickRectangleValue.Y = ClientRectangle.Y +
(int)(.2 * ClientRectangle.Height);
clickRectangleValue.Width = ClientRectangle.Width -
(int)(.4 * ClientRectangle.Width);
clickRectangleValue.Height = ClientRectangle.Height -
(int)(.4 * ClientRectangle.Height);
return clickRectangleValue;
}
}
// Draw the large or small button, depending on the current state.
protected:
virtual void OnPaint(PaintEventArgs^ e) override
{
__super::OnPaint(e);
// Draw the smaller pressed button image
if (state == PushButtonState::Pressed)
{
// Set the background color to the parent if visual styles
// are disabled, because DrawParentBackground will only paint
// over the control background if visual styles are enabled.
if (Application::RenderWithVisualStyles)
{
this->BackColor = Color::Azure;
}
else
{
this->BackColor = this->Parent->BackColor;
}
// If you comment out the call to DrawParentBackground,
// the background of the control will still be visible
// outside the pressed button, if visual styles are enabled.
ButtonRenderer::DrawParentBackground(e->Graphics,
ClientRectangle, this);
ButtonRenderer::DrawButton(e->Graphics, ClickRectangle,
this->Text, this->Font, true, state);
}
// Draw the bigger unpressed button image.
else
{
ButtonRenderer::DrawButton(e->Graphics, ClientRectangle,
this->Text, this->Font, false, state);
}
}
// Draw the smaller pressed button image.
protected:
virtual void OnMouseDown(MouseEventArgs^ e) override
{
__super::OnMouseDown(e);
this->Text = "Clicked!";
state = PushButtonState::Pressed;
Invalidate();
}
// Draw the button in the hot state.
protected:
virtual void OnMouseEnter(EventArgs^ e) override
{
__super::OnMouseEnter(e);
this->Text = "Click here";
state = PushButtonState::Hot;
Invalidate();
}
// Draw the button in the unpressed state.
protected:
virtual void OnMouseLeave(EventArgs^ e) override
{
__super::OnMouseLeave(e);
this->Text = "Click here";
state = PushButtonState::Normal;
Invalidate();
}
// Draw the button hot if the mouse is released on the button.
protected:
virtual void OnMouseUp(MouseEventArgs^ e) override
{
__super::OnMouseUp(e);
OnMouseEnter(e);
}
// Detect when the cursor leaves the button area while
// it is pressed.
protected:
virtual void OnMouseMove(MouseEventArgs^ e) override
{
__super::OnMouseMove(e);
// Detect when the left mouse button is down and
// the cursor has left the pressed button area.
if ((e->Button & ::MouseButtons::Left) == ::MouseButtons::Left &&
!ClientRectangle.Contains(e->Location) &&
state == PushButtonState::Pressed)
{
OnMouseLeave(e);
}
}
};
ref class Form1 : public Form
{
public:
Form1()
{
__super::Form();
CustomButton^ Button1 = gcnew CustomButton();
Controls->Add(Button1);
if (Application::RenderWithVisualStyles)
{
this->Text = "Visual Styles Enabled";
}
else
{
this->Text = "Visual Styles Disabled";
}
}
};
}
using namespace ButtonRendererSample;
[STAThread]
int main()
{
// If you do not call EnableVisualStyles below, then
// ButtonRenderer automatically detects this and draws
// the button without visual styles.
Application::EnableVisualStyles();
Application::Run(gcnew Form1());
}
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
namespace ButtonRendererSample
{
class Form1 : Form
{
public Form1()
: base()
{
CustomButton Button1 = new CustomButton();
Controls.Add(Button1);
if (Application.RenderWithVisualStyles)
this.Text = "Visual Styles Enabled";
else
this.Text = "Visual Styles Disabled";
}
[STAThread]
static void Main()
{
// If you do not call EnableVisualStyles below, then
// ButtonRenderer automatically detects this and draws
// the button without visual styles.
Application.EnableVisualStyles();
Application.Run(new Form1());
}
}
public class CustomButton : Control
{
private Rectangle clickRectangleValue = new Rectangle();
private PushButtonState state = PushButtonState.Normal;
public CustomButton()
: base()
{
this.Size = new Size(100, 40);
this.Location = new Point(50, 50);
this.Font = SystemFonts.IconTitleFont;
this.Text = "Click here";
}
// Define the bounds of the smaller pressed button.
public Rectangle ClickRectangle
{
get
{
clickRectangleValue.X = ClientRectangle.X +
(int)(.2 * ClientRectangle.Width);
clickRectangleValue.Y = ClientRectangle.Y +
(int)(.2 * ClientRectangle.Height);
clickRectangleValue.Width = ClientRectangle.Width -
(int)(.4 * ClientRectangle.Width);
clickRectangleValue.Height = ClientRectangle.Height -
(int)(.4 * ClientRectangle.Height);
return clickRectangleValue;
}
}
// Draw the large or small button, depending on the current state.
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// Draw the smaller pressed button image
if (state == PushButtonState.Pressed)
{
// Set the background color to the parent if visual styles
// are disabled, because DrawParentBackground will only paint
// over the control background if visual styles are enabled.
this.BackColor = Application.RenderWithVisualStyles ?
Color.Azure : this.Parent.BackColor;
// If you comment out the call to DrawParentBackground,
// the background of the control will still be visible
// outside the pressed button, if visual styles are enabled.
ButtonRenderer.DrawParentBackground(e.Graphics,
ClientRectangle, this);
ButtonRenderer.DrawButton(e.Graphics, ClickRectangle,
this.Text, this.Font, true, state);
}
// Draw the bigger unpressed button image.
else
{
ButtonRenderer.DrawButton(e.Graphics, ClientRectangle,
this.Text, this.Font, false, state);
}
}
// Draw the smaller pressed button image.
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
this.Text = "Clicked!";
state = PushButtonState.Pressed;
Invalidate();
}
// Draw the button in the hot state.
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
this.Text = "Click here";
state = PushButtonState.Hot;
Invalidate();
}
// Draw the button in the unpressed state.
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
this.Text = "Click here";
state = PushButtonState.Normal;
Invalidate();
}
// Draw the button hot if the mouse is released on the button.
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
OnMouseEnter(e);
}
// Detect when the cursor leaves the button area while
// it is pressed.
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
// Detect when the left mouse button is down and
// the cursor has left the pressed button area.
if ((e.Button & MouseButtons.Left) == MouseButtons.Left &&
!ClientRectangle.Contains(e.Location) &&
state == PushButtonState.Pressed)
{
OnMouseLeave(e);
}
}
}
}
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Windows.Forms.VisualStyles
Namespace ButtonRendererSample
Class Form1
Inherits Form
Public Sub New()
Dim Button1 As New CustomButton()
Controls.Add(Button1)
If Application.RenderWithVisualStyles Then
Me.Text = "Visual Styles Enabled"
Else
Me.Text = "Visual Styles Disabled"
End If
End Sub
<STAThread()> _
Shared Sub Main()
' If you do not call EnableVisualStyles below, then
' ButtonRenderer automatically detects this and draws
' the button without visual styles.
Application.EnableVisualStyles()
Application.Run(New Form1())
End Sub
End Class
Public Class CustomButton
Inherits Control
Private clickRectangleValue As New Rectangle()
Private state As PushButtonState = PushButtonState.Normal
Public Sub New()
With Me
Size = New Size(100, 40)
Location = New Point(50, 50)
Font = SystemFonts.IconTitleFont
Text = "Click here"
End With
End Sub
' Define the bounds of the smaller pressed button.
Public ReadOnly Property ClickRectangle() As Rectangle
Get
With clickRectangleValue
.X = Me.ClientRectangle.X + CInt(0.2 * _
Me.ClientRectangle.Width)
.Y = Me.ClientRectangle.Y + CInt(0.2 * _
Me.ClientRectangle.Height)
.Width = Me.ClientRectangle.Width - _
CInt(0.4 * Me.ClientRectangle.Width)
.Height = Me.ClientRectangle.Height - _
CInt(0.4 * Me.ClientRectangle.Height)
End With
Return clickRectangleValue
End Get
End Property
' Draw the large or small button, depending on the current state.
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
' Draw the smaller pressed button image.
If state = PushButtonState.Pressed Then
' Set the background color to the parent if visual styles
' are disabled, because DrawParentBackground will only paint
' over the control background if visual styles are enabled.
If Application.RenderWithVisualStyles Then
Me.BackColor = Color.Azure
Else
Me.BackColor = Me.Parent.BackColor
End If
' If you comment out the call to DrawParentBackground,
' the background of the control will still be visible
' outside the pressed button, if visual styles are enabled.
ButtonRenderer.DrawParentBackground(e.Graphics, _
Me.ClientRectangle, Me)
ButtonRenderer.DrawButton(e.Graphics, ClickRectangle, _
Me.Text, Me.Font, True, state)
' Draw the bigger unpressed button image.
Else
ButtonRenderer.DrawButton(e.Graphics, Me.ClientRectangle, _
Me.Text, Me.Font, False, state)
End If
End Sub
' Draw the smaller pressed button image.
Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
MyBase.OnMouseDown(e)
With Me
.Text = "Clicked!"
.state = PushButtonState.Pressed
End With
Invalidate()
End Sub
' Draw the button in the hot state.
Protected Overrides Sub OnMouseEnter(ByVal e As EventArgs)
MyBase.OnMouseEnter(e)
With Me
.Text = "Click here"
.state = PushButtonState.Hot
End With
Invalidate()
End Sub
' Draw the button in the unpressed state.
Protected Overrides Sub OnMouseLeave(ByVal e As EventArgs)
MyBase.OnMouseLeave(e)
With Me
.Text = "Click here"
.state = PushButtonState.Normal
End With
Invalidate()
End Sub
' Draw the button hot if the mouse is released on the button.
Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
MyBase.OnMouseUp(e)
OnMouseEnter(e)
End Sub
' Detect when the cursor leaves the button area while it
' is pressed.
Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
MyBase.OnMouseMove(e)
' Detect when the left mouse button is down and
' the cursor has left the pressed button area.
If (e.Button And MouseButtons.Left) = MouseButtons.Left And Not _
Me.ClientRectangle.Contains(e.Location) And _
state = PushButtonState.Pressed Then
OnMouseLeave(e)
End If
End Sub
End Class
End Namespace
注解
该 ButtonRenderer 类提供了一组 static
可用于呈现按钮控件的方法。 呈现控件是指绘制控件的用户界面。 若要绘制按钮,请使用其中 DrawButton 一种方法。 这些方法提供了各种选项,例如在按钮上绘制文本或图像。
如果在操作系统中启用了视觉样式,并且视觉样式应用于当前应用程序, DrawButton 则会使用当前视觉样式绘制按钮。 否则,DrawButton将使用经典Windows样式绘制按钮。 如果要绘制应自动匹配操作系统的当前视觉样式设置的自定义控件,这非常有用。
此类包装 System.Windows.Forms.VisualStyles.VisualStyleRenderer 设置为类公开 System.Windows.Forms.VisualStyles.VisualStyleElement.Button.PushButton 的元素之一的功能。 有关详细信息,请参阅 使用视觉样式呈现控件。
属性
RenderMatchingApplicationState |
获取或设置一个值,该值指示呈现器是否使用应用程序状态来确定呈现样式。 |
方法
DrawButton(Graphics, Rectangle, Boolean, PushButtonState) |
在指定边界内使用一个可选焦点矩形绘制指定状态的按钮控件。 |
DrawButton(Graphics, Rectangle, Image, Rectangle, Boolean, PushButtonState) |
在指定边界内使用指定图像和一个可选焦点矩形绘制指定状态的按钮控件。 |
DrawButton(Graphics, Rectangle, PushButtonState) |
在指定边界内绘制指定状态的按钮控件。 |
DrawButton(Graphics, Rectangle, String, Font, Boolean, PushButtonState) |
在指定边界内使用指定文本和一个可选焦点矩形绘制指定状态的按钮控件。 |
DrawButton(Graphics, Rectangle, String, Font, Image, Rectangle, Boolean, PushButtonState) |
在指定边界内使用指定文本、图像和一个可选焦点矩形绘制指定状态的按钮控件。 |
DrawButton(Graphics, Rectangle, String, Font, TextFormatFlags, Boolean, PushButtonState) |
在指定边界内使用指定文本、文本格式和一个可选焦点矩形绘制指定状态的按钮控件。 |
DrawButton(Graphics, Rectangle, String, Font, TextFormatFlags, Image, Rectangle, Boolean, PushButtonState) |
在指定边界内使用指定文本、文本格式、图像和一个可选焦点矩形绘制指定状态的按钮控件。 |
DrawParentBackground(Graphics, Rectangle, Control) |
在指定区域中绘制控件的父级的背景。 |
IsBackgroundPartiallyTransparent(PushButtonState) |
指示按钮的背景是否有半透明部分或 Alpha 混合部分。 |