2012-01-25 15 views
1

透明ラベルコントロールを作成しました。しかし、コントロールのテキストフィールドを更新すると、元のテキストはクリアされずに新しいテキストがペイントされます。したがって、コントロールのTextフィールドを何度か変更すると、すぐに判読できなくなります。透明ラベルコントロールが適切にリフレッシュされていません

手がかりはありますか?ありがとう!

public partial class TransLabel : Label 
{ 
    public TransLabel() 
    { 
     InitializeComponent(); 

     this.SetStyle(ControlStyles.Opaque, true); 
     this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false); 
     this.Font = new Font("Franklin Gothic Book", 12f, FontStyle.Regular); 
     this.ForeColor = Color.White; 
     this.BackColor = Color.Transparent; 
    } 

    public override string Text 
    { 
     get 
     { 
      return base.Text; 
     } 
     set 
     { 
      base.Text = value; 
      this.Invalidate(); // seems to have no effect 
      this.Refresh(); // seems to have no effect 
     } 
    } 

    protected override void OnPaintBackground(PaintEventArgs pevent) 
    { 
     //do nothing 
    } 

    protected override void OnMove(EventArgs e) 
    { 
     RecreateHandle(); 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle = 0x00000020; //WS_EX_TRANSPARENT 
      return cp; 
     } 
    } 
} 
+0

フォーム上で '.Refresh()'メソッドを呼び出すことができると思いますか?私は確かにわかりません... – psyklopz

+0

よく似ています... –

+0

メモリが提供されている場合、あなたは 'OnPaintBackground'イベントでラベルの内容を消去する必要があります。私はカスタムコントロールを作成したときに私がこれまで実行してきたことを知っていますが、私のものは透過的ではありませんでしたので、100%確実ではありません。 – CodingGorilla

答えて

1

これにあなたのTextプロパティを変更してみてください:

public override string Text { 
    get { 
    return base.Text; 
    } 
    set { 
    base.Text = value; 
    if (this.Parent != null) 
     this.Parent.Invalidate(this.Bounds, false);   
    } 
} 

のWinFormsは、透明性のための真のサポートを持っていないので、私はあなたが親コンテナを無効にするために持っていると思います。

また、コントロールを継承する場合、通常InitializeComponent()メソッドがありません。

+0

チャームのように働いた!ありがとう! –

+0

上記のコントロールは、プログレスバーのように、定期的に再描画する別のコントロールと重複しない場合にのみ正常に動作します。ラベルは消え、プログレスバーの再描画時に点滅し始めます。 – Legends

関連する問題