0

パネルがあり、その上にピクチャーボックスがあります。パネルに表示するラベルは約20個あります。ラベルの背景を透明にしたい。つまり、画像ボックス内の画像が表示され、ラベルにはテキストのみが表示されます。ラベルは真の透明度を示さないため、ラベルをpictureboxの子にしました

 this.lbl1.Parent = pictureBox1;

これで当面の問題は解決しましたが、フォームが読み込まれると、すべてのラベルが表示されるまでに時間がかかり、一度に1つずつ表示されます。皆さんがこれに対する解決策を与えることができれば幸いです。

前もって感謝します

4

3 に答える 3

4

ちらつきの標準的な解決策は、ダブル バッファリングです。しかし、それではこの種のちらつきは解決できません。これは、複数のウィンドウが互いに重なっているために発生する別の種類です。各ラベルは独自のウィンドウです。フォームがそれ自体を描画する必要がある場合、子ウィンドウ用の穴を残して背景を描画します。次に、各子ウィンドウが順番に自分自身を描画します。そして、その子ウィンドウが次に自分自身を描画します。など。

これは、1 つのコントロールの描画に時間がかかる場合に顕著になります。間違いなく、ピクチャ ボックスです。特に、サイズ変更が必要な大きな画像を表示する場合。ピクチャ ボックスが描画されている間、子ウィンドウの穴はペイントされないままです。フォームの TransparencyKey または Opacity プロパティを使用すると、背景が白になり、黒になります。これは、画像ボックス内の画像とは対照的であり、ユーザーはその効果をちらつきとして認識します。

応急処置の 1 つは、コントロールを使用しないことです。ラベルは非常に便利ですが、文字列を表示するためだけにウィンドウを焼き尽くすのは、システム リソースを大量に浪費します。ピクチャ ボックスの Paint イベントを実装し、TextRenderer.DrawText() で文字列を描画するだけです。PictureBox では、デフォルトでダブル バッファリングがオンになっているため、画像とテキストが完全にスムーズに描画され、ちらつきがなくなります。明らかな欠点は、ポイント アンド クリックの利便性が失われ、コードを記述しなければならないことです。

可能な他の修正があります。それらの 1 つは、ピクチャ ボックスが子ウィンドウ用の穴を残さないようにすることです。画像全体が描画され、ラベルがその上に表示されます。それはまだちらつきがありますが、それほど目立ちません. プロジェクトに新しいクラスを追加し、次のコードを貼り付けます。

using System;
using System.Windows.Forms;

internal class MyPictureBox : PictureBox {
    protected override CreateParams CreateParams {
        get {
            var parms = base.CreateParams;
            parms.Style &= ~0x02000000;  // Turn off WS_CLIPCHILDREN
            return parms;
        }
    }
}

新しいピクチャ ボックス コントロールをコンパイルし、ツールボックスの上部からフォームにドロップします。

もう 1 つの可能な回避策は、フォームとそのすべての子をダブル バッファリングすることです。これは描画をまったくスピードアップしませんが、すべてのウィンドウがメモリ バッファにレンダリングされ、結果が画面にブリットされます。遅延に気付くでしょうが、ウィンドウが突然画面に表示されます。これを合成と呼びます。副作用がある可能性があるため、Winforms はこれを直接サポートしていませんが、有効にするのは簡単です。このコードをフォーム クラスに貼り付けます。

protected override CreateParams CreateParams {
    get {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
        return cp;
    }
} 

XP以降で対応。アーティファクトの描画に注意してください。

于 2011-07-08T13:18:29.440 に答える
1

または、ラベルを捨てて自分でテキストを描くこともできます:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
  TextRenderer.DrawText(e.Graphics, "Label1", SystemFonts.DefaultFont,
                        new Point(10, 10), Color.Black, Color.Empty);
}
于 2011-07-08T12:59:42.797 に答える
0

ラベルは透明度をサポートしていません。独自のカスタム コントロールを作成する必要があります。これらのコード例を参照してください。

http://www.codeproject.com/KB/dotnet/transparent_controls_net.aspx http://www.codeproject.com/KB/vb/uLabelX.aspx

さよなら

于 2011-07-08T12:51:03.930 に答える