デフォルトのボタンアイテムの使用方法は知っていますが、以下に示すような複数行ボタン(または「クリック可能なテキスト」)のスタイルを実現する方法はありますか?
状況は、ユーザーが確立したいファイルの種類を選択するためのインターフェースを持っており、より大きなメイン行の下に簡単な説明がなければならないということです。
これはWindows7でのみ実行する予定なので、古いバージョンのWindowsとの下位互換性について心配する必要はありません。
スクリーンショットに示されているボタンは、実際にはAeroUI全体で使用されているボタンです。これは「コマンドリンク」と呼ばれるカスタムスタイルのボタンであり、標準のButton
コントロールに簡単に適用できます。
残念ながら、WinFormsライブラリは単純なプロパティを介してこの機能を公開していませんが、少しのP/Invokeで簡単に修正できます。
あなたが探しているスタイルはと呼ばれていますBS_COMMANDLINK
。ドキュメントによると、このスタイル:
スタイルボタンのように動作するコマンドリンクボタンを作成します
BS_PUSHBUTTON
が、コマンドリンクボタンの左側には、ボタンのテキストを指す緑色の矢印があります。ボタンにメッセージを送信することで、ボタンテキストのキャプションを設定できBCM_SETNOTE
ます。
これは、標準のWinFormsButton
コントロールを拡張し、デザイナーまたはコードを介して構成できるプロパティとして「コマンドリンク」スタイルを実装する小さなカスタムボタンコントロールクラスです。
コードについて注意すべき点がいくつかあります。
FlatStyle
プロパティは常にに設定する必要があります。FlatStyle.System
これにより、WinFormsコードによって描画されるものではなく、標準のWindowsAPIボタンコントロールが強制的に使用されます。これは、BS_COMMANDLINK
スタイルが機能するために必要であり(ネイティブコントロールでのみサポートされているため)、とにかく見栄えの良いボタンコントロール(ドキドキ効果など)を生成します。これを強制するために、FlatStyle
プロパティをオーバーライドしてデフォルト値を設定しました。
CommandLink
プロパティは、「コマンドリンク」スタイルのオンとオフを切り替える方法です。デフォルトではオフになっており、標準のボタンコントロールが提供されるため、必要に応じて、アプリケーションのすべてのボタンコントロールをこのボタンコントロールに置き換えることができます。プロパティをオンにする(に設定するTrue
)と、豪華な複数行のコマンドリンクボタンが表示されます。
コマンドリンクボタンのキャプションは、標準ボタンに表示されるものと同じキャプションです。ただし、キャプションボタンは2行目の「説明」もサポートしています。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
残念ながら、受け入れられた回答にはバグがあります。代わりに私のライブラリを使用してVistaUIFramework
ください。より優れたCommandLinkが含まれています。
CommandLink
CommandLinkNote
動作しない(アプリケーションを2回実行した場合)CommandLinkNote
マルチラインではありませんCommandLink
ますNote
常に機能しています(プロパティはではNote
なくCommandLinkNote
)Note
マルチラインですVistaUIFrameworkには別のコントロールもあります。
Hint
null値を置き換える灰色のテキストというプロパティがあります)CloseBox
プロパティがあり、とのようMaximizeBox
にMinimizeBox
機能しますが、閉じるボタンで機能します)State
インストールされているOSのネイティブの視覚スタイルを変更せずにプログレスバーの状態/色を変更するプロパティがあります)https://www.github.com/myapkapp/VistaUIFramework/
重要:スパムではありません。私は、より優れたCommandLinkやその他の機能を提供する回答を投稿するふりをしているだけです。