3

デフォルトのボタンアイテムの使用方法は知っていますが、以下に示すような複数行ボタン(または「クリック可能なテキスト」)のスタイルを実現する方法はありますか?

状況は、ユーザーが確立したいファイルの種類を選択するためのインターフェースを持っており、より大きなメイン行の下に簡単な説明がなければならないということです。

これはWindows7でのみ実行する予定なので、古いバージョンのWindowsとの下位互換性について心配する必要はありません。

4

2 に答える 2

4

スクリーンショットに示されているボタンは、実際にはAeroUI全体で使用されているボタンです。これは「コマンドリンク」と呼ばれるカスタムスタイルのボタンであり、標準のButtonコントロールに簡単に適用できます。

残念ながら、WinFormsライブラリは単純なプロパティを介してこの機能を公開していませんが、少しのP/Invokeで簡単に修正できます。

あなたが探しているスタイルはと呼ばれていますBS_COMMANDLINKドキュメントによると、このスタイル:

スタイルボタンのように動作するコマンドリンクボタンを作成しますBS_PUSHBUTTONが、コマンドリンクボタンの左側には、ボタンのテキストを指す緑色の矢印があります。ボタンにメッセージを送信することで、ボタンテキストのキャプションを設定できBCM_SETNOTEます。

これは、標準のWinFormsButtonコントロールを拡張し、デザイナーまたはコードを介して構成できるプロパティとして「コマンドリンク」スタイルを実装する小さなカスタムボタンコントロールクラスです。

コードについて注意すべき点がいくつかあります。

  1. FlatStyleプロパティは常にに設定する必要があります。FlatStyle.Systemこれにより、WinFormsコードによって描画されるものではなく、標準のWindowsAPIボタンコントロールが強制的に使用されます。これは、BS_COMMANDLINKスタイルが機能するために必要であり(ネイティブコントロールでのみサポートされているため)、とにかく見栄えの良いボタンコントロール(ドキドキ効果など)を生成します。これを強制するために、FlatStyleプロパティをオーバーライドしてデフォルト値を設定しました。

  2. CommandLinkプロパティは、「コマンドリンク」スタイルのオンとオフを切り替える方法です。デフォルトではオフになっており、標準のボタンコントロールが提供されるため、必要に応じて、アプリケーションのすべてのボタンコントロールをこのボタンコントロールに置き換えることができます。プロパティをオンにする(に設定するTrue)と、豪華な複数行のコマンドリンクボタンが表示されます。

  3. コマンドリンクボタンのキャプションは、標準ボタンに表示されるものと同じキャプションです。ただし、キャプションボタンは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
于 2012-05-08T02:55:18.170 に答える
0

残念ながら、受け入れられた回答にはバグがあります。代わりに私のライブラリを使用してVistaUIFrameworkください。より優れたCommandLinkが含まれています。

比較


受け入れられた答え

  • あなたは常にチェックする必要がありますCommandLink
  • CommandLinkNote動作しない(アプリケーションを2回実行した場合)
  • CommandLinkNoteマルチラインではありません
  • デフォルトのサイズはありません(CommandLinkはデフォルトでは小さすぎます)

VistaUIFramework

  • コントロールがありCommandLinkます
  • Note常に機能しています(プロパティはではNoteなくCommandLinkNote
  • Noteマルチラインです
  • デフォルトのサイズ(200x74)です

VistaUIFrameworkには別のコントロールもあります。

  • ボタン(FlatStyle =システムを使用してボタンをイベントに影響を与える)
  • CheckBox(FlatStyle = System for letチェックボックスがイベントに影響を与える場合)
  • RadioButton(FlatStyle =ラジオボタンがイベントに影響を与えるようにするためのシステム)
  • TextBox(Hintnull値を置き換える灰色のテキストというプロパティがあります)
  • フォーム(CloseBoxプロパティがあり、とのようMaximizeBoxMinimizeBox機能しますが、閉じるボタンで機能します)
  • ProgressBar(StateインストールされているOSのネイティブの視覚スタイルを変更せずにプログレスバーの状態/色を変更するプロパティがあります)


VistaUIFrameworkは、WinFormsとC++のWin32/WinAPIを組み合わせたものです。

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

重要:スパムではありません。私は、より優れたCommandLinkやその他の機能を提供する回答を投稿するふりをしているだけです。

于 2015-12-31T16:41:37.787 に答える