C# - Windows窗体 - 强制重新绘制,就像屏幕外窗口移动一样

404*_*und 7 c# paint winforms

这个问题有点奇怪,但我会尽力解释一切.

我无法自动执行特定的窗口重新绘制.基本上,我试图让绘制事件发生火灾,好像窗口已被移动而其中一些内容在屏幕外(因为,例如,窗口的尺寸太大而无法放在屏幕上).

我已经尝试使用Invalidate(),Update()并Refresh(),以及 this.Invalidate(new Rectangle(0, 0, Width, Height));.但没有一个产生我期待的效果.

目前,我在Paint事件中测试的情况是,当PaintEventArgs的ClipRectangle酒店Width和Height大于零都更大.启动应用程序时,以及运行所有上述方法时,后续的PaintEventArgs ClipRectangle的所有值都为零:

{ClipRectangle = {X=0,Y=0,Width=0,Height=0}}
Run Code Online (Sandbox Code Playgroud)

但是,当我手动拖动窗口(其中一些是屏幕外)并且paint事件触发时,ClipRectangle具有以下值:

{ClipRectangle = {X=0,Y=0,Width=1356,Height=1636}}
Run Code Online (Sandbox Code Playgroud)

显示的宽度和高度是窗口的完整尺寸.

我假设两种情况的不同之处在于,在后者中,因为某些窗口是屏幕外的,所以当移动到以前不在屏幕上的内容时,所有窗口都必须重新绘制; 不过,诚然,我并不完全确定这些不同案件的确切原因.不幸的是,通过我所有的疯狂,不同的尝试,我的程序只有在这些特定情况下发生Paint事件时才有效.是否有人知道有任何方法强制发生这样的事件(最好不管窗口是否实际在屏幕外)?只要它可靠地工作,我不关心解决方案是多么的hackey或怪异.

小智 2

尝试在函数中添加以下内容OnPaint:

if (e.ClipRectangle.Width < 200 || e.ClipRectangle.Height<200)
{
    this.Refresh();
}
else
{
    //your paint code
}
Run Code Online (Sandbox Code Playgroud)