在windows7航空主题的点图中闪烁



我们将在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);

相关内容

  • 没有找到相关文章

最新更新