2011-07-08 5 views
0

私はパネルを持っていて、それにピクチャボックスを持っています。パネルには約20個のラベルがあります。私は、ラベルの背景を透明にしたい、つまり画像ボックスの画像が表示され、ラベルにはテキストだけが表示されます。ラベルは真の透明性を示さないので、これは私の当面の問題を解決したが、現在はフォームがロードは、すべてのラベルにはしばらく時間がかかる際に見えるようになりとでそのいずれかを実行するためにロード時にちらつきのないラベルを透明にする方法

this.lbl1.Parent = pictureBox1; 

は、今私は、ピクチャボックスのラベルの子を作りました時間。皆さんがこれに対していくつかの解決策を提供できるのであれば、私は感謝しています。事前

答えて

1

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

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    TextRenderer.DrawText(e.Graphics, "Label1", SystemFonts.DefaultFont, 
         new Point(10, 10), Color.Black, Color.Empty); 
} 
+0

有望です! – Arcturus

+0

値が変更されないラベルに対しては正常に動作しますが、一部のラベルには定期的に更新される値があります。ペイントイベント内でTextRendererを使用すると、値はどのように更新されますか? – Arcturus

+0

@Arcturus call pictureBox.Invalidate() – LarsTech

0

おかげラベルは、透明性をサポートしていない、あなたがあなた自身のユニークなカスタムコントロールを作成する必要があり、あなたは、これらのコード例を見ることができます。

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

さようなら

4

フリッカーの標準的な治療法はダブルバッファリングです。しかし、それはこの種のちらつきを解決することはできません。それは、互いに重なり合う複数のウィンドウを有することによって引き起こされる異なる種類である。各ラベルは独自のウィンドウです。フォームが自身をペイントする必要があるとき、フォームはバックグラウンドを描画して、子ウィンドウのための穴を残します。それぞれの子ウィンドウはそれから順番に描画を行います。そして、その子ウインドウは自分自身を引き出します。 Etcetera。

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

すぐに解決できるのは、コントロールを使用しないために窓口に支払いをしないことです。ラベルは非常に便利ですが、単に文字列を表示するためにウィンドウを焼くのはシステムリソースの大量な浪費です。ピクチャボックスの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; 
     } 
    } 
} 

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

さらに別の回避策として、フォームとそのすべての子をダブルバッファリングすることがあります。これはペイント全体をスピードアップするわけではなく、すべてのウィンドウがメモリバッファにレンダリングされ、結果が画面にブリットされます。遅れがあるのが分かりますが、ウィンドウが突然画面に表示されます。これを合成といいます。 Winformsはこれを直接サポートしていませんが、副作用がある可能性がありますが、有効にするのは簡単です。このコードをフォームクラスに貼り付けます。

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

XP以降でサポートされています。ペインティングアーチファクトに注意してください。

+0

かなり包括的な答え。時間をとっていただきありがとうございます。ダブルバッファリングは、フォームを表示するにはあまりにも多くの時間がかかり、フォーム上のDataGridなどの表示を上書きします。カスタムのピクチャボックスソリューションは穴の問題を解消し、ラベルは素早く来ましたが、私はTextRendererソリューションを使用します。 – Arcturus

関連する問題