6

実際には単なるパネルである単純なユーザー コントロールがあります。そのパネルをクリックすると、子ユーザー コントロールが追加されます。width = 150pxその子は、 &height = 100pxと背景色を透明に設定したもう 1 つのユーザー コントロールです。また、中央に 100 x 100 ピクセルのテキスト ボックスがあります。

この基本構造は、将来的にはノードベースのインターフェイスになり、各ボックスには接続アンカーとロジック btn またはそのようなものが含まれます。

私の問題は、パネルを数回クリックし、追加されたボックスが別のボックスと重なると、透明度が有効にならないことです。

ここにスクリーンショットがあります

ここに画像の説明を入力

どうすればその問題を解決できますか? またはそのようなものはありallowTransparencyますか?

描画の順序にも問題があり、新しく追加されたブロックは常に他のブロックの後ろにあります。

このコードを見たい場合はお知らせください。ただし、これに関連するものはないと思います。

また、ノード グラフを実装するためのより良い方法を知っている場合は、遠慮なく教えてください。

編集

次のコードは、StackOverFlow に質問を投稿することを考える前に、私が最初に試したものでした。

SetStyle(ControlStyles.SupportsTransparentBackColor, true);
MakeTransparentControls(this);

したがって、これを重複した質問と見なしたり、そのコードを回答として投稿したりしないでください

4

4 に答える 4

9

これは一般に、Windows における非常に基本的な制限です。ウィンドウは別のウィンドウに重なり、その背後にあるものを遮ります。みんなのお気に入りの答えである ControlStyles.SupportsTransparentBackColor を使用することは回避策ではありません。UserControl では既にオンになっているため、再度設定しても違いはありません。

スタイル フラグは、ウィンドウの透明度をシミュレートします。これは、ウィンドウ自体の描画方法を変更することによって行われます。最初に親にウィンドウ内に自分自身を描画して背景を提供するように要求し、次にその上に自分自身を描画します。したがって、BackColor プロパティを Color.Transparent に設定すると、親ウィンドウのピクセルが背景として表示されることが期待できます。

あなたがやる。ユーザー コントロールの親はフォームです。最初に自分自身を忠実に描画し、左右にグレーのエッジを生成します。あなたが望んでいたのは、他のユーザー コントロールのピクセルも表示することでした。しかし、それは機能しません。親に描画を要求するだけで、たまたま重なっている他のコントロールは要求しません。それは確かに不可能ではありません。ただ醜くて遅いだけです。このKB 記事は、アプローチを示しています。むしろ「醜い」モニカを強調しています。

明らかに、UserControl を改善できます。一見すると、これらの透明なエッジをパネルの左右に配置しても意味がありません。したがって、パネルの Location プロパティを (0, 0) に設定し、Dock プロパティを Fill に設定します。現在、すべてのユーザーコントロールは「ノード」にすぎず、他の「ノード」と重なっている部分を表示する必要はありません。ノード間の線を描画するには、フォームの Paint イベントを実装する必要があります。

この種の透明性が本当に必要な場合は、これを別の方法で行う必要があります。ノードごとにウィンドウを使用するという考えをあきらめる必要があります。そうする1つの方法は、それらをペイントすることです。正しい順序でこれを行うと、「背景」を見る必要がある場所を描画せずに、ペイントを重ねることによって作成された真の透明度をシミュレートすることに問題はありません。また、はるかに高速になります。コントロールは高価です。ただし、コントロールを使用することの利便性をあきらめ、代わりにコードを作成する必要があります。マウス ヒット テストなどはより複雑になります。また、テキスト ボックスが実際にラベルであると想定されていない場合 (確かにラベルであると思われますか?)、またはウィンドウをコントロールとして使用することをあきらめた GUI クラス ライブラリを使用する場合、テキスト ボックスは確実にハングアップします。WPFのように。そして、しないでください これを行うライブラリがすでにたくさんあることを忘れないでください。接続されたノードは、非常に一般的なユーザー インターフェイス パラダイムです。たとえばVisio。

于 2013-01-20T13:09:47.667 に答える
7

UserControl のコンストラクターでこれを試してください。

this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent;
于 2013-01-20T12:17:46.423 に答える
0

私のプロジェクトの 1 つで、フォームのほぼすべての子コントロールに透明な背景を設定する必要があったため、次のメソッドを作成しました。

private void MakeTransparentControls(Control parent)
{
    if (parent.Controls != null && parent.Controls.Count > 0)
    {
        foreach (Control control in parent.Controls)
        {
            if ((control is PictureBox) || (control is Label) || (control is GroupBox) || (control is CheckBox))
                control.BackColor = Color.Transparent;

            if (control.Controls != null && control.Controls.Count > 0)
                MakeTransparentControls(control);
        }
    }
}

そして、フォームのコンストラクターに次の行を追加しました。

SetStyle(ControlStyles.SupportsTransparentBackColor, true);
MakeTransparentControls(this);

独自のコンテキストでこのようなことを試すことができます。

于 2013-01-20T12:52:02.883 に答える