1

我们将在 c# .net framework 1.1 中开发的 win-form 应用程序遗留代码移植到 c# .net 3.5。

具有绘制点图并在图中的点上应用不同形状(多边形、正方形等)的功能。您可以通过使用鼠标拖动来更改应用形状的大小,当拖动形状时,某些部分变得不可见,直到我们下降到新点并且绘制速度非常慢。

你可以称之为闪烁。

此功能在 windows xp 中运行良好,在 windows 7 中适用于基本和经典主题

只有在 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]);

与应用基本主题相比,应用航空主题需要花费大量时间

4

4 回答 4

0

我认为您需要为表单对象使用双缓冲区。

this.DoubleBuffered = true;
于 2012-08-30T10:55:57.557 回答
0

好吧,我找到了解决闪烁问题的方法。只需禁用桌面组合 - 您可以在应用程序级别或操作系统级别执行此操作。

对于应用程序级别,转到exe文件->右键单击->兼容性->选中禁用桌面组合。

对于操作系统级别(和更好的视觉外观),开始->右键单击计算机->属性->高级系统设置->高级选项卡->性能设置->视觉效果->自定义->取消选中启用桌面合成。

于 2012-08-30T11:23:50.883 回答
0

“在 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);
于 2012-08-30T13:31:35.663 回答
0

很久以前我有一个类似的问题,过了一段时间终于找到了解决方案,只有在首先将对象可见性设置为 false 时才重新绘制组件。

Object.Visible = false

//redraw your components

Object.Visible = true

我不知道在你的情况下这是否可行,但值得一试!

于 2012-08-29T11:52:33.420 回答