c# gdi+ system.drawing.imaging

c# - ¿Por qué EnumerateMetafile solo funciona con Aero habilitado?



gdi+ system.drawing.imaging (1)

No tengo una respuesta completa al "¿por qué?" Pregunta, pero no funciona porque está obteniendo el objeto Graphics GDI + del manejador de la ventana. En su lugar, desea obtenerlo de un DC de GDI, como este:

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);

Tenga en cuenta que también puede usar el objeto Graphics desde el OnPaint(PaintEventArgs e) Form OnPaint(PaintEventArgs e) , también debería funcionar, como en el código de muestra oficial para el método EnumerateMetafile aquí: Graphics.EnumerateMetafile Method

Mi código enumerates un metarchivo:

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 }

Mi máquina de desarrollo es Windows 7 VirtualBox guest en el host de Ubuntu.

El código solía funcionar bien. Sin embargo, cuando ParseCallback Aero, el código dejó de funcionar: nunca se llamaría el ParseCallback .

Solo cuando volví a encender Aero, ParseCallback se ejecutó de nuevo.

¿Por qué y cómo puedo hacer que este código funcione en máquinas no habilitadas para Aero?