C#开发软件这个按钮如何变成这样?写什么样式..

z102648455 2012-06-04 08:49:50
C#开发软件这个按钮如何变成这样?写什么样式..
是软件 不是网页
左边的变成右边的
...全文
245 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
好厉害的样子
wy811007 2012-06-05
  • 打赏
  • 举报
回复
晕哦 为了一个按钮不至于吧.
话说按钮的样子默认是根据系统来的吧
不通系统样式变了 按钮样子就跟着变 这个真没必要弄..
threenewbee 2012-06-04
  • 打赏
  • 举报
回复
注释掉program.cs的Main方法的
Application.EnableVisualStyles
caoqinghua 2012-06-04
  • 打赏
  • 举报
回复

Friend Sub RenderBackgroundInternal(ByVal g As Graphics, ByVal rect As Rectangle, ByVal baseColor As Color, ByVal borderColor As Color, ByVal innerBorderColor As Color, ByVal style As RoundStyle, _
ByVal roundWidth As Integer, ByVal basePosition As Single, ByVal drawBorder As Boolean, ByVal drawGlass__1 As Boolean, ByVal mode As LinearGradientMode)
If drawBorder Then
rect.Width -= 1
rect.Height -= 1
End If

Using brush As New LinearGradientBrush(rect, Color.Transparent, Color.Transparent, mode)
Dim colors As Color() = New Color(3) {}
colors(0) = GetColor(baseColor, 0, 35, 24, 9)
colors(1) = GetColor(baseColor, 0, 13, 8, 3)
colors(2) = baseColor
colors(3) = GetColor(baseColor, 0, 68, 69, 54)

Dim blend As New ColorBlend()
blend.Positions = New Single() {0.0F, basePosition, basePosition + 0.05F, 1.0F}
blend.Colors = colors
brush.InterpolationColors = blend
If style <> RoundStyle.None Then
Using path As GraphicsPath = GraphicsPathHelper.CreatePath(rect, roundWidth, style, False)
g.FillPath(brush, path)
End Using

If baseColor.A > 80 Then
Dim rectTop As Rectangle = rect

If mode = LinearGradientMode.Vertical Then
rectTop.Height = CInt(Math.Truncate(rectTop.Height * basePosition))
Else
rectTop.Width = CInt(Math.Truncate(rect.Width * basePosition))
End If
Using pathTop As GraphicsPath = GraphicsPathHelper.CreatePath(rectTop, roundWidth, RoundStyle.Top, False)
Using brushAlpha As New SolidBrush(Color.FromArgb(80, 255, 255, 255))
g.FillPath(brushAlpha, pathTop)
End Using
End Using
End If

If drawGlass__1 Then
Dim glassRect As RectangleF = rect
If mode = LinearGradientMode.Vertical Then
glassRect.Y = rect.Y + rect.Height * basePosition
glassRect.Height = (rect.Height - rect.Height * basePosition) * 2
Else
glassRect.X = rect.X + rect.Width * basePosition
glassRect.Width = (rect.Width - rect.Width * basePosition) * 2
End If
DrawGlass(g, glassRect, 170, 0)
End If

If drawBorder Then
Using path As GraphicsPath = GraphicsPathHelper.CreatePath(rect, roundWidth, style, False)
Using pen As New Pen(borderColor)
g.DrawPath(pen, path)
End Using
End Using

rect.Inflate(-1, -1)
Using path As GraphicsPath = GraphicsPathHelper.CreatePath(rect, roundWidth, style, False)
Using pen As New Pen(innerBorderColor)
g.DrawPath(pen, path)
End Using
End Using
End If
Else
g.FillRectangle(brush, rect)
If baseColor.A > 80 Then
Dim rectTop As Rectangle = rect
If mode = LinearGradientMode.Vertical Then
rectTop.Height = CInt(Math.Truncate(rectTop.Height * basePosition))
Else
rectTop.Width = CInt(Math.Truncate(rect.Width * basePosition))
End If
Using brushAlpha As New SolidBrush(Color.FromArgb(80, 255, 255, 255))
g.FillRectangle(brushAlpha, rectTop)
End Using
End If

If drawGlass__1 Then
Dim glassRect As RectangleF = rect
If mode = LinearGradientMode.Vertical Then
glassRect.Y = rect.Y + rect.Height * basePosition
glassRect.Height = (rect.Height - rect.Height * basePosition) * 2
Else
glassRect.X = rect.X + rect.Width * basePosition
glassRect.Width = (rect.Width - rect.Width * basePosition) * 2
End If
DrawGlass(g, glassRect, 200, 0)
End If

If drawBorder Then
Using pen As New Pen(borderColor)
g.DrawRectangle(pen, rect)
End Using

rect.Inflate(-1, -1)
Using pen As New Pen(innerBorderColor)
g.DrawRectangle(pen, rect)
End Using
End If
End If
End Using
End Sub

