22

我的代码枚举了一个元文件:

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 7VirtualBox来宾。

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

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

为什么以及如何使此代码在不支持 Aero 的机器上工作?

4

1 回答 1

1

对于“为什么?”,我没有完整的答案。问题,但它不起作用,因为您Graphics从 Window 句柄获取 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);

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

于 2015-03-26T10:21:47.890 回答