VB.NET在另一个按钮上绘制按钮

时间:2014-07-22 15:56:49

标签: vb.net button

是否可以在另一个按钮的顶部画一个按钮(除了只有第二个按钮并相对于第一个按钮左移和顶部位置移动它)?我试图在主按钮的角落出现一个小的可选问号(按钮),如果点击它将采取各种操作。

否则我只想在按钮顶部绘制问号并获取鼠标OnClick的相对位置,然后在HasLink属性为true并且鼠标位于特定区域时执行操作。

这些也将动态创建。

Public Class clsButton

Inherits Button
Private Property HasLink As Boolean = False

Public Sub New(ByVal Image As Image, ByVal ShowLink As Boolean)

    Me.BackgroundImage = Image
    Me.BackgroundImageLayout = ImageLayout.Center
    Me.Height = 100
    Me.Width = 200
    If ShowLink Then DrawLink()

End Sub

Public Sub DrawLink()

    Dim bmpBitmap As New Bitmap(Me.Width, Me.Height)
    Dim graGraphic As Graphics = Graphics.FromImage(bmpBitmap)

    Dim i As New Bitmap("c:\temp\question_mark.png")
    graGraphic.DrawImage(i, (Me.Width - i.Width) - 5, 5)

    Me.Image = bmpBitmap

End Sub

Protected Overrides Sub OnClick(e As EventArgs)
    MyBase.OnClick(e)
    Debug.WriteLine("X: " & MousePosition.X & " Y: " & MousePosition.Y)
    Debug.WriteLine(Me.PointToClient(MousePosition))
End Sub

End Class

2 个答案:

答案 0 :(得分:1)

我认为将这一点放在首位是一个好主意并且很容易实现。这样的整个想法可能有争议,但我不认为它一定是坏事 以下是如何设置事件流的快速示例。

Public Class SpecialButton
    Inherits Button

    Private flagIsHovering As Boolean = False

    Private ReadOnly Property r As Rectangle
        Get
            Return New Rectangle(Me.Width - 20, 5, 15, 15)
        End Get
    End Property

    Public ReadOnly Property clickInSpecialArea(p As Point) As Boolean
        Get
            Return (Me.r.Contains(p))
        End Get
    End Property

    Private iconBG_normal As Color = Color.White
    Private iconBG_hover As Color = Color.DarkOrange

    Protected Overrides Sub OnPaint(pevent As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(pevent)

        With pevent.Graphics
            .FillRectangle(New SolidBrush(If(Me.flagIsHovering, iconBG_hover, iconBG_normal)), r)
            .DrawRectangle(Pens.Blue, r)
            .DrawString("?", New Font("Verdana", 8), Brushes.Blue, r.Location)
        End With
    End Sub

    Protected Overrides Sub OnMouseMove(mevent As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseMove(mevent)

        Dim oldState As Boolean = Me.flagIsHovering
        Me.flagIsHovering = (r.Contains(mevent.Location))
        If oldState <> Me.flagIsHovering Then Me.Invalidate()
    End Sub

    Protected Overrides Sub OnMouseLeave(e As System.EventArgs)
        MyBase.OnMouseLeave(e)
        If Me.flagIsHovering Then
            Me.flagIsHovering = False
            Me.Invalidate()
        End If
    End Sub

End Class

表单测试代码:

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim ct As New SpecialButton
        ct.Text = "Text"
        ct.Location = New Point(200, 20)
        ct.Size = New Size(100, 30)
        Me.Controls.Add(ct)

        AddHandler ct.MouseClick, Sub(sender_ As Object, e_ As MouseEventArgs)
                                      MessageBox.Show(
                                          "Special click: " &
                                          DirectCast(sender_, SpecialButton).clickInSpecialArea(e_.Location).ToString)
                                  End Sub
    End Sub
End Class

答案 1 :(得分:0)

你可以在主按钮的一角放置一个带有问号的小按钮,假设小问号按钮叫做butq,现在使用下面的代码:

butq.BringToFront