0

画像で覆われているカスタムコントロールがいくつかありますが、それらが画面からドラッグされて再びオンになると、画像が適切に再描画されません。これらのさまざまなコントロールのペイントをオーバーライドしましたが、画面から何度もドラッグすると正しく描画されないことを除けば、正常に機能しているようです。なぜこれが起こるのか、そして/または解決策を知っている人はいますか?

編集:ダイアログが画面から外された場合だけでなく、ダイアログのサイズ変更が速すぎた場合でも、それらのいくつかに問題があるようです。彼らは自分たちの上に描かれているように見え始めます。どちらが理にかなっていますが、どうやって治すのかわかりません。

編集2:これらは4つの状態(ホバー、クリック、通常、無効)のカスタムボタンであるため、コンテナーの問題は私が考えていない問題ではないと思います。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);
    }

}

さまざまなイベントで強制的に再描画を試みました。LocationChangedとMoveを使用してサイズ変更の問題に対処し、ClientSizeChangedを使用して画面外にあるときに対処しようとしましたが、何も問題はありません。何が足りないのかわかりません...

4

1 に答える 1

3

コードスニペットを見た後、答えを完全に変更しました。バグがあります:

    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);

ここでのe.ClipRectangleの使用は正しくありません。これは、コントロールのどの部分を再描画する必要があるかに応じて、常に変化する値です。はい、コントロールのサイズを変更するか、画面から部分的にドラッグすると、最も変化します。コントロールの実際のサイズを使用する必要があります。

    rect.X = (float)((this.ClientSize.Width - Image.Size.Width) / 2.0);
    rect.Y = (float)((this.ClientSize.Height - Image.Size.Height) / 2.0);
于 2012-05-05T09:18:18.543 に答える