О GDI/GDI + координируют совместимость?

У меня есть проблема при рисовании и с GDI и с GDI + попеременно. Преобразование страницы — в особенности масштабирующийся — кажется, немного выключено между двумя. Кроме каких свойств контекста GDI влияет на масштабирование вывода SetViewportExt и SetWindowExt?

Код использует почти исключительно GDI для своего рисунка, но использование GDI + в нескольких случаях, где его функции (полупрозрачность) необходимы. Это использует SetViewportExt, SetWindowExt и SetViewportOrg позволять масштабировать и прокрутить.

Когда GDI + необходим, я создаю a Gdiplus::Graphics объект вокруг HDC и делает рисунок. Я предполагаю, что это заставляет графический контекст перенести контекст устройства и передать его рендеринг к контексту устройства. Если я извлекаю матрицу преобразования GDI + графический контекст, я вижу, что это - единичная матрица, таким образом, масштабирование сделано в другом месте (в контексте устройства, я предполагаю).

Я создал простой тест, где я тяну тот же массив прямоугольников с GDI и GDI +, чтобы быть уверенным, что все преобразования являются тем же в обоих случаях. Фрагмент кода следует:

CRect rect = ...;

// Draw the rectangle using GDI
CPen cpen(PS_DASH, 0, RGB(0,0,255));
pDC->SelectObject(&cpen);
pDC->Rectangle(rect);

{
    // Draw the rectangle using GDI+
    Gdiplus::Graphics graphics(pDC->m_hDC);

    Gdiplus::Pen pen(Gdiplus::Color(180,180,180));
    graphics.DrawRectangle(
        &pen,
        Gdiplus::Rect(rect.left, rect.top, rect.Width(), rect.Height()));
}

И результат здесь: (подчеркнутый штриховой линией синий оттянут GDI, и серый оттянут GDI +),

Result drawn by code

Я могу ясно видеть, что эти две системы координат отличаются. Я ожидал некоторые ошибки округления, но не ошибку масштабирования, как замечено здесь. Кроме того, когда я изменяю коэффициент масштабирования, GDI + переходы приблизительно ±4 пикселя в обоих направлениях в зависимости от масштабирования. Это также выделяется в снимке экрана как GDI +, прямоугольник имеет положительное смещение на оси X и отрицательное смещение на оси Y по сравнению с прямоугольником GDI.

  • Кто-либо знает то, что продолжается здесь?

  • Как я пошел бы об исследовании/отладке этого? Это происходит в кишечнике окон, таким образом, я, к сожалению, не могу отладить его.

Для ссылки это - то, на что похожа моя область просмотра/окно org/ext:

Window Ext: (134000, 80500)
Window Org: (0, 0)
Viewport Ext: (1452 872)
Viewport Org: (35 35)

Обновление:

Я решил проблему, но это не симпатично. Основной подход:

  1. Возьмите две координаты (источник, и вторая соответствующая точка) на экране располагают с интервалами и преобразовывают их к логическим координатам с помощью GDI (DPtoLP функция).

  2. Сбросьте преобразование GDI к MM_TEXT.

  3. Используйте преобразованные точки для построения матрицы преобразования для GDI +, которые представляют то же преобразование

  4. И наконец используйте эту матрицу для построения GDI + контекст с корректным преобразованием.

Это - определенный взлом, но он работает. Я все еще не знаю, почему существует различие между этими двумя, все же. По крайней мере, это идет, чтобы показать, что возможно иметь GDI +, контекст подражает преобразованию GDI.

17
задан Yngve Hammersland 3 February 2019 в 22:39
поделиться

1 ответ

Следует помнить, что большая часть GDI обычно выполняется на оборудовании (т.е. функции GDI отображаются на драйвер дисплея, который реализует некоторые функции на кристалле) {{ 1}} GDI + должен был получить аппаратное ускорение, но остался только программным средством визуализации.

Попробуйте вручную установить несколько пикселей через GDI + и GDI и посмотрите, отличаются ли они.

Возможно, способ преобразования координат вашей конкретной видеокарты отличается от того, как это происходит в GDI +

-1
ответ дан 30 November 2019 в 14:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: