如何制作一款圆形的vb按钮?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何制作一款圆形的vb按钮?相关的知识,希望对你有一定的参考价值。
想把这幅图片放在我的vb软件中,但四周的白色就是去不了,有什么好方法吗?
你所见到的所有圆形按钮实际上都是方形的按钮,只是在方形的按钮里放上张包含圆形的图片,除了圆形外的边角跟背景色融为一体而已。
如下图,你在左边界面上看到的所有圆形按钮实际上都是右边设计界面上的那个粉红色方块。
参考技术A 1 用图形
相关信息
电脑开机后,显示器无信号怎么回事? 电脑......
笔记本电脑开机黑屏怎么办 开机过了win......
电脑开不了机 一直黑屏 早上的时候还好,......
电脑的桌面截图热键是哪个啊? 电脑的桌面......
电脑开不了机 怎么重装系统呀??? 是这......
电脑开机显示器无信号 电脑开机显示器无信......
电脑开不了机总是自动重启怎么办? 系统也......
电脑开机黑屏怎么办? 我换了硬盘内存显卡......
电脑开机显示器无信号 前面都还好的,到w......
电脑经常开不了机是怎么回事? 电脑经常开......
就是这样啊
常在电脑前
电脑族应该
玩游戏死机
电脑有辐射
控件(如img,pic),自己在事件中处理,一般采用三幅图,分别表示Normal,Mouse In以及Mouse Down;
2 用其它控件,如Sheriden_ActiveThreed_Plus3.0等,事件已帮你做好,只需加入图形即可,非常方便。
3 在一个Form中定义两个按钮,cmd1和command2,书写以下代码:
Private Sub cmd1_Click()
MsgBox "ok"
End Sub
Private Sub Command2_Click()
Dim crgn As Long
Dim ret As Long
crgn = CreateEllipticRgn(5, 5, cmd1.Width - 5, cmd1.Height - 5)
ret = SetWindowRgn(cmd1.hwnd, crgn, True)
cmd1.Caption = "ok"
cmd1.Visible = True
End Sub
API函数:
Public Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Public Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long 参考技术B 用PS把白边抠掉,然后存为PNG。
注意:四周的白色不是透明的,用PS把白色去掉就行了 参考技术C 用三个picture来做,常规图片,按下图片,及抬起图片。比较好看
或者用控件
使用控件Active Multimedia Button v3.0, 可通过搜索引擎查找到此文件;注册机:ftp://61.128.193.30/jiajie/199904/pc_ammb3.zip 参考技术D 也可以用API剪切空白区域呀
Visual Basic 圆形进度条
【中文标题】Visual Basic 圆形进度条【英文标题】:Visual basic circular progress bar 【发布时间】:2015-01-11 18:11:15 【问题描述】:我正在尝试制作一个具有良好 UI 的软件,但我在 VB 方面并不专业...... 如何制作圆形进度条?
举例
【问题讨论】:
见codeproject.com/Articles/30625/Circular-Progress-Indicator和codeproject.com/Articles/14855/SQL-Server-Circular-Progress-Bar 这是用 c++ 构建的,我想用 Visual Basic 构建它。 它们在 C++ 中不是;它们可以很容易地转换为 VB。关键是它们(和其他)已经构建并可以使用;您不必重新创建***。 好的,我会尝试将其转换为 vb 并了解它是如何工作的。 【参考方案1】:使用 GDI+ 自己绘制如何。
您可以稍后将其转换为您自己的用户控件,但这将帮助您入门。它应该是不言自明的:
Private Sub Form2_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
DrawProgress(e.Graphics, New Rectangle(5, 5, 60, 60), 40)
DrawProgress(e.Graphics, New Rectangle(80, 5, 60, 60), 80)
DrawProgress(e.Graphics, New Rectangle(155, 5, 60, 60), 57)
End Sub
Private Sub DrawProgress(g As Graphics, rect As Rectangle, percentage As Single)
'work out the angles for each arc
Dim progressAngle = CSng(360 / 100 * percentage)
Dim remainderAngle = 360 - progressAngle
'create pens to use for the arcs
Using progressPen As New Pen(Color.LightSeaGreen, 2), remainderPen As New Pen(Color.LightGray, 2)
'set the smoothing to high quality for better output
g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
'draw the blue and white arcs
g.DrawArc(progressPen, rect, -90, progressAngle)
g.DrawArc(remainderPen, rect, progressAngle - 90, remainderAngle)
End Using
'draw the text in the centre by working out how big it is and adjusting the co-ordinates accordingly
Using fnt As New Font(Me.Font.FontFamily, 14)
Dim text As String = percentage.ToString + "%"
Dim textSize = g.MeasureString(text, fnt)
Dim textPoint As New Point(CInt(rect.Left + (rect.Width / 2) - (textSize.Width / 2)), CInt(rect.Top + (rect.Height / 2) - (textSize.Height / 2)))
'now we have all the values draw the text
g.DrawString(text, fnt, Brushes.Black, textPoint)
End Using
End Sub
输出
【讨论】:
谢谢...效果很好,但是如果您知道如何使它高于“高质量”? 哥们,你是高手!【参考方案2】:@faresabb2 在代码最开始的 Form2.Paint 子中,放
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality
【讨论】:
【参考方案3】:这是一个如何在需要时更新进度圆形条的示例,不会因刷新而闪烁。
基于马特的代码
只需将代码复制到您的表单 Paint Event 中,适当地更改矩形大小和位置以在您的表单中承载圆。 percent 是一个全局变量,当它发生变化时,可以调用 me.refresh() 方法来触发重绘!
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
Dim g As Graphics = e.Graphics
Dim rect As New Rectangle(70, 45, 90, 90)
Dim curvatura_progress = CSng(360 / 100 * percent)
Dim curvatura_rimanente = 360 - curvatura_progress
Using tratto_progresso As New Pen(Color.Lime, 4), tratto_rimanente As New Pen(Color.White, 4)
g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
g.DrawArc(tratto_progresso, rect, -90, curvatura_progress)
g.DrawArc(tratto_rimanente, rect, curvatura_progress - 90, curvatura_rimanente)
End Using
Using fnt As New Font(Me.Font.FontFamily, 14)
Dim text As String = percent.ToString + "%"
Dim textSize = g.MeasureString(text, fnt)
Dim textPoint As New Point(CInt(rect.Left + (rect.Width / 2) - (textSize.Width / 2)), CInt(rect.Top + (rect.Height / 2) - (textSize.Height / 2)))
g.DrawString(text, fnt, Brushes.Black, textPoint)
End Using
End Sub
【讨论】:
只需将 Dim percent 添加为 Single 可能会被 BR1COP 遗漏【参考方案4】:这里是用户控件
Imports System.ComponentModel
Imports System.Drawing.Drawing2D
Public Class CircularProgressBar
Inherits UserControl
Public Enum _ProgressShape
Round
Flat
End Enum
Public Enum _TextMode
None
Value
Percentage
[Custom]
End Enum
Private _Value As Integer = 0
Private _Maximum As Integer = 100
Private _LineWitdh As Integer = 5
Private _BarWidth As Single = 11
Private _ProgressColor1 As Color = Color.Orange
Private _ProgressColor2 As Color = Color.Orange
Private _LineColor As Color = Color.LightGray
Private _GradientMode As LinearGradientMode = LinearGradientMode.ForwardDiagonal
Private ProgressShapeVal As _ProgressShape
Private ProgressTextMode As _TextMode
Private _ShadowOffset As Single = 0
Public Sub New()
MyBase.SuspendLayout()
'SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.ResizeRedraw Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.SupportsTransparentBackColor Or ControlStyles.Opaque, True)
SetStyle(ControlStyles.SupportsTransparentBackColor, True)
SetStyle(ControlStyles.Opaque, True)
BackColor = SystemColors.Control
ForeColor = Color.DimGray
Size = New Size(75, 75)
Font = New Font("Segoe UI", 15)
MinimumSize = New Size(58, 58)
DoubleBuffered = True
LineColor = Color.LightGray
Value = 50
ProgressShape = _ProgressShape.Flat
TextMode = _TextMode.Percentage
MyBase.ResumeLayout(False)
MyBase.PerformLayout()
End Sub
<Description("Integer Value that determines the position of the Progress Bar."), Category("Behavior")>
Public Property Value() As Long
Get
Return _Value
End Get
Set
If Value > _Maximum Then
Value = _Maximum
End If
_Value = Value
Invalidate()
End Set
End Property
<Description("Gets or Sets the Maximum Value of the Progress bar."), Category("Behavior")>
Public Property Maximum() As Long
Get
Return _Maximum
End Get
Set
If Value < 1 Then
Value = 1
End If
_Maximum = Value
Invalidate()
End Set
End Property
<Description("Initial Color of Progress Bar"), Category("Appearance")>
Public Property BarColor1() As Color
Get
Return _ProgressColor1
End Get
Set
_ProgressColor1 = Value
Invalidate()
End Set
End Property
<Description("Final Color of Progress Bar"), Category("Appearance")> Public Property BarColor2() As Color
Get
Return _ProgressColor2
End Get
Set
_ProgressColor2 = Value
Invalidate()
End Set
End Property
<Description("Progress Bar Width"), Category("Appearance")>
Public Property BarWidth() As Single
Get
Return _BarWidth
End Get
Set
_BarWidth = Value
Invalidate()
End Set
End Property
<Description("Modo del Gradiente de Color"), Category("Appearance")>
Public Property GradientMode() As LinearGradientMode
Get
Return _GradientMode
End Get
Set
_GradientMode = Value
Invalidate()
End Set
End Property
<Description("Color de la Linea Intermedia"), Category("Appearance")>
Public Property LineColor() As Color
Get
Return _LineColor
End Get
Set
_LineColor = Value
Invalidate()
End Set
End Property
<Description("Width of Intermediate Line"), Category("Appearance")>
Public Property LineWidth() As Integer
Get
Return _LineWitdh
End Get
Set
_LineWitdh = Value
Invalidate()
End Set
End Property
<Description("Get or Set the Shape of the progress bar terminals."), Category("Appearance")>
Public Property ProgressShape() As _ProgressShape
Get
Return ProgressShapeVal
End Get
Set
ProgressShapeVal = Value
Invalidate()
End Set
End Property
<Description("Modo del Gradiente de Color"), Category("Appearance")>
Public Property ShadowOffset() As Integer
Get
Return _ShadowOffset
End Get
Set
If Value > 2 Then
Value = 2
End If
_ShadowOffset = Value
Invalidate()
End Set
End Property
<Description("Get or Set the Mode as the Text is displayed inside the Progress bar."), Category("Behavior")>
Public Property TextMode() As _TextMode
Get
Return ProgressTextMode
End Get
Set
ProgressTextMode = Value
Invalidate()
End Set
End Property
Protected Overloads Overrides Sub OnResize(e As EventArgs)
MyBase.OnResize(e)
SetStandardSize()
End Sub
Protected Overloads Overrides Sub OnSizeChanged(e As EventArgs)
MyBase.OnSizeChanged(e)
SetStandardSize()
End Sub
Protected Overloads Overrides Sub OnPaintBackground(p As PaintEventArgs)
MyBase.OnPaintBackground(p)
End Sub
Private Sub SetStandardSize()
Dim _Size As Integer = Math.Max(Width, Height)
Size = New Size(_Size, _Size)
End Sub
Public Sub Increment(Val As Integer)
_Value += Val
Invalidate()
End Sub
Public Sub Decrement(Val As Integer)
_Value -= Val
Invalidate()
End Sub
'Protected Overloads Overrides Sub OnPaint(e As PaintEventArgs)
Protected Overrides Sub OnPaint(e As PaintEventArgs)
Using bitmap As New Bitmap(Width, Height)
Using graphics As Graphics = Graphics.FromImage(bitmap)
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality
graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias
graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
PaintTransparentBackground(Me, e)
Dim rect As Rectangle = New Rectangle(10, 10, MyBase.Width - 20, MyBase.Width - 20)
Using mBackColor As Brush = New SolidBrush(BackColor)
graphics.FillEllipse(mBackColor, rect)
End Using
Using pen2 As New Pen(LineColor, LineWidth)
graphics.DrawEllipse(pen2, rect)
End Using
Using brush As New LinearGradientBrush(ClientRectangle, _ProgressColor1, _ProgressColor2, GradientMode)
Using pen As New Pen(brush, BarWidth)
Select Case ProgressShapeVal
Case _ProgressShape.Round
pen.StartCap = LineCap.Round
pen.EndCap = LineCap.Round
Exit Select
Case _ProgressShape.Flat
pen.StartCap = LineCap.Flat
pen.EndCap = LineCap.Flat
Exit Select
End Select
graphics.DrawArc(pen, rect, -90, CType((360 / _Maximum) * _Value, Integer))
End Using
End Using
Select Case TextMode
Case _TextMode.None
Text = String.Empty
Exit Select
Case _TextMode.Value
Text = _Value.ToString()
Exit Select
Case _TextMode.Percentage
Text = Convert.ToString((100 / _Maximum) * _Value) & "%"
Exit Select
Case _TextMode.Custom
Text = Text
Exit Select
Case Else
Exit Select
End Select
If Text IsNot String.Empty Then
Dim MS As SizeF = graphics.MeasureString(Text, Font)
Dim shadowBrush As New SolidBrush(Color.FromArgb(100, ForeColor))
If ShadowOffset > 0 Then graphics.DrawString(Text, Font, shadowBrush, (Width / 2 - MS.Width / 2) + ShadowOffset, (Height / 2 - MS.Height / 2) + ShadowOffset)
graphics.DrawString(Text, Font, New SolidBrush(ForeColor), (Width / 2 - MS.Width / 2), (Height / 2 - MS.Height / 2))
End If
MyBase.OnPaint(e)
e.Graphics.DrawImage(bitmap, 0, 0)
graphics.Dispose()
End Using
End Using
End Sub
Private Shared Sub PaintTransparentBackground(c As Control, e As PaintEventArgs)
If c.Parent Is Nothing OrElse Not Application.RenderWithVisualStyles Then
Return
End If
ButtonRenderer.DrawParentBackground(e.Graphics, c.ClientRectangle, c)
End Sub
Private Sub FillCircle(g As Graphics, brush As Brush, centerX As Single, centerY As Single, radius As Single)
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias
Using gp As New System.Drawing.Drawing2D.GraphicsPath()
g.FillEllipse(brush, centerX - radius, centerY - radius, radius + radius, radius + radius)
End Using
End Sub
End Class
【讨论】:
以上是关于如何制作一款圆形的vb按钮?的主要内容,如果未能解决你的问题,请参考以下文章
如何制作一个包含在整个屏幕上拉伸的背景图像的颤动应用程序,带有返回句子的图像的圆形按钮?