2

明らかな何かが欠けているに違いないと思いますが、数時間検索してもこれを見つけることができません。PictureBoxまたは他のコントロールを使用して、部分的に透明/アルファブレンドされたピクセルを含む画像を含め、それを別の画像の上に配置して、その下の画像に基づいてブレンドする方法はありませんか?

たとえば、これは私が望む結果を生み出します:

  1. フォームにパネルを配置します。
  2. OnPaintハンドラーを追加します。
  3. OnPaintハンドラーで1つのPNGを描画してから、両方にGraphics.DrawImageを使用して、その上に別のPNGを描画します。

これはしません:

  1. PictureBoxをフォームに配置し、PNGに設定します。

  2. フォームに別のPictureBoxを配置し、PNGに設定します。

  3. 2番目の画像ボックスを最初の画像ボックスの上に置きます。

... 2番目の画像ボックスが空で、背景色が透明であっても、その下の画像を覆っています。

私はこれがすべてのwinformコントロールがウィンドウであることに由来することを読んだので、本質的にそれらは透過的ではありません。

...しかし、私が移行している15年前のプラットフォームであるBorlandのVCLでさえ、いくつかのウィンドウレスコントロールを備えていたため、WinFormをイメージングするのは難しいので、少なくとも簡単な解決策はありませんか?

上記の私の最初の例は1つの答えですが、1つの大きなパネルしか使用できず、その中にすべての「コントロール」を描画できる場合は、多くの作業が追加されます。別々のマウスイベントなどで別々のコントロールを使用できると、はるかに便利です。画像コントロールではなく、自分で描画する必要があるコントロールであっても、各コントロールに1つの画像を配置できる限り、それで問題ありません。VCLでは、これを「ペイントボックス」と呼んでいました。これは、フォーム上に配置して、好きなように描画できる長方形の領域です。独自のマウスイベント、バウンドなどがあります。何も描画しないと、マウスイベントが発生することを除けば、そこにも存在しない(100%透明)ように見えるので、「ホット」として使用できます。スポット」または「ターゲット」も同様です。

4

2 に答える 2

7

PictureBoxコントロールは透明度を適切にサポートし、BackColorプロパティをTransparentに設定するだけです。これにより、親のピクセルが背景として表示されます。

摩擦は、デザイナーが2番目の画像ボックスを1番目の画像ボックスの子にすることを許可しないことです。必要なのは、コンストラクターで親を再設定するためのほんの少しのコードです。そして、それは親からの相対的なものであるため、新しい場所を指定します。このような:

    public Form1() {
        InitializeComponent();
        pictureBox1.Controls.Add(pictureBox2);
        pictureBox2.Location = new Point(0, 0);
        pictureBox2.BackColor = Color.Transparent;
    }

ところでOnPaint()を使用することを躊躇しないでください。

于 2012-05-04T20:34:36.993 に答える
1

申し訳ありませんが、これを見つけました...以前行っていた検索の代わりに「winformstransparent panel」をグーグルで検索すると、TransPictureBoxのサンプルショーは私が必要としていることを正確に実行しているようです。

C#での重複したPictureBoxによる透明性の問題

それには2つの部分があるように見えます:

  1. ウィンドウスタイルにWS_EX_TRANSPARENTを設定します

  2. 「背景の描画」メソッドをオーバーライドします(または、オプションでコントロールスタイルを不透明にすることができます)。

于 2012-05-04T20:20:38.030 に答える