我的应用程序中有很多按钮,其中一些按钮在各种情况下被禁用。 问题是,按钮"看起来不对"当.Enabled = False
时以下是可以类似地应用于所有按钮的属性列表的示例。
.BackColor = Color.Goldenrod
.Flatstyle = FlatStyle.Flat
.FlatAppearance.MouseOverBackColor = Color.White
.FlatAppearance.BorderSize = 0
.BackgroundImageLayout = ImageLayout.Stretch
.BackGroundImage = My.Resources.Resources.ButtonFade 'This image is translucent, giving the rounded 3D look as shown below.
.ForeColor = Color.Black
.Image = My.Resources.Resources.refresh 'May be other images.
.Text = "RELOAD"
.BackColor属性可以是各种颜色,由用户通过"主题"设置。
为了说明我的顾虑,下面是三个按钮的屏幕截图。 " NEW"已启用。 " SAVE"被禁用。虽然" NEW" AND" SAVE"看起来很相似," SAVE"用低对比度的颜色洗掉文字和图像。
我希望所有已禁用的按钮看起来更像是" RELOAD"。也就是说,我希望文本和图像保持纯黑色,以获得更好的易读性,但我可以设置BackgroundImage = Nothing,因此它不会看起来像3D。 (对于用户来说,模型是"如果它不是3D,则它不可点击。")我可能还会修改禁用按钮的背景颜色,但该部分是简单。我只需要系统停止"灰化"设置Enabled = False时的文本和图像。
要获取此屏幕截图," RELOAD"实际上已启用,但我已删除其背景图片。问题是,它仍然可以点击。
我怎样才能看到我正在寻找的目标?
答案 0 :(得分:4)
使用Enabled属性无法实现您想要的功能,Button类实现了Windows GUI样式指南,禁用控件应通过灰显外观来禁用它们。另一个限制是按钮渲染器不能被修改,它们不能被覆盖。
您需要通过禁用控件行为来实现目标。在项目中添加一个新类并粘贴下面显示的代码。编译。将新控件从工具箱顶部拖到窗体中,替换现有按钮控件。如果要禁用按钮,请在代码中将Disabled属性设置为 True 。您可能想要修改改变外观的代码。
Imports System.ComponentModel
Public Class MyButton
Inherits Button
<DefaultValue(False)> _
Public Property Disabled As Boolean
Get
Return IsDisabled
End Get
Set(value As Boolean)
If Value = IsDisabled Then Return
IsDisabled = Value
MyBase.SetStyle(ControlStyles.Selectable, Not IsDisabled)
If IsDisabled And Me.Focused Then Me.Parent.SelectNextControl(Me, True, True, True, True)
'' Change appearance...
If IsDisabled Then
Me.FlatStyle = Windows.Forms.FlatStyle.Flat
Else
Me.FlatStyle = Windows.Forms.FlatStyle.Standard
End If
End Set
End Property
Protected Overrides Sub OnMouseEnter(e As EventArgs)
If Not IsDisabled Then MyBase.OnMouseEnter(e)
End Sub
Protected Overrides Sub OnMouseDown(mevent As MouseEventArgs)
If Not IsDisabled Then MyBase.OnMouseDown(mevent)
End Sub
Protected Overrides Sub OnKeyDown(kevent As KeyEventArgs)
If Not IsDisabled Then MyBase.OnKeyDown(kevent)
End Sub
Private IsDisabled As Boolean
End Class
答案 1 :(得分:0)
我在c中的方式(对于极端gui的东西更强大。这个例子很简单!)来覆盖禁用状态并绘制我的图像(在c中):
NMHDR *nmr;
NMCUSTOMDRAW *nmcd;
case WM_NOTIFY:
nmr = (NMHDR *)lParam;
nmcd = (NMCUSTOMDRAW *)lParam;
if(nmr->idFrom == IDC_BUTTON && nmr->code == NM_CUSTOMDRAW){
if(nmcd->dwDrawStage == CDDS_PREERASE){
if(nmcd->uItemState & 0x1) {StretchBlt(nmcd->hdc,...);} //Down
else if(nmcd->uItemState & 0x40){StretchBlt(nmcd->hdc,...);} //Enter
else if(nmcd->uItemState & 0x4) {StretchBlt(nmcd->hdc,...);} //Disable
else {StretchBlt(nmcd->hdc,...);} //Leave
return CDRF_SKIPDEFAULT;
}
}
break;
将 WM_NOTIFY 发送到您的主表单,以便您可以捕获它。 nmcd-&gt; hdc 是您的按钮 hdc ,您可以根据状态(向下,输入, 禁用或离开)。我知道从 c 编写 vb 是很困难的,但如果你足够耐心,你就有了一个起点。
瓦尔特