2012-12-07 6 views
8

winformsアプリケーションでC#と.Net 4.0を使用する:UACシールドをボタンに追加してボタンの背景イメージを保持することは可能ですか?どうやって?UACシールドをボタンに追加し、その背景イメージを保持しますか?

...

[DllImport("user32.dll")] 
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); 

public static void UACToButton(Button button, bool add) 
{ 
    const Int32 BCM_SETSHIELD = 0x160C; 
    if (add) 
     { 
     // The button must have the flat style 
     button.FlatStyle = FlatStyle.System; 
     if (button.Text == "") 
     // and it must have text to display the shield 
      button.Text = " "; 
      SendMessage(button.Handle, BCM_SETSHIELD, 0, 1);   
     } 
     else 
      SendMessage(button.Handle, BCM_SETSHIELD, 0, 0);  
} 

おかげでこれは私が現時点で使用しているものですが、それは、画像を削除します!

+0

ボタンにテキストを表示しないでシールドを表示しようとしていますか?他の画像の上に追加する方法は次のとおりです。 –

+0

ボタンにはテキストがありません。それはイメージを持つだけで、メソッドが呼び出されると削除されます。 – Daro

+0

imageres.dllからアイコンをロードし、ボタン上のイメージを描画する前に背景イメージ上にアイコンを描画します。 – Elmue

答えて

2

おそらく、これが役立ちます。http://blog.csharphelper.com/2011/03/03/add-uac-shields-to-buttons-menu-items-and-picture-boxes-in-c.aspx

をそれはUACの盾を受け取り、ビットマップをサポートしているものの上に配置することができますビットマップを返します。

EDIT: ここで仕事ができるいくつかの大まかなサンプルコードです:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace UAC_Test 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     [DllImport("user32.dll")] 
     public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); 

     // Make the button display the UAC shield. 
     public static void AddShieldToButton(Button btn) 
     { 
      const Int32 BCM_SETSHIELD = 0x160C; 

      // Give the button the flat style and make it display the UAC shield. 
      btn.FlatStyle = System.Windows.Forms.FlatStyle.System; 
      SendMessage(btn.Handle, BCM_SETSHIELD, 0, 1); 
     } 

     // Return a bitmap containing the UAC shield. 
     private static Bitmap shield_bm = null; 
     public static Bitmap GetUacShieldImage() 
     { 
      if (shield_bm != null) return shield_bm; 

      const int WID = 50; 
      const int HGT = 50; 
      const int MARGIN = 4; 

      // Make the button. For some reason, it must 
      // have text or the UAC shield won't appear. 
      Button btn = new Button(); 
      btn.Text = " "; 
      btn.Size = new Size(WID, HGT); 
      AddShieldToButton(btn); 

      // Draw the button onto a bitmap. 
      Bitmap bm = new Bitmap(WID, HGT); 
      btn.Refresh(); 
      btn.DrawToBitmap(bm, new Rectangle(0, 0, WID, HGT)); 

      // Find the part containing the shield. 
      int min_x = WID, max_x = 0, min_y = HGT, max_y = 0; 

      // Fill on the left. 
      for (int y = MARGIN; y < HGT - MARGIN; y++) 
      { 
       // Get the leftmost pixel's color. 
       Color target_color = bm.GetPixel(MARGIN, y); 

       // Fill in with this color as long as we see the target. 
       for (int x = MARGIN; x < WID - MARGIN; x++) 
       { 
        // See if this pixel is part of the shield. 
        if (bm.GetPixel(x, y).Equals(target_color)) 
        { 
         // It's not part of the shield. 
         // Clear the pixel. 
         bm.SetPixel(x, y, Color.Transparent); 
        } 
        else 
        { 
         // It's part of the shield. 
         if (min_y > y) min_y = y; 
         if (min_x > x) min_x = x; 
         if (max_y < y) max_y = y; 
         if (max_x < x) max_x = x; 
        } 
       } 
      } 

      // Clip out the shield part. 
      int shield_wid = max_x - min_x + 1; 
      int shield_hgt = max_y - min_y + 1; 
      shield_bm = new Bitmap(shield_wid, shield_hgt); 
      Graphics shield_gr = Graphics.FromImage(shield_bm); 
      shield_gr.DrawImage(bm, 0, 0, 
       new Rectangle(min_x, min_y, shield_wid, shield_hgt), 
       GraphicsUnit.Pixel); 

      // Return the shield. 
      return shield_bm; 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      Graphics gfx = Graphics.FromImage(button1.BackgroundImage); 
      Bitmap shield = GetUacShieldImage(); 
      gfx.DrawImage(shield, button1.Width/2, button1.Height/2); 
     } 
    } 
} 

これは、背景画像の上にUACの盾を描いています。ボタンの上に画像の位置を調整することができます。 System UACシールドと同じくらい美しくはありませんが、UACシールドアイコンがバックグラウンドイメージの上に表示されます。

+0

いいえUACシールドをビットマップとして取得し、それをビットマップをサポートするものに置きます。そのコードを取得し、ボタンに背景画像を追加すると、私の問題が表示されます。とにかくありがとう。 – Daro

+0

いくつかのサンプルコードを含むように私の答えを更新しました。最初は、あなたの背景イメージにUACシールドを描く必要があることを忘れていました。 –

+1

これはひどく複雑です!フレームワークでサポートされている場合はSystemIcons.Shieldを使用するか、imageres.dllからロードするか、他の場所からアイコンをダウンロードして自分で描画します。 – Elmue

3

Elmueが述べたように、SystemIcons.ShieldはUACシールドアイコンにアクセスする最も簡単な方法です。

public static Image AddUACShieldToImage(Image image) 
    { 
     var shield = SystemIcons.Shield.ToBitmap(); 
     shield.MakeTransparent(); 

     var g = Graphics.FromImage(image); 
     g.CompositingMode = CompositingMode.SourceOver; 
     g.DrawImage(shield, new Rectangle(image.Width/2, image.Height/2, image.Width/2, image.Height/2)); 

     return image; 
    } 
関連する問題