Private Sub DrawGlass(ByVal g As Graphics, ByVal glassRect As RectangleF, ByVal alphaCenter As Integer, ByVal alphaSurround As Integer)
DrawGlass(g, glassRect, Color.White, alphaCenter, alphaSurround)
End Sub

Private Sub DrawGlass(ByVal g As Graphics, ByVal glassRect As RectangleF, ByVal glassColor As Color, ByVal alphaCenter As Integer, ByVal alphaSurround As Integer)
Using path As New GraphicsPath()
path.AddEllipse(glassRect)
Using brush As New PathGradientBrush(path)
brush.CenterColor = Color.FromArgb(alphaCenter, glassColor)
brush.SurroundColors = New Color() {Color.FromArgb(alphaSurround, glassColor)}
brush.CenterPoint = New PointF(glassRect.X + glassRect.Width / 2, glassRect.Y + glassRect.Height / 2)
g.FillPath(brush, path)
End Using
End Using
End Sub

Private Function GetColor(ByVal colorBase As Color, ByVal a As Integer, ByVal r As Integer, ByVal g As Integer, ByVal b As Integer) As Color
Dim a0 As Integer = colorBase.A
Dim r0 As Integer = colorBase.R
Dim g0 As Integer = colorBase.G
Dim b0 As Integer = colorBase.B

If a + a0 > 255 Then
a = 255
Else
a = Math.Max(a + a0, 0)
End If
If r + r0 > 255 Then
r = 255
Else
r = Math.Max(r + r0, 0)
End If
If g + g0 > 255 Then
g = 255
Else
g = Math.Max(g + g0, 0)
End If
If b + b0 > 255 Then
b = 255
Else
b = Math.Max(b + b0, 0)
End If

Return Color.FromArgb(a, r, g, b)
End Function

Friend Shared Function GetTextFormatFlags(ByVal alignment As ContentAlignment, ByVal rightToleft As Boolean) As TextFormatFlags
Dim flags As TextFormatFlags = TextFormatFlags.WordBreak Or TextFormatFlags.SingleLine
If rightToleft Then
flags = flags Or TextFormatFlags.RightToLeft Or TextFormatFlags.Right
End If

Select Case alignment
Case ContentAlignment.BottomCenter
flags = flags Or TextFormatFlags.Bottom Or TextFormatFlags.HorizontalCenter
Exit Select
Case ContentAlignment.BottomLeft
flags = flags Or TextFormatFlags.Bottom Or TextFormatFlags.Left
Exit Select
Case ContentAlignment.BottomRight
flags = flags Or TextFormatFlags.Bottom Or TextFormatFlags.Right
Exit Select
Case ContentAlignment.MiddleCenter
flags = flags Or TextFormatFlags.HorizontalCenter Or TextFormatFlags.VerticalCenter
Exit Select
Case ContentAlignment.MiddleLeft
flags = flags Or TextFormatFlags.VerticalCenter Or TextFormatFlags.Left
Exit Select
Case ContentAlignment.MiddleRight
flags = flags Or TextFormatFlags.VerticalCenter Or TextFormatFlags.Right
Exit Select
Case ContentAlignment.TopCenter
flags = flags Or TextFormatFlags.Top Or TextFormatFlags.HorizontalCenter
Exit Select
Case ContentAlignment.TopLeft
flags = flags Or TextFormatFlags.Top Or TextFormatFlags.Left
Exit Select
Case ContentAlignment.TopRight
flags = flags Or TextFormatFlags.Top Or TextFormatFlags.Right
Exit Select
End Select
Return flags
End Function
End Class

caoqinghua 2012-06-04
  • 打赏
  • 举报
回复

Imports System.Collections.Generic
Imports System.Text
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.ComponentModel

Public Class buttonEx
Inherits Button
Private _baseColor As Color = Color.FromArgb(160, 199, 223)
Private _controlState As ControlState
Private _imageWidth As Integer = 18
Private _roundStyle As RoundStyle = RoundStyle.All
Private _radius As Integer = 8

Public Sub New()
MyBase.New()
SetStyle(ControlStyles.UserPaint Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.ResizeRedraw Or ControlStyles.SupportsTransparentBackColor, True)
End Sub

<DefaultValue(GetType(Color), "160, 199, 223")> _
Public Property BaseColor() As Color
Get
Return _baseColor
End Get
Set(ByVal value As Color)
_baseColor = value
MyBase.Invalidate()
End Set
End Property

<DefaultValue(18)> _
Public Property ImageWidth() As Integer
Get
Return _imageWidth
End Get
Set(ByVal value As Integer)
If Value <> _imageWidth Then

_imageWidth = If(Value < 12, 12, Value)
MyBase.Invalidate()
End If
End Set
End Property

<DefaultValue(GetType(RoundStyle), "1")> _
Public Property RoundStyle() As RoundStyle
Get
Return _roundStyle
End Get
Set(ByVal value As RoundStyle)
If _roundStyle <> Value Then
_roundStyle = Value
MyBase.Invalidate()
End If
End Set
End Property

