2012-05-05 4 views
0

私は画像で覆われているいくつかのカスタムコントロールを持っています、そして、それらが画面からドラッグされて戻ってきた場合、画像は正しく再描画されません。私はこれらのさまざまなコントロールのために塗料をオーバーライドしています。スクリーン上で何度も繰り返しドラッグされても適切に描画されない以外は、正常に動作しているようです。なぜこれが起こるのか、そして/または解決策を知っている人は誰ですか?オフスクリーン/隠蔽後にカスタムコントロールで再描画をトリガーしますか?

編集:ダイアログがスクリーンから外れてしまっただけではなく、サイズ変更が速すぎる場合でも、いくつかの問題があるようです。彼らは彼ら自身の上に描かれたように見える。どのような意味があるのですが、私はそれを治す方法を理解できません。

編集2:これらはfourstates(ホバー、クリックし、通常、使用不可)とカスタムボタンですので、私は、コンテナの事は、私は考えていない問題ではないと思いますか..? OnPaintコードは次のとおりです。



private void CQPButton_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.Clear(BackColor); 

    if (BackgroundImage != null) 
     e.Graphics.DrawImage(BackgroundImage, e.ClipRectangle); 

    if (Image != null) 
    { 
     RectangleF rect = new RectangleF(); 
     rect.X = (float)((e.ClipRectangle.Width - Image.Size.Width)/2.0); 
     rect.Y = (float)((e.ClipRectangle.Height - Image.Size.Height)/2.0); 
     rect.Width = Image.Width; 
     rect.Height = Image.Height; 
     e.Graphics.DrawImage(Image, rect); 
    } 

    if (Text != null) 
    { 
     SizeF size = e.Graphics.MeasureString(this.Text, this.Font); 

     // Center the text inside the client area of the PictureButton. 
     e.Graphics.DrawString(this.Text, 
      this.Font, 
      new SolidBrush(this.ForeColor), 
      (this.ClientSize.Width - size.Width)/2, 
      (this.ClientSize.Height - size.Height)/2); 
    } 

} 

私は、試してみて、彼らが画面から外れているときに対処するためにClientSizeChanged様々なイベント、LocationChangedに再描画し、試してみて、リサイズの問題に対処するために移動し強制的に試してみた、と何もありませんこだわり。私は何が欠けているのか分かりません...

+0

:あなたはあなたのコントロールの実際サイズを使用する必要があります。 –

+0

@ JohnArlen - OnPaintイベントと少し詳しい説明を追加しました。 – trycatch

答えて

3

私はコードスニペットを見た後、私の答えを完全に変更しました。それはバグがありますe.ClipRectangleを使用して

RectangleF rect = new RectangleF(); 
    rect.X = (float)((e.ClipRectangle.Width - Image.Size.Width)/2.0); 
    rect.Y = (float)((e.ClipRectangle.Height - Image.Size.Height)/2.0); 

は、それが再描画される制御ニーズのどの部分に応じて、常に変化する値である、ここで間違っています。そして、コントロールのサイズを変更したり、部分的に画面からドラッグしたりすると、ほとんどの変更が適用されます。それはあなたのレンダリングコードの関連するスニペットを見るために役立つかもしれない

rect.X = (float)((this.ClientSize.Width - Image.Size.Width)/2.0); 
    rect.Y = (float)((this.ClientSize.Height - Image.Size.Height)/2.0); 
+0

私の答えをOnPaintコードで編集しました。残念ながら、これらはコンテナではなく、ボタンです。私はそれをもう少し編集で説明しました。 – trycatch

+0

回答が書き換えられました。今後の質問にコードスニペットを投稿してください。 –

+0

バー、それだった!どのように私はそれを考えなかったのか分からない! – trycatch

関連する問題