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?