webdevqa.jp.net

WinFormsでパネルの不透明度または透明度を設定するにはどうすればよいですか?

フォーム全体ではなく、パネルだけで、C#のパネルの透明度を変更または変更する方法を知りたいと思っていました。パネルでのみ可能になる方法を探しています。ありがとうございました!

43
Gian Santillan

はい、不透明度はトップレベルのウィンドウでのみ機能します。 Panelなどの子ウィンドウをサポートしないビデオアダプターのハードウェア機能を使用します。 Winformsで唯一のトップレベルのControl派生クラスはFormです。

ただし、ネイティブのWindowsコントロールにジョブを実行させる代わりに独自のペイントを行う「純粋な」Winformコントロールのいくつかは、透明なBackColorをサポートします。パネルもその1つです。トリックを使用し、親に自分自身を描画して背景ピクセルを生成するように要求します。このトリックの副作用の1つは、オーバーラップコントロールが機能しないことです。オーバーラップコントロールではなく、親ピクセルのみが表示されます。

このサンプルフォームは、作業中の様子を示しています。

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        this.BackColor = Color.White;
        panel1.BackColor = Color.FromArgb(25, Color.Black);
    }
    protected override void OnPaint(PaintEventArgs e) {
        e.Graphics.DrawLine(Pens.Yellow, 0, 0, 100, 100);
    }
}

それで十分でない場合は、フォームを互いに積み重ねることを検討する必要があります。 これと同じ

おそらく注目すべきは、Windows 8でこの制限が解除されたことです。ビデオアダプターオーバーレイ機能を使用しなくなり、DWM(別名Aero)をオフにすることはできなくなりました。これにより、子ウィンドウの不透明度/透明度を実装しやすくなります。これに頼るのはもちろん、しばらくは未来の音楽です。 Windows 7は次のXP :)

35
Hans Passant

まだ完全に透明なパネルを探している人のために、私は William Smashによるこのブログ から順番に取った T#ブログのTobias Hertkorn でニースのソリューションを見つけました。ここに答えとして投稿する価値があると思いました。

C#コード:

public class TransparentPanel : Panel
{
    protected override CreateParams CreateParams 
    {            
        get {
            CreateParams cp =  base.CreateParams;
            cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
            return cp;
            }
    }
    protected override void OnPaintBackground(PaintEventArgs e) 
    {
        //base.OnPaintBackground(e);
    }
}

VB.Netコード:

Public Class TransparentPanel
Inherits Panel
    Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
        Get
            Dim cp As CreateParams = MyBase.CreateParams
            cp.ExStyle = cp.ExStyle Or &H20 ''#WS_EX_TRANSPARENT
            Return cp
        End Get
    End Property
    Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs)
    ''#MyBase.OnPaintBackground(e)
    End Sub
End Class
40

http://www.windows-tech.info/3/53ee08e46d9cb138.php にある情報に基づいて、次のコードを使用して半透明のパネルコントロールを実現できました。

public class TransparentPanel : Panel
{
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
            return cp;
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.FillRectangle(new SolidBrush(this.BackColor), this.ClientRectangle);
    }
}

警告は、パネルに追加されたコントロールには不透明な背景があることです。それにもかかわらず、ユーザーがアプリケーションの適切な領域に移動するように、WinFormsアプリケーションの一部をブロックするには半透明のパネルが役に立ちました。

12
Brian Hasden

フォームコンストラクターでパネルを動的に作成するときは、忘れずにパネルを前面に移動してください。タブコントロールの透明パネルオーバーレイの例。

panel1 = new TransparentPanel();
panel1.BackColor = System.Drawing.Color.Transparent;
panel1.Location = new System.Drawing.Point(0, 0);
panel1.Name = "panel1";
panel1.Size = new System.Drawing.Size(717, 92);
panel1.TabIndex = 0;
tab2.Controls.Add(panel1);
panel1.BringToFront(); 

// <==それ以外の場合、他のコントロールは透明パネルの上にペイントします

4
Bill Moore

これを試して:

panel1.BackColor = Color.FromArgb(100, 88, 44, 55);

alpha(A)を変更して、必要な不透明度を取得します。

3
Dark Knight

私の知る限り、パネルは透明色のみを持つことができますが、パネルの不透明度を制御することはできません。そのため、パネルの一部を完全に透明にすることはできますが、50%が何かを言うことはできません。

透明度を使用するには、透明色プロパティを定義する必要があります。

William Smashソリューションに追加したかったのは、彼のブログにアクセスできなかったため、単純な質問に対する答えが見つからなかったためです。

実現するのにしばらく時間がかかりましたが、たぶん一瞬だけでした...

まだ行う必要がない場合は、プロジェクトプロパティにSystem.Windows.Formsへの参照を追加する必要があります。

また、追加する必要があります

Imports System.Windows.Forms 

オーバーライドクラスを追加するファイルに。

OnPaintBackgroundの場合、System.Drawingの参照を追加する必要があります

Imports System.Drawing.Printing.PrintEventArgs
0
Dan

いくつかのコメントはそれが機能すると言い、いくつかは機能しないと言っています。それはあなたのformバックグラウンドに対してのみ機能し、背後にある他のcontrolsに対しては機能しません。

0
Ahmed Taha