Подтвердить что ты не робот

Почему EnumerateMetafile работает только с включенным Aero

Мой код перечисляет метафайл:

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
}

Моя машина разработки - это Windows 7 VirtualBox гость на хосте Ubuntu.

Код, используемый для работы. Однако, когда я выключил Aero, код переставал работать: ParseCallback никогда не будет вызываться.

Только когда я снова включил Aero, ParseCallback снова был выполнен.

Почему и как я могу заставить этот код работать на машинах, не поддерживающих Aero?

4b9b3361

Ответ 1

У меня нет полного ответа на вопрос "почему?". вопрос, но он не работает, потому что вы получаете объект Graphics GDI + из дескриптора Window. Вместо этого вы хотите получить его из 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);

Обратите внимание, что вы также можете использовать объект Graphics из метода Form OnPaint(PaintEventArgs e), он также должен работать, как в официальном примере кода для метода EnumerateMetafile: Graphics.EnumerateMetafile Method