禁用"禁用外观"禁用按钮(用于桌面的VB.net)

时间:2014-08-30 00:47:27

标签: vb.net winforms look-and-feel

我的应用程序中有很多按钮,其中一些按钮在各种情况下被禁用。 问题是,按钮"看起来不对"当.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"实际上已启用,但我已删除其背景图片。问题是,它仍然可以点击。

Buttons

我怎样才能看到我正在寻找的目标?

2 个答案:

答案 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 是很困难的,但如果你足够耐心,你就有了一个起点。

瓦尔特