按钮BackColor(似乎)忽略alpha通道

时间:2013-07-29 20:38:20

标签: vb.net winforms

我在winforms中使用布局面板,按钮和标签构建了一个小小的Tic-Tac-Toe游戏。每个游戏有2个玩家,每个玩家与标记和颜色相关联。当玩家声明一个字段(点击网格上的按钮)时,该按钮的BackColor将更改为该玩家的颜色。

我现在要做的是让网格中的空白字段成为玩家颜色的半透明色调,而光标位于字段上方。

出于某种原因,这不适用于我的按钮:

Public Class FieldButton
    Inherits Button

    ' ... Omitting for brevity '


    Private _mouseIn As Boolean

    Protected Overrides Sub OnMouseEnter(e As EventArgs)
        MyBase.OnMouseEnter(e)
        _mouseIn = True
    End Sub

    Protected Overrides Sub OnMouseLeave(e As EventArgs)
        MyBase.OnMouseLeave(e)
        _mouseIn = False
    End Sub

    Public Overrides Property BackColor As Color
        Get
            If Field.HasOwner Then
                Return Field.Owner.Color
            ElseIf _mouseIn Then
                Return Color.FromArgb(16, Presenter.Game.CurrentPlayer.Color)
            End If
            Return MyBase.BackColor
        End Get
        Set(value As Color)
            MyBase.BackColor = value
        End Set
    End Property

    Private Shared ReadOnly FullPen As New Pen(Brushes.Black, 3)
    Private Shared ReadOnly SemiTransparentPen As New Pen(Color.FromArgb(64, Color.Black), 3)

    Protected Overrides Sub OnPaint(pevent As PaintEventArgs)
        MyBase.OnPaint(pevent)
        If Field.HasOwner Then
            PaintMark(pevent.Graphics, pevent.ClipRectangle, Field.Owner.Mark, FullPen)
        ElseIf _mouseIn And Not Presenter.Game.IsGameOver Then
            PaintMark(pevent.Graphics, pevent.ClipRectangle, Presenter.Game.CurrentPlayer.Mark, SemiTransparentPen)
        End If
    End Sub

    ' ... '

End Class

在上面的代码中,Field是另一个表示网格中字段的对象。每个字段都有一个Owner,设置为声明该字段的玩家(或null)。

无论如何,应该做魔术的那条线:

Return Color.FromArgb(16, Presenter.Game.CurrentPlayer.Color)

具有以下结果:

enter image description here

由于半透明标记产生的幻觉,可能有点难以看到,但按钮背景颜色FromArgb(16, ...)通道的完全相同255。

我做得不对?

修改

事实证明,当FlatButtonAppearance.MouseOverBackColor时,按钮的BackColor属性优先于按钮的FlatStyle = FlatStyle.Flat

我认为这并不能解释为什么我的按钮在鼠标悬停时仍显示为紫色。我猜测MouseOverBackColor默认为当前的背景颜色,但忽略了alpha通道。

1 个答案:

答案 0 :(得分:0)

研究表明这应该适合你,将它添加到按钮构造函数中;

this.SetStyle(ControlStyles.SupportsTransparentBackColor, true)

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.setstyle.aspx http://msdn.microsoft.com/en-us/library/system.windows.forms.controlstyles.aspx