禁用GDI“;“硬件加速”;在WinForms MDI中使用Aero加速

禁用GDI“;“硬件加速”;在WinForms MDI中使用Aero加速,winforms,gdi,mdi,hardware-acceleration,aero,Winforms,Gdi,Mdi,Hardware Acceleration,Aero,如果启用Aero,则MDI应用程序的运行速度比Windows Vista慢得多。移动MDI窗口似乎明显滞后,重新绘制速度非常慢 自从WindowsVista以来,GDI不再是硬件加速,以简化新的图形驱动程序模型。如果禁用Aero(在Windows 8中无法再禁用Aero),它的速度将与Windows XP中的速度一样快 使用Microsoft Application Compatibility Administrator,可以设置“NoGdiHwAcceleration”标志,即使启用Aero,

如果启用Aero,则MDI应用程序的运行速度比Windows Vista慢得多。移动MDI窗口似乎明显滞后,重新绘制速度非常慢

自从WindowsVista以来,GDI不再是硬件加速,以简化新的图形驱动程序模型。如果禁用Aero(在Windows 8中无法再禁用Aero),它的速度将与Windows XP中的速度一样快

使用Microsoft Application Compatibility Administrator,可以设置“NoGdiHwAcceleration”标志,即使启用Aero,也可以恢复MDI应用程序的速度

但是,没有说明如何以编程方式禁用此加速,或者此兼容性标志是否可以由代码触发

有人知道怎么做吗?

你试过使用和/或吗?但是,在应用程序退出或重新更改之前,这似乎会完全禁用Aero


另外,还有一种方法使您看起来可以在.net 3.5 SP1及更高版本中根据windows切换到SW渲染。

我实际上可以使用另一种更直接的.net方法来解决MDI性能缓慢的问题,而不需要任何兼容性标志

诀窍是在
MdiClient
控件(承载MDI窗口的容器)上强制使用双缓冲

父窗体上的
MdiClient
实例可以通过迭代其所有控件并检查其类型来检索

// Retrieve the MDI client control on this parent window.
MdiClient mdiClient = null;
foreach (Control control in Controls)
{
    mdiClient = control as MdiClient;
    if (mdiClient != null)
    {
        break;
    }
}
实际上,只有通过调用受保护的方法
SetStyle
才能强制双缓冲,因此我们必须使用反射从外部调用它。这看起来非常安全,因为自.NET 1.1以来,
SetStyle
一直可用,并且从那时起没有改变

// Force double buffering on it by calling the protected SetStyle method via reflection.
MethodInfo setStyleMethod = typeof(MdiClient).GetMethod("SetStyle",
    BindingFlags.NonPublic | BindingFlags.Instance)
setStyleMethod.Invoke(mdiClient, object[] {
    ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw,
    true });
性能现在与没有任何自定义图形时一样好

由于
ControlStyles.ResizeRedraw
参数,当表单大小改变时,整个背景将被重新绘制,如果您计划绘制渐变背景,这将非常有用。只需在
MdiClient
实例上使用
Paint
事件,然后在那里进行绘图

这也使得首先在位图上绘制所有不需要的东西的方法成为可能,因为双缓冲已经在内部完成了这项工作——消除了沿途的闪烁


您可能需要解决的唯一问题是在滚动
MdiClient
时(当窗口位于可见区域之外时)重新绘制背景。这不会导致
绘制事件。这需要更多的代码,请参考以下答案:

Aero dwmapi方法在这里没有帮助,因为它们只是将glass扩展到客户端区域。此外,EnableComposition自Win8起不再有效,它还将禁用整个Aero接口系统范围,这不是我想要的。你提到的硬件加速与WPF有关,而不是WinForms和GDI。哦,你在问题中提到了windows 8,但我不知道你在使用它。如果是这样的话,那么我认为这是不可能的。是的,我不喜欢应用程序从一开始就禁用Windows7/Vista中的Aero:D