我在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)
具有以下结果:
由于半透明标记产生的幻觉,可能有点难以看到,但按钮背景颜色FromArgb(16, ...)
与
我做得不对?
修改
事实证明,当FlatButtonAppearance.MouseOverBackColor
时,按钮的BackColor
属性优先于按钮的FlatStyle = FlatStyle.Flat
。
我认为这并不能解释为什么我的按钮在鼠标悬停时仍显示为紫色。我猜测MouseOverBackColor
默认为当前的背景颜色,但忽略了alpha通道。
答案 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