bov*_*der 22 c# gdi+ system.drawing.imaging
我的代码枚举了一个元文件:
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
}
Run Code Online (Sandbox Code Playgroud)
我的开发机器是VirtualBoxUbuntu主机上的Windows 7 客户机.
用来工作正常的代码.但是,当我关闭Aero时,代码停止工作:ParseCallback永远不会被调用.
只有当我重新打开Aero时,ParseCallback才会再次执行.
为什么以及如何使此代码在非启用Aero的计算机上运行?
对于“为什么?”我没有完整的答案。问题,但它不起作用,因为您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);
Run Code Online (Sandbox Code Playgroud)
请注意,您还可以使用 Form 方法中的 Graphics 对象OnPaint(PaintEventArgs e),它也应该可以工作,就像此处 EnumerateMetafile 方法的官方示例代码一样:Graphics.EnumerateMetafile Method
| 归档时间: |
|
| 查看次数: |
568 次 |
| 最近记录: |