自定义单选按钮控件(Winforms)

迪卡

我想为我自己的项目制作一个自定义的单选按钮控件。我希望这个控件上有自定义指示器(因为常规单选按钮指示器是一个点。它很无聊:D)并且指示器是一个字符串,因为我将使用字形字体。

我已经尝试继承控件并使用自定义 Paint 方法,但我得到的是这样的。我的代码是这样的

Public Class Component1
Inherits RadioButton
Private Icons As String = "ABC     XGTDJS"
Private Captions As String

Dim x As New Font("Segoe UI", 10)
Dim y As New SolidBrush(Color.Black)
Dim z As New Point(0, 0)

Private Sub Component1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
e.Graphics.DrawString(Icons, x, y, z)

End Sub
End Class

使用

Protected Overrides Sub OnPaint(e As PaintEventArgs)
    MyBase.OnPaint(e)
    e.Graphics.DrawString(Icons, x, y, z)
    SetStyle(ControlStyles.UserPaint, True)

End Sub

也有同样的效果。

所以我想从头开始做这个控制。我的问题是:

  • RadioButton 控件是否可以完全由用户绘制?
  • 我已经制作了一个自定义的 Checkbox 控件(它满足了上面的期望)。例如,如果我有 3 个复选框,我可以将它们全部选中。但是,如果我有 3 个单选按钮,则无法全部检查(当然)。我怎样才能达到这种效果?我知道我可以手动编程“如果选中复选框 1,未选中复选框 2 和 3”,但这不可行。最好在用户控件级别完成,因此使用它的主窗体会更整洁漂亮:D

对不起,如果我的英语不好:D

视觉文森特

无需从头开始,您只是缺少一些东西:

Paint事件由该OnPaint方法引发,因此您的第一个示例将始终绘制常规单选按钮。对此你无能为力。

但是,在您的第二个示例中,您明确告诉它绘制原始单选按钮:

Protected Overrides Sub OnPaint(e As PaintEventArgs)
    MyBase.OnPaint(e)
    ...
End Sub

通过调用,MyBase.OnPaint()您实际上是在调用该RadioButton.OnPaint()方法(因为您的控件是从它继承而来的,它的基数是RadioButton),这将导致绘制原始单选按钮。

删除那个电话,你应该很高兴。另外,不要SetStyle()每次绘制时都调用,您只需要在构造函数中调用它(但是现在您根本不需要调用它,因此只需将其删除)。

话虽如此,您的OnPaint方法应该如下所示:

Protected Overrides Sub OnPaint(e As PaintEventArgs)
    e.Graphics.DrawString(Icons, x, y, z)
End Sub

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章