3

我知道如何使用默认按钮项,但是有什么方法可以实现多行按钮的样式(或者更确切地说,“可点击文本”?),如下所示?

情况是我有一个界面供用户选择他希望建立什么样的文件,并且在较大的主文本行下必须有一个简短的描述。

我只打算在 Windows 7 上运行它,所以我不需要担心与旧版本 Windows 的向后兼容性

4

2 回答 2

4

屏幕截图中显示的按钮实际上是整个 Aero UI 中使用的按钮。它是一种自定义样式的按钮,称为“命令链接”,可以轻松应用于标准Button控件。

不幸的是,WinForms 库并没有通过一个简单的属性公开这个功能,但是通过一点 P/Invoke 很容易解决这个问题。

您要查找的样式称为BS_COMMANDLINK. 根据文档,这种风格:

创建一个行为类似于BS_PUSHBUTTON样式按钮的命令链接按钮,但命令链接按钮左侧有一个绿色箭头,指向按钮文本。可以通过向按钮发送BCM_SETNOTE消息来设置按钮文本的标题。

这是一个小自定义按钮控件类,它扩展了标准 WinFormsButton控件,并将“命令链接”样式实现为您可以在设计器中或通过代码配置的属性。

关于代码有几点需要注意:

  1. FlatStyle属性必须始终设置为FlatStyle.System,这会强制使用标准的 Windows API 按钮控件,而不是由 WinForms 代码绘制的控件。这是BS_COMMANDLINK样式工作所必需的(因为它仅受本机控件支持),并且无论如何它都会产生更好看的按钮控件(具有跳动效果等)。为了强制执行此操作,我重写了该FlatStyle属性并设置了默认值。

  2. CommandLink属性是您打开和关闭“命令链接”样式的方式。默认情况下它是关闭的,为您提供标准按钮控件,因此您可以将应用程序中的所有按钮控件替换为此控件,如果您愿意,只是为了方便。当您打开该属性(将其设置为True)时,您会得到一个精美的多行命令链接按钮。

  3. 命令链接按钮的标题与标准按钮上显示的标题相同。但是,标题按钮支持第二行的“描述”。CommandLinkNote这可以通过WinAPI 消息之后称为 的另一个属性进行配置BCM_SETNOTE。当您将按钮配置为标准按钮控件 ( CommandLink = False) 时,此属性的值将被忽略。

Imports System.Windows.Forms
Imports System.ComponentModel
Imports System.Runtime.InteropServices

Public Class ButtonEx : Inherits Button

    Private _commandLink As Boolean
    Private _commandLinkNote As String

    Public Sub New() : MyBase.New()
        'Set default property values on the base class to avoid the Obsolete warning
        MyBase.FlatStyle = FlatStyle.System
    End Sub

    <Category("Appearance")> _
    <DefaultValue(False)> _
    <Description("Specifies this button should use the command link style. " & _
                 "(Only applies under Windows Vista and later.)")> _
    Public Property CommandLink As Boolean
        Get
            Return _commandLink
        End Get
        Set(ByVal value As Boolean)
            If _commandLink <> value Then
                _commandLink = value
                Me.UpdateCommandLink()
            End If
        End Set
    End Property

    <Category("Appearance")> _
    <DefaultValue("")> _
    <Description("Sets the description text for a command link button. " & _
                 "(Only applies under Windows Vista and later.)")> _
    Public Property CommandLinkNote As String
        Get
            Return _commandLinkNote
        End Get
        Set(value As String)
            If _commandLinkNote <> value Then
                _commandLinkNote = value
                Me.UpdateCommandLink()
            End If
        End Set
    End Property

    <Browsable(False)> <EditorBrowsable(EditorBrowsableState.Never)> _
    <DebuggerBrowsable(DebuggerBrowsableState.Never)> _
    <Obsolete("This property is not supported on the ButtonEx control.")> _
    <DefaultValue(GetType(FlatStyle), "System")> _
    Public Shadows Property FlatStyle As FlatStyle
        'Set the default flat style to "System", and hide this property because
        'none of the custom properties will work without it set to "System"
        Get
            Return MyBase.FlatStyle
        End Get
        Set(ByVal value As FlatStyle)
            MyBase.FlatStyle = value
        End Set
    End Property

#Region "P/Invoke Stuff"
    Private Const BS_COMMANDLINK As Integer = &HE
    Private Const BCM_SETNOTE As Integer = &H1609

    <DllImport("user32.dll", CharSet:=CharSet.Unicode, SetLastError:=False)> _
    Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, _
                                        <MarshalAs(UnmanagedType.LPWStr)> ByVal lParam As String) As IntPtr
    End Function

    Private Sub UpdateCommandLink()
        Me.RecreateHandle()
        SendMessage(Me.Handle, BCM_SETNOTE, IntPtr.Zero, _commandLinkNote)
    End Sub

    Protected Overrides ReadOnly Property CreateParams As CreateParams
        Get
            Dim cp As CreateParams = MyBase.CreateParams

            If Me.CommandLink Then
                cp.Style = cp.Style Or BS_COMMANDLINK
            End If

            Return cp
        End Get
    End Property
#End Region

End Class
于 2012-05-08T02:55:18.170 回答
0

不幸的是,接受的答案有错误,请改用我的库VistaUIFramework,它包含更好的 CommandLink。

比较


接受的答案

  • 你必须经常检查CommandLink
  • CommandLinkNote不工作(如果您第二次运行您的应用程序)
  • CommandLinkNote不是多行
  • 它没有默认大小(CommandLink 默认太小)

VistaUI框架

  • CommandLink控制权
  • Note一直在工作(属性是Note而不是CommandLinkNote
  • Note是多行的
  • 它有一个默认尺寸(200x74)

VistaUIFramework 还有另一个控件:

  • 按钮(使用 FlatStyle=System 让按钮对事件产生影响)
  • CheckBox(使用 FlatStyle=System 让复选框对事件产生影响)
  • RadioButton(使用 FlatStyle=System 让单选按钮对事件产生影响)
  • TextBox(它有Hint属性,一个灰色的文本替换空值)
  • 表单(它具有CloseBox属性,它的工作方式类似于MaximizeBoxand MinimizeBox,但它与关闭按钮一起工作)
  • ProgressBar(它具有在State不改变已安装操作系统的本机视觉样式的情况下更改进度条的状态/颜色的属性)


VistaUIFramework 将 WinForms 与 C++ 中的 Win32/WinAPI 混合在一起。

https://www.github.com/myapkapp/VistaUIFramework/

重要提示:这不是垃圾邮件,我只是假装发布一个提供更好 CommandLink 和更多内容的答案。

于 2015-12-31T16:41:37.787 回答