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

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

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

Когда требуется GDI +, я создаю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 +)

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

Кто-нибудь знает, что здесь происходит?

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

Для справки, вот как выглядит мой viewport / window org / ext:

Window Ext: (134000, 80500)
Window Org: (0, 0)
Viewport Ext: (1452 872)
Viewport Org: (35 35)
Обновить:

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

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

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

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

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

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

Ответы на вопрос(4)

Ваш ответ на вопрос