我有一些图像覆盖的自定义控件,如果它们被拖离屏幕并重新打开,则图像不会正确重新绘制。我已经对这些各种控件进行了油漆覆盖,并且它们看起来工作得很好,除非它们如果在屏幕上一次又一次地拖动就不能正确绘制。任何人都知道为什么会发生这种情况和/或解决方案?
编辑:即使对话框只是简单地移动调整太快,而不是仅仅是从屏幕上取下,它们中的一些似乎也存在问题。他们开始看起来像是被自己吸引了。哪种有道理,但我无法弄清楚如何治愈它。
编辑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尝试处理屏幕外时没有任何问题。我不知道我错过了什么......
答案 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);