VB.NETでコマンドリンクを使いたい

タグの編集
投稿者 ssskkk  (学生) 投稿日時 2018/9/5 18:07:12
お世話になります。

環境:
Windows10
VisualStudio 2017

VB.NETでファイルを管理するアプリケーションを作っています

ファイル削除の確認をするときにコマンドリンクを使ったダイアログを使用したいのですが
ネットで調べても出てきませんでした。

自作する以外に方法はないのでしょうか。
 
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/9/5 18:54:46
※この掲示板の IMAGE タグは https だと反応しません。http のみ。
  

ひとまず最低限の実装なら、BS_COMMANDLINK スタイルを指定すれば OK です。

Imports System.ComponentModel
Imports System.Runtime.InteropServices

<ToolboxBitmap(GetType(Button))>
<DefaultEvent("Click")>
Public Class CommandLink
    Inherits Button
    Public Sub New()
    End Sub
    Protected Overrides ReadOnly Property CreateParams As CreateParams
        Get
            Const BS_COMMANDLINK As Integer = &HE
            Dim p = MyBase.CreateParams
            p.Style = p.Style Or BS_COMMANDLINK
            Return p
        End Get
    End Property
End Class



これだけだと寂しいので、BCM_SETNOTE や BCM_SETSHIELD もあると良いでしょう。


#Region "SupplementalExplanation / 補足テキスト"
    ''' <summary> 
    ''' 補足テキスト 
    ''' </summary> 
    ''' <returns></returns> 
    <Category("Appearance")>
    <Description("補足テキスト")>
    <DefaultValue("")>
    Public Property SupplementalExplanation As String
        Get
            Return _SupplementalExplanation
        End Get
        Set(value As String)
            Const BCM_SETNOTE As Integer = 5641
            _SupplementalExplanation = value
            SendMessage(New HandleRef(MeMe.Handle), BCM_SETNOTE, IntPtr.Zero, value)
        End Set
    End Property
    Private _SupplementalExplanation As String = ""
#End Region

#Region "UACShield / UAC シールドアイコン"
    ''' <summary> 
    ''' UAC シールドアイコン 
    ''' </summary> 
    ''' <returns></returns> 
    <Category("Appearance")>
    <Description("UAC シールドアイコン")>
    <DefaultValue(False)>
    Public Property UACShield As Boolean
        Get
            Return _UACShield
        End Get
        Set(value As Boolean)
            Const BCM_SETSHIELD As Integer = 5644
            _UACShield = value
            SendMessage(New HandleRef(MeMe.Handle), BCM_SETSHIELD, IntPtr.Zero, New IntPtr(If(value, 1, 0)))
        End Set
    End Property
    Private _UACShield As Boolean = False
#End Region

    Private Declare Auto Function SendMessage Lib "user32" (hwnd As HandleRef, msg As Integer, wParam As IntPtr, lParam As IntPtr) As IntPtr
    Private Declare Auto Function SendMessage Lib "user32" (hwnd As HandleRef, msg As Integer, wParam As IntPtr, lParam As StringAs IntPtr
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/9/6 09:50:38
先のコードですが、下記のように訂正しておいてください。
FlatStyle が System でないと CommandLink のスタイルになりませんので。

    Public Sub New()
        FlatStyle = FlatStyle.System   '★この行を追加 
    End Sub



> 自作する以外に方法はないのでしょうか。

Microsoft が公開していた WindowsAPICodePack にも含まれています。
https://blogs.msdn.microsoft.com/ttanaka/2010/10/24/windows-api-code-pack-17-windows-7-12/

今回のケースで言うと、
 Microsoft.WindowsAPICodePack.Shell.dll
 Microsoft.WindowsAPICodePack.dll
を参照設定してやれば、CommandLink クラスを利用可能です。

※WinForm 用が Microsoft.WindowsAPICodePack.Controls.WindowsForms 名前空間
※WPF 用が Microsoft.WindowsAPICodePack.Controls.WindowsPresentationFoundation 名前空間


しかし WindowsAPICodePack の公式配布サイトは、残念ながら既に閉鎖しています。
当時のアーカイブキャッシュがこちら。
https://web.archive.org/web/20130110103706/http://archive.msdn.microsoft.com:80/WindowsAPICodePack



Microsoft からの公式なダウンロードサイトは既に失われていますが、
その後、有志によって改修・再公開されたものが幾つかありますので
そちらを使ってみるのも良いかもしれません。

Visual Studio メニューの [ツール]-[NuGet パッケージマネージャ] から
『WindowsAPICodePack Shell』というキーワードで検索して導入してみてください。

具体的なパッケージ例としては
 Microsoft-WindowsAPICodePack-Shell
  https://www.nuget.org/packages/Microsoft-WindowsAPICodePack-Shell/
などがあります。
投稿者 ssskkk  (学生) 投稿日時 2018/9/6 10:00:25
魔界の仮面弁士 様ありがとうございます。
なんとか完成させることができました。