VisualStyleRenderer Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Innehåller metoder för att rita och hämta information om en VisualStyleElement. Det går inte att ärva den här klassen.
public ref class VisualStyleRenderer sealed
public sealed class VisualStyleRenderer
type VisualStyleRenderer = class
Public NotInheritable Class VisualStyleRenderer
- Arv
-
VisualStyleRenderer
Exempel
I följande kodexempel används VisualStyleRenderer klassen för att implementera en anpassad kontroll som simulerar en del av det grundläggande användargränssnittet i ett fönster, inklusive att dra med namnlisten, ändra storlek med storlekshandtaget och stänga. I det här exemplet används flera VisualStyleElement objekt som representerar standarddelar i ett fönster, inklusive de element som exponeras av klasserna VisualStyleElement.Window.Caption, VisualStyleElement.Window.CloseButtonoch VisualStyleElement.Status.Gripper .
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
#using <System.dll>
using namespace System;
using namespace System::Text;
using namespace System::Drawing;
using namespace System::Drawing::Drawing2D;
using namespace System::Collections::Generic;
using namespace System::Windows::Forms;
using namespace System::Windows::Forms::VisualStyles;
namespace VisualStyleRendererSample
{
public ref class WindowSimulation : public Control
{
private:
Dictionary<String^, VisualStyleElement^>^ windowElements;
Dictionary<String^, Rectangle>^ elementRectangles;
VisualStyleRenderer^ renderer;
Point closeButtonOffset;
System::Drawing::Size gripperSize;
System::Drawing::Size closeButtonSize;
bool isResizing;
bool isMoving;
bool isClosing;
int captionHeight;
int frameThickness;
int statusHeight;
Point originalClick;
Point resizeOffset;
public:
WindowSimulation() : Control()
{
statusHeight = 22;
windowElements = gcnew Dictionary<String^, VisualStyleElement^>();
elementRectangles = gcnew Dictionary<String^, Rectangle>();
this->Location = Point(50, 50);
this->Size = System::Drawing::Size(350, 300);
this->BackColor = Color::Azure;
this->DoubleBuffered = true;
this->MinimumSize = System::Drawing::Size(300, 200);
this->Font = SystemFonts::CaptionFont;
this->Text = "Simulated Window";
// Insert the VisualStyleElement objects into the Dictionary.
windowElements->Add("windowCaption",
VisualStyleElement::Window::Caption::Active);
windowElements->Add("windowBottom",
VisualStyleElement::Window::FrameBottom::Active);
windowElements->Add("windowLeft",
VisualStyleElement::Window::FrameLeft::Active);
windowElements->Add("windowRight",
VisualStyleElement::Window::FrameRight::Active);
windowElements->Add("windowClose",
VisualStyleElement::Window::CloseButton::Normal);
windowElements->Add("statusBar",
VisualStyleElement::Status::Bar::Normal);
windowElements->Add("statusGripper",
VisualStyleElement::Status::Gripper::Normal);
// Get the sizes and location offsets for the window parts
// as specified by the visual style, and then use this
// information to calcualate the rectangles for each part.
GetPartDetails();
CalculateRectangles();
this->MouseDown +=
gcnew MouseEventHandler(this,
&WindowSimulation::ImitationWindow_MouseDown);
this->MouseUp +=
gcnew MouseEventHandler(this,
&WindowSimulation::ImitationWindow_MouseUp);
this->MouseMove +=
gcnew MouseEventHandler(this,
&WindowSimulation::ImitationWindow_MouseMove);
}
// Get the sizes and offsets for the window parts as specified
// by the visual style.
private:
void GetPartDetails()
{
// Do nothing further if visual styles are not enabled.
if (!Application::RenderWithVisualStyles)
{
return;
}
Graphics^ g = this->CreateGraphics();
// Get the size and offset of the close button.
if (SetRenderer(windowElements["windowClose"]))
{
closeButtonSize =
renderer->GetPartSize(g, ThemeSizeType::True);
closeButtonOffset =
renderer->GetPoint(PointProperty::Offset);
}
// Get the height of the window caption.
if (SetRenderer(windowElements["windowCaption"]))
{
captionHeight = renderer->GetPartSize(g,
ThemeSizeType::True).Height;
}
// Get the thickness of the left, bottom,
// and right window frame.
if (SetRenderer(windowElements["windowLeft"]))
{
frameThickness = renderer->GetPartSize(g,
ThemeSizeType::True).Width;
}
// Get the size of the resizing gripper.
if (SetRenderer(windowElements["statusGripper"]))
{
gripperSize = renderer->GetPartSize(g,
ThemeSizeType::True);
}
}
// Use the part metrics to determine the current size
// of the rectangles for all of the window parts.
private:
void CalculateRectangles()
{
int heightMinusFrame =
ClientRectangle.Height - frameThickness;
// Calculate the window frame rectangles and add them
// to the Dictionary of rectangles.
elementRectangles["windowCaption"] = Rectangle(0, 0,
ClientRectangle.Width, captionHeight);
elementRectangles["windowBottom"] = Rectangle(0,
heightMinusFrame, ClientRectangle.Width, frameThickness);
elementRectangles["windowLeft"] = Rectangle(0, captionHeight,
frameThickness, heightMinusFrame - captionHeight);
elementRectangles["windowRight"] = Rectangle(
ClientRectangle.Width - frameThickness, captionHeight,
frameThickness, heightMinusFrame - captionHeight);
// Calculate the window button rectangle and add it
// to the Dictionary of rectangles.
elementRectangles["windowClose"] =
Rectangle(ClientRectangle.Right +
closeButtonOffset.X - closeButtonSize.Width - frameThickness, closeButtonOffset.Y,
closeButtonSize.Width, closeButtonSize.Height);
// Calculate the status bar rectangles and add them
// to the Dictionary of rectangles.
elementRectangles["statusBar"] =
Rectangle(frameThickness,
heightMinusFrame - statusHeight,
ClientRectangle.Width - (2 * frameThickness),
statusHeight);
elementRectangles["statusGripper"] =
Rectangle(ClientRectangle.Right -
gripperSize.Width - frameThickness,
heightMinusFrame - gripperSize.Height,
gripperSize.Width, gripperSize.Height);
}
protected:
virtual void OnPaint(PaintEventArgs^ e) override
{
__super::OnPaint(e);
// Ensure that visual styles are supported.
if (!Application::RenderWithVisualStyles)
{
this->Text = "Visual styles are not enabled.";
TextRenderer::DrawText(e->Graphics, this->Text,
this->Font, this->Location, this->ForeColor);
return;
}
// Set the clip region to define the curved corners
// of the caption.
SetClipRegion();
// Draw each part of the window.
for each(KeyValuePair<String^, VisualStyleElement^>^ entry
in windowElements)
{
if (SetRenderer(entry->Value))
{
renderer->DrawBackground(e->Graphics,
elementRectangles[entry->Key]);
}
}
// Draw the caption text.
TextRenderer::DrawText(e->Graphics, this->Text, this->Font,
elementRectangles["windowCaption"], Color::White,
TextFormatFlags::VerticalCenter |
TextFormatFlags::HorizontalCenter);
}
private:
// Initiate dragging, resizing, or closing the imitation window.
void ImitationWindow_MouseDown(Object^ sender, MouseEventArgs^ e)
{
// The user clicked the close button.
if (elementRectangles["windowClose"].Contains(e->Location))
{
windowElements["windowClose"] =
VisualStyleElement::Window::CloseButton::Pressed;
isClosing = true;
}
// The user clicked the status grip.
else if (elementRectangles["statusGripper"].Contains(e->Location))
{
isResizing = true;
this->Cursor = Cursors::SizeNWSE;
resizeOffset.X = this->Right - this->Left - e->X;
resizeOffset.Y = this->Bottom - this->Top - e->Y;
}
// The user clicked the window caption.
else if (elementRectangles["windowCaption"].Contains(e->Location))
{
isMoving = true;
originalClick.X = e->X;
originalClick.Y = e->Y;
}
Invalidate();
}
// Stop any current resizing or moving actions.
void ImitationWindow_MouseUp(Object^ sender, MouseEventArgs^ e)
{
// Stop moving the location of the window rectangles.
if (isMoving)
{
isMoving = false;
}
// Change the cursor back to the default if the user
// stops resizing.
else if (isResizing)
{
isResizing = false;
}
// Close the application if the user clicks the
// close button.
else if (elementRectangles["windowClose"].Contains(e->Location)
&& isClosing)
{
Application::Exit();
}
}
// Handle resizing or moving actions.
void ImitationWindow_MouseMove(Object^ sender,
MouseEventArgs^ e)
{
// The left mouse button is down.
if ((::MouseButtons::Left & e->Button) == ::MouseButtons::Left)
{
// Calculate the new control size if the user is
// dragging the resizing grip.
if (isResizing)
{
this->Width = e->X + resizeOffset.X;
this->Height = e->Y + resizeOffset.Y;
CalculateRectangles();
}
// Calculate the new location of the control if the
// user is dragging the window caption.
else if (isMoving)
{
int XChange = this->Location.X + (e->X - originalClick.X);
int YChange = this->Location.Y + (e->Y - originalClick.Y);
this->Location = Point(XChange, YChange);
}
// Cancel the closing action if the user clicked
// and held down on the close button, and has dragged
// the pointer outside the button.
else if (!elementRectangles["windowClose"].Contains(
e->Location) && isClosing)
{
isClosing = false;
windowElements["windowClose"] =
VisualStyleElement::Window::CloseButton::Normal;
}
}
// The left mouse button is not down.
else
{
// Paint the close button hot if the cursor is on it.
Rectangle^ closeRectangle =
elementRectangles["windowClose"];
if (closeRectangle->Contains(e->Location))
{
windowElements["windowClose"] =
VisualStyleElement::Window::CloseButton::Hot;
}
else
{
windowElements["windowClose"] =
VisualStyleElement::Window::CloseButton::Normal;
}
// Use a resizing cursor if the cursor is on the
// status grip.
Rectangle^ gripRectangle = elementRectangles["statusGripper"];
if (gripRectangle->Contains(e->Location))
{
this->Cursor = Cursors::SizeNWSE;
}
else
{
this->Cursor = Cursors::Default;
}
}
Invalidate();
}
// Calculate and set the clipping region for the control
// so that the corners of the title bar are rounded.
private:
void SetClipRegion()
{
if (!Application::RenderWithVisualStyles)
{
return;
}
Graphics^ g = this->CreateGraphics();
// Get the current region for the window caption.
if (SetRenderer(windowElements["windowCaption"]))
{
System::Drawing::Region^ clipRegion =
renderer->GetBackgroundRegion(g,
elementRectangles["windowCaption"]);
// Get the client rectangle, but exclude the region
// of the window caption.
int height = (int)clipRegion->GetBounds(g).Height;
System::Drawing::Rectangle nonCaptionRect = Rectangle(
ClientRectangle.X, ClientRectangle.Y + height,
ClientRectangle.Width, ClientRectangle.Height - height);
// Add the rectangle to the caption region, and
// make this region the form's clipping region.
clipRegion->Union(nonCaptionRect);
this->Region = clipRegion;
}
}
// Set the VisualStyleRenderer to a new element.
private:
bool SetRenderer(VisualStyleElement^ element)
{
if (!VisualStyleRenderer::IsElementDefined(element))
{
return false;
}
if (renderer == nullptr)
{
renderer = gcnew VisualStyleRenderer(element);
}
else
{
renderer->SetParameters(element);
}
return true;
}
};
public ref class Form1 : public Form
{
public:
Form1() : Form()
{
this->Size = System::Drawing::Size(800, 600);
this->Location = Point(20, 20);
this->BackColor = Color::DarkGray;
WindowSimulation^ ws = gcnew WindowSimulation();
Controls->Add(ws);
}
};
}
[STAThread]
int main()
{
Application::EnableVisualStyles();
Application::Run(gcnew VisualStyleRendererSample::Form1());
}
using System;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
namespace VisualStyleRendererSample
{
class Form1 : Form
{
public Form1()
: base()
{
this.Size = new Size(800, 600);
this.Location = new Point(20, 20);
this.BackColor = Color.DarkGray;
WindowSimulation Window1 = new WindowSimulation();
Controls.Add(Window1);
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form1());
}
}
public class WindowSimulation : Control
{
private Dictionary<string, VisualStyleElement> windowElements =
new Dictionary<string, VisualStyleElement>();
private Dictionary<string, Rectangle> elementRectangles =
new Dictionary<string, Rectangle>();
private VisualStyleRenderer renderer = null;
private Point closeButtonOffset;
private Size gripperSize;
private Size closeButtonSize;
private bool isResizing = false;
private bool isMoving = false;
private bool isClosing = false;
private int captionHeight;
private int frameThickness;
private int statusHeight = 22;
private Point originalClick = new Point();
private Point resizeOffset = new Point();
public WindowSimulation()
: base()
{
this.Location = new Point(50, 50);
this.Size = new Size(350, 300);
this.BackColor = Color.Azure;
this.DoubleBuffered = true;
this.MinimumSize = new Size(300, 200);
this.Font = SystemFonts.CaptionFont;
this.Text = "Simulated Window";
// Insert the VisualStyleElement objects into the Dictionary.
windowElements.Add("windowCaption",
VisualStyleElement.Window.Caption.Active);
windowElements.Add("windowBottom",
VisualStyleElement.Window.FrameBottom.Active);
windowElements.Add("windowLeft",
VisualStyleElement.Window.FrameLeft.Active);
windowElements.Add("windowRight",
VisualStyleElement.Window.FrameRight.Active);
windowElements.Add("windowClose",
VisualStyleElement.Window.CloseButton.Normal);
windowElements.Add("statusBar",
VisualStyleElement.Status.Bar.Normal);
windowElements.Add("statusGripper",
VisualStyleElement.Status.Gripper.Normal);
// Get the sizes and location offsets for the window parts
// as specified by the visual style, and then use this
// information to calcualate the rectangles for each part.
GetPartDetails();
CalculateRectangles();
this.MouseDown +=
new MouseEventHandler(ImitationWindow_MouseDown);
this.MouseUp +=
new MouseEventHandler(ImitationWindow_MouseUp);
this.MouseMove +=
new MouseEventHandler(ImitationWindow_MouseMove);
}
// Get the sizes and offsets for the window parts as specified
// by the visual style.
private void GetPartDetails()
{
// Do nothing further if visual styles are not enabled.
if (!Application.RenderWithVisualStyles)
{
return;
}
using (Graphics g = this.CreateGraphics())
{
// Get the size and offset of the close button.
if (SetRenderer(windowElements["windowClose"]))
{
closeButtonSize =
renderer.GetPartSize(g, ThemeSizeType.True);
closeButtonOffset =
renderer.GetPoint(PointProperty.Offset);
}
// Get the height of the window caption.
if (SetRenderer(windowElements["windowCaption"]))
{
captionHeight = renderer.GetPartSize(g,
ThemeSizeType.True).Height;
}
// Get the thickness of the left, bottom,
// and right window frame.
if (SetRenderer(windowElements["windowLeft"]))
{
frameThickness = renderer.GetPartSize(g,
ThemeSizeType.True).Width;
}
// Get the size of the resizing gripper.
if (SetRenderer(windowElements["statusGripper"]))
{
gripperSize = renderer.GetPartSize(g,
ThemeSizeType.True);
}
}
}
// Use the part metrics to determine the current size
// of the rectangles for all of the window parts.
private void CalculateRectangles()
{
int heightMinusFrame =
ClientRectangle.Height - frameThickness;
// Calculate the window frame rectangles and add them
// to the Dictionary of rectangles.
elementRectangles["windowCaption"] =
new Rectangle(0, 0,
ClientRectangle.Width, captionHeight);
elementRectangles["windowBottom"] =
new Rectangle(0, heightMinusFrame,
ClientRectangle.Width, frameThickness);
elementRectangles["windowLeft"] =
new Rectangle(0, captionHeight, frameThickness,
heightMinusFrame - captionHeight);
elementRectangles["windowRight"] =
new Rectangle(ClientRectangle.Width - frameThickness,
captionHeight, frameThickness,
heightMinusFrame - captionHeight);
// Calculate the window button rectangle and add it
// to the Dictionary of rectangles.
elementRectangles["windowClose"] =
new Rectangle(ClientRectangle.Right +
closeButtonOffset.X - closeButtonSize.Width - frameThickness, closeButtonOffset.Y,
closeButtonSize.Width, closeButtonSize.Height);
// Calculate the status bar rectangles and add them
// to the Dictionary of rectangles.
elementRectangles["statusBar"] =
new Rectangle(frameThickness,
heightMinusFrame - statusHeight,
ClientRectangle.Width - (2 * frameThickness),
statusHeight);
elementRectangles["statusGripper"] =
new Rectangle(ClientRectangle.Right -
gripperSize.Width - frameThickness,
heightMinusFrame - gripperSize.Height,
gripperSize.Width, gripperSize.Height);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// Ensure that visual styles are supported.
if (!Application.RenderWithVisualStyles)
{
this.Text = "Visual styles are not enabled.";
TextRenderer.DrawText(e.Graphics, this.Text,
this.Font, this.Location, this.ForeColor);
return;
}
// Set the clip region to define the curved corners
// of the caption.
SetClipRegion();
// Draw each part of the window.
foreach (KeyValuePair<string, VisualStyleElement> entry
in windowElements)
{
if (SetRenderer(entry.Value))
{
renderer.DrawBackground(e.Graphics,
elementRectangles[entry.Key]);
}
}
// Draw the caption text.
TextRenderer.DrawText(e.Graphics, this.Text, this.Font,
elementRectangles["windowCaption"], Color.White,
TextFormatFlags.VerticalCenter |
TextFormatFlags.HorizontalCenter);
}
// Initiate dragging, resizing, or closing the imitation window.
void ImitationWindow_MouseDown(object sender, MouseEventArgs e)
{
// The user clicked the close button.
if (elementRectangles["windowClose"].Contains(e.Location))
{
windowElements["windowClose"] =
VisualStyleElement.Window.CloseButton.Pressed;
isClosing = true;
}
// The user clicked the status grip.
else if (elementRectangles["statusGripper"].
Contains(e.Location))
{
isResizing = true;
this.Cursor = Cursors.SizeNWSE;
resizeOffset.X = this.Right - this.Left - e.X;
resizeOffset.Y = this.Bottom - this.Top - e.Y;
}
// The user clicked the window caption.
else if (elementRectangles["windowCaption"].
Contains(e.Location))
{
isMoving = true;
originalClick.X = e.X;
originalClick.Y = e.Y;
}
Invalidate();
}
// Stop any current resizing or moving actions.
void ImitationWindow_MouseUp(object sender, MouseEventArgs e)
{
// Stop moving the location of the window rectangles.
if (isMoving)
{
isMoving = false;
}
// Change the cursor back to the default if the user
// stops resizing.
else if (isResizing)
{
isResizing = false;
}
// Close the application if the user clicks the
// close button.
else if (elementRectangles["windowClose"].
Contains(e.Location) && isClosing)
{
Application.Exit();
}
}
// Handle resizing or moving actions.
void ImitationWindow_MouseMove(object sender,
MouseEventArgs e)
{
// The left mouse button is down.
if ((MouseButtons.Left & e.Button) == MouseButtons.Left)
{
// Calculate the new control size if the user is
// dragging the resizing grip.
if (isResizing)
{
this.Width = e.X + resizeOffset.X;
this.Height = e.Y + resizeOffset.Y;
CalculateRectangles();
}
// Calculate the new location of the control if the
// user is dragging the window caption.
else if (isMoving)
{
int XChange = this.Location.X +
(e.X - originalClick.X);
int YChange = this.Location.Y +
(e.Y - originalClick.Y);
this.Location = new Point(XChange, YChange);
}
// Cancel the closing action if the user clicked
// and held down on the close button, and has dragged
// the pointer outside the button.
else if (!elementRectangles["windowClose"].
Contains(e.Location) && isClosing)
{
isClosing = false;
windowElements["windowClose"] =
VisualStyleElement.Window.CloseButton.Normal;
}
}
// The left mouse button is not down.
else
{
// Paint the close button hot if the cursor is on it.
Rectangle closeRectangle =
elementRectangles["windowClose"];
windowElements["windowClose"] =
closeRectangle.Contains(e.Location) ?
VisualStyleElement.Window.CloseButton.Hot :
VisualStyleElement.Window.CloseButton.Normal;
// Use a resizing cursor if the cursor is on the
// status grip.
Rectangle gripRectangle =
elementRectangles["statusGripper"];
this.Cursor = gripRectangle.Contains(e.Location) ?
Cursors.SizeNWSE : Cursors.Default;
}
Invalidate();
}
// Calculate and set the clipping region for the control
// so that the corners of the title bar are rounded.
private void SetClipRegion()
{
if (!Application.RenderWithVisualStyles)
{
return;
}
using (Graphics g = this.CreateGraphics())
{
// Get the current region for the window caption.
if (SetRenderer(windowElements["windowCaption"]))
{
Region clipRegion = renderer.GetBackgroundRegion(
g, elementRectangles["windowCaption"]);
// Get the client rectangle, but exclude the region
// of the window caption.
int height = (int)clipRegion.GetBounds(g).Height;
Rectangle nonCaptionRect = new Rectangle(
ClientRectangle.X,
ClientRectangle.Y + height,
ClientRectangle.Width,
ClientRectangle.Height - height);
// Add the rectangle to the caption region, and
// make this region the form's clipping region.
clipRegion.Union(nonCaptionRect);
this.Region = clipRegion;
}
}
}
// Set the VisualStyleRenderer to a new element.
private bool SetRenderer(VisualStyleElement element)
{
if (!VisualStyleRenderer.IsElementDefined(element))
{
return false;
}
if (renderer == null)
{
renderer = new VisualStyleRenderer(element);
}
else
{
renderer.SetParameters(element);
}
return true;
}
}
}
Imports System.Text
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Collections.Generic
Imports System.Windows.Forms
Imports System.Windows.Forms.VisualStyles
Namespace VisualStyleRendererSample
Class Form1
Inherits Form
Public Sub New()
With Me
.Size = New Size(800, 600)
.Location = New Point(20, 20)
.BackColor = Color.DarkGray
End With
Dim Window1 As New ImitationWindow()
Controls.Add(Window1)
End Sub
<STAThread()> _
Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New Form1())
End Sub
End Class
Public Class ImitationWindow
Inherits Control
Private windowElements As _
New Dictionary(Of String, VisualStyleElement)
Private elementRectangles As _
New Dictionary(Of String, Rectangle)
Private renderer As VisualStyleRenderer = Nothing
Private closeButtonOffset As Point
Private gripperSize As Size
Private closeButtonSize As Size
Private isResizing As Boolean = False
Private isMoving As Boolean = False
Private isClosing As Boolean = False
Private captionHeight As Integer
Private frameThickness As Integer
Private statusHeight As Integer = 22
Private originalClick As New Point()
Private resizeOffset As New Point()
Public Sub New()
With Me
.Location = New Point(50, 50)
.Size = New Size(350, 300)
.BackColor = Color.Azure
.DoubleBuffered = True
.MinimumSize = New Size(300, 200)
.Font = SystemFonts.CaptionFont
.Text = "Imitation Window"
End With
' Create a collection of VisualStyleElement objects.
With windowElements
.Add("windowCaption", _
VisualStyleElement.Window.Caption.Active)
.Add("windowBottom", _
VisualStyleElement.Window.FrameBottom.Active)
.Add("windowLeft", _
VisualStyleElement.Window.FrameLeft.Active)
.Add("windowRight", _
VisualStyleElement.Window.FrameRight.Active)
.Add("windowClose", _
VisualStyleElement.Window.CloseButton.Normal)
.Add("statusBar", _
VisualStyleElement.Status.Bar.Normal)
.Add("statusGripper", _
VisualStyleElement.Status.Gripper.Normal)
End With
' Get the sizes and location offsets for the window parts
' as specified by the visual style, and then use this
' information to calcualate the rectangles for each part.
GetPartDetails()
CalculateRectangles()
End Sub
' Get the sizes and offsets for the window parts as specified
' by the visual style.
Private Sub GetPartDetails()
' Do nothing further if visual styles are not enabled.
If Not Application.RenderWithVisualStyles Then
Return
End If
Using g As Graphics = Me.CreateGraphics()
' Get the size and offset of the close button.
If SetRenderer(windowElements("windowClose")) Then
closeButtonSize = _
renderer.GetPartSize(g, ThemeSizeType.True)
closeButtonOffset = _
renderer.GetPoint(PointProperty.Offset)
End If
' Get the height of the window caption.
If SetRenderer(windowElements("windowCaption")) Then
captionHeight = renderer.GetPartSize(g, _
ThemeSizeType.True).Height
End If
' Get the thickness of the left, bottom, and right
' window frame.
If SetRenderer(windowElements("windowLeft")) Then
frameThickness = renderer.GetPartSize(g, _
ThemeSizeType.True).Width
End If
' Get the size of the resizing gripper.
If SetRenderer(windowElements("statusGripper")) Then
gripperSize = renderer.GetPartSize(g, _
ThemeSizeType.True)
End If
End Using
End Sub
' Use the part metrics to determine the current size of the
' rectangles for all of the window parts.
Private Sub CalculateRectangles()
Dim heightMinusFrame As Integer = _
ClientRectangle.Height - frameThickness
' Calculate the window frame rectangles and add them
' to the Dictionary of rectangles.
elementRectangles("windowCaption") = _
New Rectangle(0, 0, ClientRectangle.Width, _
captionHeight)
elementRectangles("windowBottom") = _
New Rectangle(0, heightMinusFrame, _
ClientRectangle.Width, frameThickness)
elementRectangles("windowLeft") = _
New Rectangle(0, captionHeight, frameThickness, _
heightMinusFrame - captionHeight)
elementRectangles("windowRight") = _
New Rectangle(ClientRectangle.Width - frameThickness, _
captionHeight, frameThickness, _
heightMinusFrame - captionHeight)
' Calculate the window button rectangle and add it
' to the Dictionary of rectangles.
elementRectangles("windowClose") = _
New Rectangle(ClientRectangle.Right + _
closeButtonOffset.X - closeButtonSize.Width - frameThickness, closeButtonOffset.Y, _
closeButtonSize.Width, closeButtonSize.Height)
' Calculate the status bar rectangles and add them
' to the Dictionary of rectangles.
elementRectangles("statusBar") = _
New Rectangle(frameThickness, _
heightMinusFrame - statusHeight, _
ClientRectangle.Width - 2 * frameThickness, _
statusHeight)
elementRectangles("statusGripper") = _
New Rectangle(ClientRectangle.Right - _
gripperSize.Width - frameThickness, _
heightMinusFrame - gripperSize.Height, _
gripperSize.Width, gripperSize.Height)
End Sub
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
' Ensure that visual styles are supported.
If Not Application.RenderWithVisualStyles Then
Me.Text = "Visual styles are not enabled."
TextRenderer.DrawText(e.Graphics, Me.Text, Me.Font, _
Me.Location, Me.ForeColor)
Return
End If
' Set the clip region to define the curved corners of
' the caption.
SetClipRegion()
' Draw each part of the window.
Dim entry As KeyValuePair(Of String, VisualStyleElement)
For Each entry In windowElements
If SetRenderer(entry.Value) Then
renderer.DrawBackground(e.Graphics, _
elementRectangles(entry.Key))
End If
Next entry
' Draw the caption text.
TextRenderer.DrawText(e.Graphics, Me.Text, Me.Font, _
elementRectangles("windowCaption"), Color.White, _
TextFormatFlags.VerticalCenter Or _
TextFormatFlags.HorizontalCenter)
End Sub
' Initiate dragging, resizing, or closing the imitation window.
Private Sub ImitationWindow_MouseDown(ByVal sender As Object, _
ByVal e As MouseEventArgs) Handles Me.MouseDown
' The user clicked the close button.
If elementRectangles("windowClose"). _
Contains(e.Location) Then
windowElements("windowClose") = _
VisualStyleElement.Window.CloseButton.Pressed
isClosing = True
' The user clicked the status grip.
ElseIf elementRectangles("statusGripper"). _
Contains(e.Location) Then
isResizing = True
Me.Cursor = Cursors.SizeNWSE
resizeOffset.X = Me.Right - Me.Left - e.X
resizeOffset.Y = Me.Bottom - Me.Top - e.Y
' The user clicked the window caption.
ElseIf elementRectangles("windowCaption"). _
Contains(e.Location) Then
isMoving = True
originalClick.X = e.X
originalClick.Y = e.Y
End If
Invalidate()
End Sub
' Stop any current resizing or moving actions.
Private Sub ImitationWindow_MouseUp(ByVal sender As Object, _
ByVal e As MouseEventArgs) Handles Me.MouseUp
' Stop moving the location of the window rectangles.
If isMoving Then
isMoving = False
' Change the cursor back to the default if the
' user stops resizing.
ElseIf isResizing Then
isResizing = False
' Close the application if the user clicks the
' close button.
ElseIf elementRectangles("windowClose"). _
Contains(e.Location) And isClosing Then
Application.Exit()
End If
End Sub
' Handle resizing or moving actions.
Private Sub ImitationWindow_MouseMove(ByVal sender As Object, _
ByVal e As MouseEventArgs) Handles Me.MouseMove
' The left mouse button is down.
If (MouseButtons.Left And e.Button) = _
MouseButtons.Left Then
' Calculate the new control size if the user is
' dragging the resizing grip.
If isResizing Then
Me.Width = e.X + resizeOffset.X
Me.Height = e.Y + resizeOffset.Y
CalculateRectangles()
' Calculate the new location of the control if
' the user is dragging the window caption.
ElseIf isMoving Then
Dim XChange As Integer = Me.Location.X + _
(e.X - originalClick.X)
Dim YChange As Integer = Me.Location.Y + _
(e.Y - originalClick.Y)
Me.Location = New Point(XChange, YChange)
' Cancel the closing action if the user clicked and
' held down on the close button, and has dragged the
' pointer outside the button.
ElseIf Not elementRectangles("windowClose"). _
Contains(e.Location) And isClosing Then
isClosing = False
windowElements("windowClose") = _
VisualStyleElement.Window.CloseButton.Normal
End If
' The left mouse button is not down.
Else
' Paint the close button hot if the cursor is on it.
If elementRectangles("windowClose"). _
Contains(e.Location) Then
windowElements("windowClose") = _
VisualStyleElement.Window.CloseButton.Hot
Else
windowElements("windowClose") = _
VisualStyleElement.Window.CloseButton.Normal
End If
' Use a resizing cursor if the cursor is on the
' status grip.
If elementRectangles("statusGripper"). _
Contains(e.Location) Then
Me.Cursor = Cursors.SizeNWSE
Else
Me.Cursor = Cursors.Default
End If
End If
Invalidate()
End Sub
' Calculate and set the clipping region for the control
' so that the corners of the title bar are rounded.
Private Sub SetClipRegion()
If Not Application.RenderWithVisualStyles Then
Return
End If
Using g As Graphics = Me.CreateGraphics()
' Get the current region for the window caption.
If SetRenderer(windowElements("windowCaption")) Then
Dim clipRegion As Region = _
renderer.GetBackgroundRegion(g, _
elementRectangles("windowCaption"))
' Get the client rectangle, but exclude the
' region of the window caption.
Dim height As Integer = _
CInt(clipRegion.GetBounds(g).Height)
Dim nonCaptionRect As _
New Rectangle(ClientRectangle.X, _
ClientRectangle.Y + height, _
ClientRectangle.Width, _
ClientRectangle.Height - height)
' Add the rectangle to the caption region, and
' make this region the form's clipping region.
clipRegion.Union(nonCaptionRect)
Me.Region = clipRegion
End If
End Using
End Sub
' Set the VisualStyleRenderer to a new element.
Private Function SetRenderer(ByVal element As _
VisualStyleElement) As Boolean
If Not VisualStyleRenderer.IsElementDefined(element) Then
Return False
End If
If renderer Is Nothing Then
renderer = New VisualStyleRenderer(element)
Else
renderer.SetParameters(element)
End If
Return True
End Function
End Class
End Namespace
Kommentarer
Namnområdet System.Windows.Forms.VisualStyles exponerar VisualStyleElement objekt som representerar alla kontroller och användargränssnittselement som stöds av visuella format. Om du vill rita eller hämta information om ett visst element måste du ange ett VisualStyleRenderer till det element som du är intresserad av. A VisualStyleRenderer anges automatiskt till en angiven VisualStyleElement i VisualStyleRenderer konstruktorn, men du kan också ange ett befintligt VisualStyleRenderer till ett annat element genom att anropa SetParameters metoden.
Om du vill rita ett element använder du DrawBackground -metoden. Klassen VisualStyleRenderer innehåller även metoder, till exempel och GetColor, som GetEnumValue ger information om hur ett element definieras av det aktuella visuella formatet.
Konstruktorn VisualStyleRenderer och många av VisualStyleRenderer metoderna utlöser undantag om inte visuella format är aktiverade i operativsystemet och visuella format tillämpas på klientområdet i programfönstren. Om du vill söka efter dessa villkor använder du staticIsSupported egenskapen .
Klassen VisualStyleRenderer omsluter funktionerna i API:et för visuella format (UxTheme) från Windows Shell-delen av Windows Platform SDK.
Konstruktorer
| Name | Description |
|---|---|
| VisualStyleRenderer(String, Int32, Int32) |
Initierar en ny instans av klassen med hjälp av VisualStyleRenderer de angivna klass-, del- och tillståndsvärdena. |
| VisualStyleRenderer(VisualStyleElement) |
Initierar en ny instans av klassen med hjälp av VisualStyleRenderer den angivna VisualStyleElement. |
Egenskaper
| Name | Description |
|---|---|
| Class |
Hämtar klassnamnet för det aktuella visualiseringsformatelementet. |
| Handle |
Hämtar en unik identifierare för den aktuella klassen med visuella formatelement. |
| IsSupported |
Hämtar ett värde som anger om operativsystemet använder visuella format för att rita kontroller. |
| LastHResult |
Hämtar den sista felkoden som returneras av api-metoderna för interna visuella format (UxTheme) som kapslas in av VisualStyleRenderer klassen. |
| Part |
Hämtar den del av det aktuella visualiseringsformatelementet. |
| State |
Hämtar tillståndet för det aktuella visualiseringsformatelementet. |
Metoder
| Name | Description |
|---|---|
| DrawBackground(IDeviceContext, Rectangle, Rectangle) |
Ritar bakgrundsbilden av det aktuella visualiseringsformatelementet inom den angivna rektangeln för avgränsning och klipps till den angivna urklippsrektangeln. |
| DrawBackground(IDeviceContext, Rectangle) |
Ritar bakgrundsbilden av det aktuella visuella formatelementet inom den angivna rektangeln för avgränsning. |
| DrawEdge(IDeviceContext, Rectangle, Edges, EdgeStyle, EdgeEffects) |
Ritar en eller flera kanter av den angivna avgränsningsrektangeln. |
| DrawImage(Graphics, Rectangle, Image) |
Ritar den angivna bilden inom de angivna gränserna. |
| DrawImage(Graphics, Rectangle, ImageList, Int32) |
Ritar bilden från den angivna ImageList inom de angivna gränserna. |
| DrawParentBackground(IDeviceContext, Rectangle, Control) |
Ritar bakgrunden till en kontrolls överordnade i det angivna området. |
| DrawText(IDeviceContext, Rectangle, String, Boolean, TextFormatFlags) |
Ritar text i den angivna avgränsningsrektangeln med alternativet att visa inaktiverad text och använda annan textformatering. |
| DrawText(IDeviceContext, Rectangle, String, Boolean) |
Ritar text inom angivna gränser med alternativet att visa inaktiverad text. |
| DrawText(IDeviceContext, Rectangle, String) |
Ritar text inom angivna gränser med standardformatering. |
| Equals(Object) |
Avgör om det angivna objektet är lika med det aktuella objektet. (Ärvd från Object) |
| GetBackgroundContentRectangle(IDeviceContext, Rectangle) |
Returnerar innehållsområdet för bakgrunden för det aktuella visuella formatelementet. |
| GetBackgroundExtent(IDeviceContext, Rectangle) |
Returnerar hela bakgrundsområdet för det aktuella visualiseringsformatelementet. |
| GetBackgroundRegion(IDeviceContext, Rectangle) |
Returnerar regionen för bakgrunden för det aktuella visualiseringsformatelementet. |
| GetBoolean(BooleanProperty) |
Returnerar värdet för den angivna booleska egenskapen för det aktuella visualiseringsformatelementet. |
| GetColor(ColorProperty) |
Returnerar värdet för den angivna färgegenskapen för det aktuella visuella formatelementet. |
| GetEnumValue(EnumProperty) |
Returnerar värdet för den angivna egenskapen för den uppräknade typen för det aktuella visuella formatelementet. |
| GetFilename(FilenameProperty) |
Returnerar värdet för den angivna filnamnsegenskapen för det aktuella visuella formatelementet. |
| GetFont(IDeviceContext, FontProperty) |
Returnerar värdet för den angivna teckensnittsegenskapen för det aktuella visuella formatelementet. |
| GetHashCode() |
Fungerar som standard-hash-funktion. (Ärvd från Object) |
| GetInteger(IntegerProperty) |
Returnerar värdet för den angivna heltalsegenskapen för det aktuella visualiseringsformatelementet. |
| GetMargins(IDeviceContext, MarginProperty) |
Returnerar värdet för den angivna egenskapen marginaler för det aktuella visuella formatelementet. |
| GetPartSize(IDeviceContext, Rectangle, ThemeSizeType) |
Returnerar värdet för den angivna storleksegenskapen för den aktuella visuella formatdelen med hjälp av de angivna ritningsgränser. |
| GetPartSize(IDeviceContext, ThemeSizeType) |
Returnerar värdet för den angivna storleksegenskapen för den aktuella visualiseringsformatdelen. |
| GetPoint(PointProperty) |
Returnerar värdet för den angivna punktegenskapen för det aktuella visualiseringsformatelementet. |
| GetString(StringProperty) |
Returnerar värdet för den angivna strängegenskapen för det aktuella visuella formatelementet. |
| GetTextExtent(IDeviceContext, Rectangle, String, TextFormatFlags) |
Returnerar storleken och platsen för den angivna strängen när den ritas med teckensnittet för det aktuella visuella formatelementet inom den angivna inledande rektangeln för avgränsning. |
| GetTextExtent(IDeviceContext, String, TextFormatFlags) |
Returnerar storleken och platsen för den angivna strängen när den ritas med teckensnittet för det aktuella visuella formatelementet. |
| GetTextMetrics(IDeviceContext) |
Hämtar information om teckensnittet som anges av det aktuella visuella formatelementet. |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| HitTestBackground(Graphics, Rectangle, Region, Point, HitTestOptions) |
Returnerar en träfftestkod som anger om punkten finns i bakgrunden för det aktuella visualiseringsformatelementet och inom de angivna gränserna. |
| HitTestBackground(IDeviceContext, Rectangle, IntPtr, Point, HitTestOptions) |
Returnerar en träfftestkod som anger om punkten finns i bakgrunden för det aktuella visuella formatelementet och inom den angivna regionen. |
| HitTestBackground(IDeviceContext, Rectangle, Point, HitTestOptions) |
Returnerar en träfftestkod som anger om en punkt finns i bakgrunden för det aktuella visualiseringsformatelementet. |
| IsBackgroundPartiallyTransparent() |
Anger om bakgrunden för det aktuella visuella formatelementet har några halvtransparent eller alfablandade bitar. |
| IsElementDefined(VisualStyleElement) |
Avgör om det angivna visualiseringsformatelementet definieras av det aktuella visuella formatet. |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| SetParameters(String, Int32, Int32) |
Anger detta VisualStyleRenderer till det visuella formatelementet som representeras av de angivna klass-, del- och tillståndsvärdena. |
| SetParameters(VisualStyleElement) |
Anger detta VisualStyleRenderer till det visuella formatelementet som representeras av den angivna VisualStyleElement. |
| ToString() |
Returnerar en sträng som representerar det aktuella objektet. (Ärvd från Object) |