web-dev-qa-db-ja.com

Visual Studioウィンドウフォームのパネルで不透明度を使用するためのトリックはありますか?

私は最近Visual Studioを探索し始めました。スライドメニューを作ってみました。より具体的には、ユーザーがボタンを押すと、サブメニューが右側にポップアップします。それを達成するために、自分自身のサイズを変更するためにPanelを配置しました。機能性とは別に、もう少しデザインを追加して、Panelを少し色あせて見せたかったです。

Visual StudioのPanelsには不透明度がないことを知っていますが、それを実現する方法についてのトリックのアイデアを誰かが知っているかどうか考えていました。 Picture Boxしかし、それもプロパティとして不透明度を持っていませんでした。さらにデザインを追加したかったので、ビジュアルスタジオが提供する通常のMenuobjectの使用を避けました。何か案は?

9
Lio Chon
  1. Panel から継承するクラスを作成します。
  2. をセットする - ControlStyle.OpaqueSetStyle を使用したコンストラクタでの制御用。

Trueの場合、コントロールは不透明に描画され、背景は描画されません。

  1. CreateParams を上書きして設定 WS_EX_TRANSPARENT スタイル。

このスタイルで作成されたウィンドウを透明にすることを指定します。つまり、ウィンドウの下にあるウィンドウは、ウィンドウによって隠されません。このスタイルで作成されたウィンドウは、その下にあるすべての兄弟ウィンドウが更新された後にのみ、WM_Paintメッセージを受け取ります。

  1. 背景のアルファチャネルとして使用される0〜100の値を受け入れるOpacityプロパティを作成します。
  2. OnPaint をオーバーライドし、BrushBackGroundColorから作成されるアルファ対応Opacityを使用して背景を塗りつぶします。

完全なコード

public class ExtendedPanel : Panel
{
    private const int WS_EX_TRANSPARENT = 0x20;
    public ExtendedPanel()
    {
        SetStyle(ControlStyles.Opaque, true);
    }

    private int opacity = 50;
    [DefaultValue(50)]
    public int Opacity
    {
        get
        {
            return this.opacity;
        }
        set
        {
            if (value < 0 || value > 100)
                throw new ArgumentException("value must be between 0 and 100");
            this.opacity = value;
        }
    }
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
            return cp;
        }
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        using (var brush = new SolidBrush(Color.FromArgb(this.opacity * 255 / 100, this.BackColor)))
        {
            e.Graphics.FillRectangle(brush, this.ClientRectangle);
        }
        base.OnPaint(e);
    }
}

スクリーンショット

enter image description here

20
Reza Aghaei

コントロールを「透明」にするには、親の適切な領域をコントロールにペイントする必要があります。これは、Buttonがコンテンツを描画する前に行うことで、角の丸い部分が透明になります。

半透明を模倣するには、フォームをパネルにペイントしてから、アルファで何かを描画します。

private void panel1_Paint(object sender, PaintEventArgs e)
{
    PaintTransparentBackground(panel1, e);
    using (Brush b = new SolidBrush(Color.FromArgb(128, panel1.BackColor)))
    {
        e.Graphics.FillRectangle(b, e.ClipRectangle);
    }
}

private static void PaintTransparentBackground(Control c, PaintEventArgs e)
{
    if (c.Parent == null || !Application.RenderWithVisualStyles)
        return;

    ButtonRenderer.DrawParentBackground(e.Graphics, c.ClientRectangle, c);
}

Semi-transparent panel

ButtonRenderer.DrawParentBackgroundは、パネルと重なるフォームのコントロールをペイントせず、フォームの背景のみをペイントします。

2
György Kőszeg