我只使用布局面板、按钮和标签在 winforms 中构建了一个小井字游戏。每个游戏有 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)
有以下结果:
由于半透明标记造成的错觉,可能有点难以看清,但按钮背景颜色FromArgb(16, ...)
与具有 Alpha 通道 255 的按钮完全相同。
我做错了什么?
编辑
事实证明,按钮的FlatButtonAppearance.MouseOverBackColor
属性优先于按钮的BackColor
when FlatStyle = FlatStyle.Flat
。
我认为这不能解释为什么我的按钮在鼠标悬停时仍然显示紫色。我猜它MouseOverBackColor
默认为当前的背景色,但忽略了 alpha 通道。