为什么EnumerateMetafile仅适用于启用Aero

时间:2014-07-31 09:04:42

标签: c# gdi+ system.drawing.imaging

我的代码enumerates元文件:

private void Parse()
{
    Graphics graphics = Graphics.FromHwnd(IntPtr.Zero);
    PointF pointf = new PointF();
    graphics.EnumerateMetafile(_metafile, pointf, ParseCallback);
}

private bool ParseCallback(EmfPlusRecordType recordType, 
    int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
{
    // do stuff
}

我的开发机器是Ubuntu主机上的Windows 7 VirtualBox来宾。

用于正常工作的代码。但是,当我关闭Aero时,代码停止工作:永远不会调用ParseCallback

只有当我重新打开Aero时,ParseCallback才会再次执行。

为什么以及如何在非启用Aero的计算机上运行此代码?

1 个答案:

答案 0 :(得分:1)

我没有完整的回答"为什么?"问题,但它不起作用,因为您从Window句柄获取Graphics GDI +对象。相反,你想从GDI DC中获取它,如下所示:

private void Parse()
{
    IntPtr hdc = GetDC(IntPtr.Zero); // get entire screen dc
    Graphics graphics = Graphics.FromHdc(hdc));
    PointF pointf = new PointF();
    graphics.EnumerateMetafile(_metafile, pointf, ParseCallback);
    ReleaseDC(IntPtr.Zero, hdc);
}

[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr hWnd);

[DllImport("user32.dll")]
static extern IntPtr ReleaseDC(IntPtr hwnd, IntPtr hdc);

请注意,您也可以使用Form OnPaint(PaintEventArgs e)方法中的Graphics对象,它也可以使用,就像在此处的EnumerateMetafile方法的官方示例代码中一样:Graphics.EnumerateMetafile Method