我想为自己的项目制作一个自定义的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
也有同样的效果。
所以我想从头开始做这个控制。我的问题是:
对不起,如果我的英语不好:D
答案 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