2015年6月22日月曜日

VB シールドアイコン付きのボタン

自分でコードを書いていると、外部のソフトを呼び出したい事ってありますね。
無論、Process を別に立ち上げれば済むのですが。
只、そのソフトが 権限の昇格を要求する場合、 呼び出し元にも、その旨を表示したいですね。
そこで、 シールドアイコン付きのボタン の登場です。


外部のソフトを自分のアプリから呼び出すのは、そうは難しい事ではありません。
別の Process を作れば、それで、用は済みますね。  その辺りは、ここでは触れません。.

OS vista 以降、採用された ユーザーアカウント制御 (UAC: User Account Control) ですが、
標準トークンから管理者特権への昇格を要求される場合、
ソフトによって、 昇格を確認するポップアップが直ぐ出てくれるもの、 最小化された状態で待機してしまうもの、等 様々です。
Secure Desktop の昇格確認ダイアログ が出ますよ と告知する為にも、
Process を起動する Button には シールドアイコン(Shield Icon)付きのボタン を使いたいですね。


以下に、 標準的な Form に Button をふたつ用意し、 Load イベントで片方にアイコンを付加するコードを示します。

付加するアイコンは 管理者権限を要求するアプリのデスクトップアイコンの右下に表示される あの アイコン と 類似 のものです。
  最後の図をご覧戴ければお分かりの様に、Windows 7 では、 若干、カラーリングが異なっていますね。  うん、カラフル!。.
.Netframework 3.5 より提供されているものですね。

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Button1.Image = New Icon(SystemIcons.Shield, New Size(16, 16)).ToBitmap
        Me.Button1.TextImageRelation = TextImageRelation.ImageBeforeText

        ''Detail setting, When Not Use TextImageRelation
        ''Case Large Height Button
        'Me.Button1.Height = 40
        'Me.Button1.ImageAlign = ContentAlignment.TopLeft
        'Me.Button1.Text = "   " & Me.Button1.Text
        'Me.Button2.Height = Me.Button1.Height

    End Sub

End Class

上のコードの実行例です。
左が上のコードの最初の2行のみで実行したもの、  .Image と .TextImageRelation の設定のみ。.
右は上のコードの最初の1行とコメントアウト部分を生かしたものです。  ボタンの高さを高くしアイコンを左肩に表示。.





さて、シールドアイコン が、OS 既定のものと違う と、お困りの場合、 以下のコードを参照下さい。
ここでは、Button2 のイベントハンドラで、
user32.dll (Win32API) の SendMessage を利用して 既定のアイコン 0x160C を呼び出します。

Imports System.Runtime.InteropServices

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Button1.Image = New Icon(SystemIcons.Shield, New Size(16, 16)).ToBitmap
        Me.Button1.TextImageRelation = TextImageRelation.ImageBeforeText

        ''Detail setting, When Not Use TextImageRelation
        ''Case Large Height Button
        'Me.Button1.Height = 40
        'Me.Button1.ImageAlign = ContentAlignment.TopLeft
        'Me.Button1.Text = "   " + Me.Button1.Text
        'Me.Button2.Height = Me.Button1.Height

    End Sub


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        '
        Me.Button2.FlatStyle = FlatStyle.System
        Dim hwnd As New System.Runtime.InteropServices.HandleRef(Me.Button2, Me.Button2.Handle)
        Dim BCM_SETSHIELD As UInt32 = &H160C
        SendMessage(hwnd, BCM_SETSHIELD, New IntPtr(0), New IntPtr(1))

    End Sub

    <DllImport("user32.dll")> _
    Private Shared Function SendMessage( _
            ByVal hWnd As HandleRef, _
            ByVal Msg As UInt32, _
            ByVal wParam As IntPtr, _
            ByVal lParam As IntPtr) As IntPtr
    End Function

End Class

こうして、表示されるのが こちら です。



双方の違いがお分かり戴けると思います。
   でも、どうして、2種類のアイコンを用意している の かしらん?。.



0 件のコメント:

コメントを投稿