在从另一个问题中阅读这个答案时,我100%确定以下代码会锁定UI并且不会导致任何移动.
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 5; i++)
{
this.Left += 10;
System.Threading.Thread.Sleep(75);
this.Left -= 10;
System.Threading.Thread.Sleep(75);
}
}
Run Code Online (Sandbox Code Playgroud)
我和评论中的其他几个人说它不起作用,但OP坚持认为它确实如此,我们应该尝试.我最终创建了一个新的Winforms项目,添加了一个按钮,然后将上面的代码放在事件处理程序中进行单击,表单确实发生了变化.
当此方法阻止消息泵时表单是如何移动的,OnPaint不应该在表单上调用,也不能在其任何子控件上调用,这是如何工作的?
Han*_*ant 10
Aero做到了这一点.Windows不再直接渲染到视频帧缓冲区,它们渲染到内存中.想想"位图".然后DWM过程合成这些位图并将它们blits到缓冲区.这解决了许多窗口绘画文物,最臭名昭着的可能就是当一个窗口移动到另一个窗口时你留下的"痕迹".无论底层窗口拥有什么进程都必须赶上并重新绘制显示的像素.这需要时间和未上漆的像素可见.还允许其他特殊效果,例如当您将鼠标悬停在任务栏按钮上时可以看到的实时缩略图,只需缩小该位图的副本即可.和Aero Peek,只是该位图的投影.和Vista和Win7中的玻璃.以及在Win8中显示商店应用程序的特殊"屏幕".并且当您触摸屏幕时看到的可见标记.
并且影响此代码,窗口位置现在只是位图合成的不同位置.原始位图仍然完好无损,不需要重新绘制.
不要在XP上或关闭Aero时尝试此操作.
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |