如何在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
信息,可以设置按钮文本的标题
这里有一个小小的自定义按钮控件类,它扩展了标准WinFormsbutton
控件,并将“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)