<DefaultValue(8)> _
Public Property Radius() As Integer
Get
Return _radius
End Get
Set(ByVal value As Integer)
If _radius <> Value Then
_radius = If(Value < 4, 4, Value)
MyBase.Invalidate()
End If
End Set
End Property

Friend Property ControlState() As ControlState
Get
Return _controlState
End Get
Set(ByVal value As ControlState)
If _controlState <> Value Then
_controlState = Value
MyBase.Invalidate()
End If
End Set
End Property

Protected Overrides Sub OnMouseEnter(ByVal e As EventArgs)
MyBase.OnMouseEnter(e)
ControlState = ControlState.Hover
End Sub

Protected Overrides Sub OnMouseLeave(ByVal e As EventArgs)
MyBase.OnMouseLeave(e)
ControlState = ControlState.Normal
End Sub

Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
MyBase.OnMouseDown(e)
If e.Button = MouseButtons.Left AndAlso e.Clicks = 1 Then
ControlState = ControlState.Pressed
End If
End Sub

Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
MyBase.OnMouseUp(e)
If e.Button = MouseButtons.Left AndAlso e.Clicks = 1 Then
If ClientRectangle.Contains(e.Location) Then
ControlState = ControlState.Hover
Else
ControlState = ControlState.Normal
End If
End If
End Sub

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
MyBase.OnPaintBackground(e)

Dim g As Graphics = e.Graphics
Dim imageRect As Rectangle
Dim textRect As Rectangle

CalculateRect(imageRect, textRect)
g.SmoothingMode = SmoothingMode.AntiAlias

Dim baseColor As Color
Dim borderColor As Color
Dim innerBorderColor As Color = Color.FromArgb(200, 255, 255, 255)

If Enabled Then
Select Case ControlState
Case ControlState.Hover
baseColor = GetColor(_baseColor, 0, -13, -8, -3)
borderColor = _baseColor
Exit Select
Case ControlState.Pressed
baseColor = GetColor(_baseColor, 0, -35, -24, -9)
borderColor = _baseColor
Exit Select
Case Else
baseColor = _baseColor
borderColor = _baseColor
Exit Select
End Select
Else
'禁用背景和边框颜色
baseColor = Color.FromArgb(255, 255, 255)
borderColor = Color.FromArgb(56, 134, 207)
End If

RenderBackgroundInternal(g, ClientRectangle, baseColor, borderColor, innerBorderColor, RoundStyle, _
Radius, 0.35F, True, True, LinearGradientMode.Vertical)

If Image IsNot Nothing Then
g.InterpolationMode = InterpolationMode.HighQualityBilinear
g.DrawImage(Image, imageRect, 0, 0, Image.Width, Image.Height, _
GraphicsUnit.Pixel)
End If

TextRenderer.DrawText(g, Text, Font, textRect, ForeColor, GetTextFormatFlags(TextAlign, RightToLeft = RightToLeft.Yes))
End Sub

Private Sub CalculateRect(ByRef imageRect As Rectangle, ByRef textRect As Rectangle)
imageRect = Rectangle.Empty
textRect = Rectangle.Empty
If Image Is Nothing Then
textRect = New Rectangle(2, 0, Width - 4, Height)
Return
End If
Select Case TextImageRelation
Case TextImageRelation.Overlay
imageRect = New Rectangle(2, (Height - ImageWidth) \ 2, ImageWidth, ImageWidth)
textRect = New Rectangle(2, 0, Width - 4, Height)
Exit Select
Case TextImageRelation.ImageAboveText
imageRect = New Rectangle((Width - ImageWidth) \ 2, 2, ImageWidth, ImageWidth)
textRect = New Rectangle(2, imageRect.Bottom, Width, Height - imageRect.Bottom - 2)
Exit Select
Case TextImageRelation.ImageBeforeText
imageRect = New Rectangle(2, (Height - ImageWidth) \ 2, ImageWidth, ImageWidth)
textRect = New Rectangle(imageRect.Right + 2, 0, Width - imageRect.Right - 4, Height)
Exit Select
Case TextImageRelation.TextAboveImage
imageRect = New Rectangle((Width - ImageWidth) \ 2, Height - ImageWidth - 2, ImageWidth, ImageWidth)
textRect = New Rectangle(0, 2, Width, Height - imageRect.Y - 2)
Exit Select
Case TextImageRelation.TextBeforeImage
imageRect = New Rectangle(Width - ImageWidth - 2, (Height - ImageWidth) \ 2, ImageWidth, ImageWidth)
textRect = New Rectangle(2, 0, imageRect.X - 2, Height)
Exit Select
End Select

If RightToLeft = RightToLeft.Yes Then
imageRect.X = Width - imageRect.Right
textRect.X = Width - textRect.Right
End If
End Sub

caoqinghua 2012-06-04
  • 打赏
  • 举报
回复
重绘button

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