在屏幕外/模糊后触发自定义控件重绘?

时间:2012-05-05 03:19:55

标签: winforms custom-controls repaint

我有一些图像覆盖的自定义控件,如果它们被拖离屏幕并重新打开,则图像不会正确重新绘制。我已经对这些各种控件进行了油漆覆盖,并且它们看起来工作得很好,除非它们如果在屏幕上一次又一次地拖动就不能正确绘制。任何人都知道为什么会发生这种情况和/或解决方案?

编辑:即使对话框只是简单地移动调整太快,而不是仅仅是从屏幕上取下,它们中的一些似乎也存在问题。他们开始看起来像是被自己吸引了。哪种有道理,但我无法弄清楚如何治愈它。

编辑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);
    }

}

我已尝试强制重新绘制各种事件,LocationChanged和Move尝试处理调整大小问题,ClientSizeChanged尝试处理屏幕外时没有任何问题。我不知道我错过了什么......

1 个答案:

答案 0 :(得分: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);