自定义Radiobutton控件(Winforms)

时间:2017-05-20 08:24:55

标签: vb.net winforms checkbox radio-button

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

我已经尝试继承控件并使用自定义Paint方法,但我得到的是like this. 我的代码就是这个

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个radiobuttons,我无法检查它们(当然)。我怎么能达到这个效果?我知道我可以手动编程'如果选中复选框1,则取消选中复选框2和3'但那是不可行的。在usercontrol级别上做得更好,所以使用它的主要形式会更加整洁和漂亮:D

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

2 个答案:

答案 0 :(得分:0)

您可以通过检查Parent.Controls集合来获得此效果。 您必须检查Parent.Controls集合中是否有其他相同类型的控件,然后处理您需要的行为。

答案 1 :(得分:0)

无需从头开始,只有你一直缺少的东西:

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