web-dev-qa-db-ja.com

winformsの透明な背景?

ウィンドウを透明にしたかったので、枠、コントロール、フォームボックスのみを残してすべてを削除し、BackColorとTransparencyKeyを透明にしようとしましたが、BackColorは透明色を受け入れないためうまくいきませんでした。周辺を検索した後、私はmsdnでこれを見つけました:

SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent;
this.TransparencyKey = BackColor;

不幸なことに、それもうまくいきませんでした。灰色またはその他の選択した色の背景が表示されます。

私がやりたかったのは、ウィンドウを透明にして、あたかも自分のウィンドウフォームのように振る舞う背景画像を使用できるようにすることだけです。

私はここで検索し、私が探しているものではない不透明度に関する多くのトピックを見、また私が試みていたこの方法に関していくつかを見ましたが、まだ答えが見つかりませんでした。

誰もが私の道を照らすことを願っています。

更新:

問題が解決したため、画像は削除されました

38
Prix

私が以前に使用した方法は、BackColorにワイルドカラー(彼らの正しい心の誰もが使用しない色)を使用し、透明度キーをそれに設定することです。

this.BackColor = Color.LimeGreen;
this.TransparencyKey = Color.LimeGreen;
66
Joel Etherton

Windowsフォームで透明な背景を取得する簡単な解決策は、次のようにOnPaintBackgroundメソッドを上書きすることです。

_protected override void OnPaintBackground(PaintEventArgs e)
{
    //empty implementation
}
_

base.OnpaintBackground(e)が関数から削除されることに注意してください)

21

ここに私の解決策がありました:

コンストラクターに次の2行を追加します。

        this.BackColor = Color.LimeGreen;
        this.TransparencyKey = Color.LimeGreen;

フォームに次のメソッドを追加します。

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        e.Graphics.FillRectangle(Brushes.LimeGreen, e.ClipRectangle);
    }

このフォームはフレーム内で完全に透明であるだけでなく、クリックすることもできます。ただし、イメージを描画し、フォームをどこにでもドラッグしてカスタム形状のフォームを作成できると便利です。

7
AyrA

上記のソリューション(および)他の投稿からの他の多くのソリューションを試しました。

私の場合、次のセットアップでそれを行いました。

public partial class WaitingDialog : Form
{
    public WaitingDialog()
    {
        InitializeComponent();

        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.BackColor = Color.Transparent;

        // Other stuff
    }

    protected override void OnPaintBackground(PaintEventArgs e) { /* Ignore */ }
}

ご覧のとおり、これは以前に与えられた回答の組み合わせです。

6
Joel

私の解決策は、極端に Joelの(Ethertonではなく、単なるJoel)に近かった:

public partial class WaitingDialog : Form
{
    public WaitingDialog()
    {
        InitializeComponent();

        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.BackColor = Color.Transparent;
        this.TransparencyKey = Color.Transparent; // I had to add this to get it to work.

        // Other stuff
    }

    protected override void OnPaintBackground(PaintEventArgs e) { /* Ignore */ }
}
4
roncli

私はこれをほぼすべて試しました。それでも動作しませんでした。最後に、24ビットマップの問題が原因であることがわかりました。 24ビット未満のビットマップを試した場合。上記のメソッドのほとんどは動作するはずです。

2
Zhi

VS2013で「透明な」背景色でスプラッシュスクリーン(32bpp BGRA)を描画し、表示用のフォームにpictureBoxを配置しました。私にとっては、上記の回答の組み合わせが機能しました:

    public Form1()
    {
        InitializeComponent();

        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.BackColor = this.pictureBox1.BackColor;
        this.TransparencyKey = this.pictureBox1.BackColor;
    }

すべての場所で同じBackColorを使用し、その色をTransparencyKeyとして設定してください。

2
MaLe

私にとって有効なのは、.pngの実際の機能の代わりに特定の色を使用して透明度を表すことです。

したがって、できることは背景画像を取得し、透明な領域を特定の色でペイントすることです(マゼンタは常に私にとって適切だと思われました...)。

画像をフォームのBackgrounImageプロパティとして設定し、色をフォームのTransparencyKeyとして設定します。コントロールのスタイルを変更する必要も、BackColorも必要ありません。

私は今それを試してみましたが、うまくいきました...

1
Ran