我们将在c#.net框架1.1中开发的win-form应用程序遗留代码移植到c#.net 3.5。
有绘制点图的功能,并在图中的点上应用不同的形状(多边形、正方形等)。您可以通过使用鼠标拖动来更改应用形状的大小。当拖动形状时,某些部分将不可见,直到我们下降到新的点,并且绘制速度非常慢。
你可以称之为闪烁。
该功能在windowsxp中运行良好,在windows7中运行良好基本和经典主题
只有在windows 7 中应用航空主题时,它才会闪烁
我试过了http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/aaed00ce-4bc9-424e-8c05-c30213171c2c和在Windows窗体应用程序中闪烁
他们都没帮上忙。
在时间戳执行时间后,我发现
for (int i=0; i < arraypnts.Length - 1; i++) {
g.DrawLine(Pens.Black, arraypnts[i], arraypnts[i+1]);
}
// draw the last line
g.DrawLine(Pens.Black, arraypnts[0], arraypnts[arraypnts.Length-1]);
与应用基本主题相比,应用aero主题需要花费大量时间
我很久以前也遇到过类似的问题,过了一段时间,我终于找到了解决方案,只在将Object可见性设置为false时才重新绘制组件。
Object.Visible = false
//redraw your components
Object.Visible = true
我不知道这在你的情况下是否可行,但值得一试!
我认为您需要为表单对象使用双缓冲区。
this.DoubleBuffered = true;
我找到了解决闪烁问题的方法。只需禁用桌面组合——您可以在应用程序级别或操作系统级别执行它。
对于应用程序级别,请转到exe文件->右键单击->兼容性->检查禁用桌面合成。
对于操作系统级别(以及更好的视觉外观),开始->右键单击计算机->属性->高级系统设置->高级选项卡->性能设置->视觉效果->自定义->取消选中启用桌面构图。
"在Aero关闭的情况下运行良好"……听起来像是一个追索权问题…。你在绘画活动中画画吗?如果没有,您从哪里获得图形对象?你可以通过编程禁用桌面合成,我需要它来完成一些项目…但与绘图无关…
[DllImport("dwmapi.dll")]
private static extern int DwmIsCompositionEnabled(ref bool enabled);
const uint DWM_EC_DISABLECOMPOSITION = 0;
const uint DWM_EC_ENABLECOMPOSITION = 1;
[DllImport("dwmapi.dll", EntryPoint = "DwmEnableComposition")]
private static extern uint DwmEnableComposition(uint compositionAction);
用法:
DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);