作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我的代码 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
guest 。
代码过去工作正常。但是,当我关闭 Aero 时,代码停止工作:永远不会调用 ParseCallback
。
只有当我重新打开 Aero 时,ParseCallback
才会再次执行。
为什么以及如何使此代码在不支持 Aero 的机器上运行?
最佳答案
对于“为什么?”我没有完整的答案。问题,但它不起作用,因为您从 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
关于c# - 为什么 EnumerateMetafile 只能在启用 Aero 的情况下使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25054882/
我的代码 enumerates图元文件: private void Parse() { Graphics graphics = Graphics.FromHwnd(IntPtr.Zero);
我是一名优秀的程序员,十分优秀!