如何在VB.NET中创建命令链接按钮(具有多行文本)?

如何在VB.NET中创建命令链接按钮(具有多行文本)?,.net,vb.net,winforms,winapi,button,.net,Vb.net,Winforms,Winapi,Button,我知道如何使用默认按钮项,但是有没有办法实现如下所示的多行按钮(或者更确切地说,“可点击文本”)的样式 情况是,我有一个界面供用户选择他希望建立什么样的文件,在更大的文本主线下必须有一个简短的描述 我只计划在Windows 7上运行此功能,因此我不需要担心与旧版本Windows的向后兼容性问题。屏幕截图中显示的按钮实际上是整个Aero UI中使用的按钮。这是一种称为“命令链接”的自定义按钮样式,可以轻松应用于标准的按钮控件 不幸的是,WinForms库没有通过一个简单的属性公开此功能,但这可以

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

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


我只计划在Windows 7上运行此功能,因此我不需要担心与旧版本Windows的向后兼容性问题。屏幕截图中显示的按钮实际上是整个Aero UI中使用的按钮。这是一种称为“命令链接”的自定义按钮样式,可以轻松应用于标准的
按钮
控件

不幸的是,WinForms库没有通过一个简单的属性公开此功能,但这可以通过一些p/Invoke轻松修复

您正在寻找的样式称为
BS\u COMMANDLINK
。据了解,这种风格:

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

这里有一个小小的自定义按钮控件类,它扩展了标准WinForms
button
控件,并将“command link”样式实现为一个属性,您可以在设计器中或通过代码进行配置

关于代码,需要注意以下几点:

  • FlatStyle
    属性必须始终设置为
    FlatStyle.System
    ,这将强制使用标准的Windows API按钮控件,而不是由WinForms代码绘制的控件。这是使用
    BS_COMMANDLINK
    样式所必需的(因为它仅受本机控件支持),而且它会生成外观更好的按钮控件(具有跳动效果等)。为了强制执行此操作,我覆盖了
    FlatStyle
    属性并设置了一个默认值

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

  • “命令链接”按钮的标题与标准按钮上显示的标题相同。但是,标题按钮也支持第二行的“说明”。这可以通过另一个属性进行配置,该属性名为
    CommandLinkNote
    ,位于WinAPI消息
    BCM_SETNOTE
    之后。将按钮配置为标准按钮控件(
    CommandLink=False
    )时,将忽略此属性的值

  • 导入System.Windows.Forms
    导入System.ComponentModel
    导入System.Runtime.InteropServices
    公共类按钮nex:继承按钮
    Private _commandLink作为布尔值
    Private _commandLinkNote作为字符串
    Public Sub New():MyBase.New()
    '在基类上设置默认属性值以避免过时的警告
    MyBase.FlatStyle=FlatStyle.System
    端接头
    _
    _
    _
    公共属性CommandLink为布尔值
    得到
    返回命令链接
    结束
    设置(ByVal值为布尔值)
    如果_commandLink值,则
    _commandLink=value
    Me.updateCommand链接()
    如果结束
    端集
    端属性
    _
    _
    _
    公共属性CommandLinkNote作为字符串
    得到
    返回_commandLinkNote
    结束
    设置(值为字符串)
    如果_commandLinkNote值,则
    _commandLinkNote=value
    Me.updateCommand链接()
    如果结束
    端集
    端属性
    _
    _
    _
    _
    公共阴影属性FlatStyle作为FlatStyle
    '将默认展开样式设置为“系统”,并隐藏此属性,因为
    '如果未将其设置为“系统”,则任何自定义属性都无法工作'
    得到
    返回MyBase.FlatStyle
    结束
    设置(按FlatStyle设置的ByVal值)
    MyBase.FlatStyle=值
    端集
    端属性
    #区域“P/S”
    Private Const BS_COMMANDLINK作为整数=&HE
    私有常量BCM_SETNOTE为整数=&H1609
    _
    私有共享函数SendMessage(ByVal hWnd作为IntPtr,ByVal msg作为Integer,ByVal wParam作为IntPtr_
    ByVal lParam(作为字符串)作为IntPtr
    端函数
    私有子更新命令行()
    Me.RecreateHandle()
    SendMessage(Me.Handle、BCM_SETNOTE、IntPtr.Zero、_commandLinkNote)
    端接头
    受保护的重写只读属性CreateParams作为CreateParams
    得到
    将cp设置为CreateParams=MyBase.CreateParams
    如果我是CommandLink那么
    cp.Style=cp.Style或BS_命令链接
    如果结束
    返回cp
    结束
    端属性
    #末端区域
    末级
    
    不重要的是,公认的答案有错误,请使用我的库,它是
    VistaUIFramework
    ,它包含更好的命令链接

    比较

    公认的答案
    • 您必须始终检查
      CommandLink
    • CommandLinkNote
      不工作(如果您再次运行应用程序)
    • CommandLinkNote
      不是多行
    • 它没有默认大小(默认情况下CommandLink太小)
    内脏框架
    • 具有
      CommandLink
      控件
    • Note
      始终有效(属性是
      Note
      而不是
      CommandLinkNote
    • 注意
      是多行的
    • 它有一个默认大小(2)