2012-02-20 9 views
14

私は現在、Winforms.NET 3.5(作業環境)を使用して簡単な画像編集ツールを開発中です。コントロールを透明にする

ユーザが選択ツールボタンをクリックすると、100x100400x400の間で拡大/縮小できる四角形(C#の四角形)が表示されます。このビットは固定されています。問題は、矩形の背景を透明にすることです。

私は透明性が.NET 3.5でサポートされている場合にはほとんど不明でよ、私は次のことを試してみた:

SetStyle(ControlStyles.SupportsTransparentBackColor, true); 
pnlSelectArea.BackColor = Color.Transparent; 
pnlSelectArea.ForeColor = Color.Transparent; 
selectArea1.BackColor = Color.Transparent; 
selectArea1.ForeColor = Color.Transparent; 

をしかし、これは効果がありません - 何かアドバイスをいただければ幸いです。

+0

チェックこのhttp://stackoverflow.com/questions/72994/net-windows-forms-transparent-control – papaiatis

+0

助けてくれてありがとう - 私はこれを私のソリューションに適用することはできませんが、私はその努力を感謝します。 –

+0

あなたは私の簡単なアプローチを見つけることができますポスト[here:](http://stackoverflow.com/a/34404064/1529012) – aleksandaril

答えて

42

これは、Opacityプロパティが含まれている私の特別なコントロールですが、それは100%の作品:

using System; 
using System.Collections; 
using System.ComponentModel; 
using System.ComponentModel.Design; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 

public class TranspCtrl : Control 
{ 
    public bool drag = false; 
    public bool enab = false; 
    private int m_opacity = 100; 

    private int alpha; 
    public TranspCtrl() 
    { 
     SetStyle(ControlStyles.SupportsTransparentBackColor, true); 
     SetStyle(ControlStyles.Opaque, true); 
     this.BackColor = Color.Transparent; 
    } 

    public int Opacity 
    { 
     get 
     { 
      if (m_opacity > 100) 
      { 
       m_opacity = 100; 
      } 
      else if (m_opacity < 1) 
      { 
       m_opacity = 1; 
      } 
      return this.m_opacity; 
     } 
     set 
     { 
      this.m_opacity = value; 
      if (this.Parent != null) 
      { 
       Parent.Invalidate(this.Bounds, true); 
      } 
     } 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle = cp.ExStyle | 0x20; 
      return cp; 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     Graphics g = e.Graphics; 
     Rectangle bounds = new Rectangle(0, 0, this.Width - 1, this.Height - 1); 

     Color frmColor = this.Parent.BackColor; 
     Brush bckColor = default(Brush); 

     alpha = (m_opacity * 255)/100; 

     if (drag) 
     { 
      Color dragBckColor = default(Color); 

      if (BackColor != Color.Transparent) 
      { 
       int Rb = BackColor.R * alpha/255 + frmColor.R * (255 - alpha)/255; 
       int Gb = BackColor.G * alpha/255 + frmColor.G * (255 - alpha)/255; 
       int Bb = BackColor.B * alpha/255 + frmColor.B * (255 - alpha)/255; 
       dragBckColor = Color.FromArgb(Rb, Gb, Bb); 
      } 
      else 
      { 
       dragBckColor = frmColor; 
      } 

      alpha = 255; 
      bckColor = new SolidBrush(Color.FromArgb(alpha, dragBckColor)); 
     } 
     else 
     { 
      bckColor = new SolidBrush(Color.FromArgb(alpha, this.BackColor)); 
     } 

     if (this.BackColor != Color.Transparent | drag) 
     { 
      g.FillRectangle(bckColor, bounds); 
     } 

     bckColor.Dispose(); 
     g.Dispose(); 
     base.OnPaint(e); 
    } 

    protected override void OnBackColorChanged(EventArgs e) 
    { 
     if (this.Parent != null) 
     { 
      Parent.Invalidate(this.Bounds, true); 
     } 
     base.OnBackColorChanged(e); 
    } 

    protected override void OnParentBackColorChanged(EventArgs e) 
    { 
     this.Invalidate(); 
     base.OnParentBackColorChanged(e); 
    } 
} 
+0

私のためにうまくいった。 – Rob

+0

あなたのカスタムクラスをコピー&ペーストしてコンストラクタ名を変更するだけです。完璧に動作します!ありがとうございます – hasan83

+1

これは現在深刻なバグがあります。 OnPaintオーバーライドでは、e.Graphicsオブジェクトに対してDisposeを呼び出します。これは実行しないでください。渡されたGraphicsオブジェクトを破棄すると、アプリケーションがクラッシュする可能性があります。作成していない場合は、破棄しないでください。 – Tim

4

フォームを非表示にするには、Opacityプロパティを使用し、ゼロに設定する必要があります。

あなたはあなたの例で試みてきたように、コントロールを透明にしたい場合は、それはあなたが書いたコードを言う

How to: Give Your Control a Transparent Background

この記事を参照してください、コントロールのコンストラクタでなければなりません。したがって、おそらく、私はあなたのpnlSelectAreaの型から最も派生したボタンを派生したカスタムコントロールを作成する必要があると思います。そのカスタムコントロールのコンストラクタでは、そのスタイルと色を設定するコードを書くことができます。

+0

私はコントロールを見えないようにしたくありません。その内容を見えないようにして、画像のさまざまな部分にマウスを置いてそれを「選択ツール」として使用することができます –

+0

次に、その内容の不透明度を設定します。 – Maheep

+1

WPFのwinformsのBrother MaheppのOpacityプロパティはありません –

0

素晴らしい!! 私は最終的に透明な形を描くことができました。 私は私自身の透明な図形の作成を続行することができます今

protected virtual void Draw(Graphics g){ } 

右仮想メソッドの宣言

bckColor.Dispose(); 
g.Dispose(); 
base.OnPaint(e); 

前と終了時に仮想メソッド

Draw(g); 

を追加しました、グラフィックスなど。

1

他の解決策は機能しませんでした。

これは、透明なユーザーコントロールは、リストビューに追加して/のTreeViewコントロールコレクション

が、私はそれがButtonRendererを言う知っているが、それは任意のコントロールのために働く必要があります。親コントロール内

protected override void OnPaint(PaintEventArgs e) 
{ 
    ButtonRenderer.DrawParentBackground(e.Graphics, this.ClientRectangle, this); 
} 

:ユーザーコントロールで

protected override void WndProc(ref Message m) 
{ 
    if(m.Msg == 0xF) 
     foreach(Control c in this.Controls) { c.Invalidate(); c.Update(); } 

    base.WndProc(ref m); 
} 
関連する問題