Странность с SetWindowExt и SetWindowExtEx (отрицательная высота, вверх ногами) - PullRequest
1 голос
/ 16 марта 2012

Я сталкиваюсь со странным поведением в отношении SetViewportExt() и SetViewportExtEx().

Мое приложение MFC использует MM_ISOTROPIC отображение для настройки контекста устройства просмотра и конфигурирует контекст устройства следующим образом:

m_dc.SetMapMode( MM_ISOTROPIC );

// Set the window extent (document space)
CSize docSizeLP = GetDocumentSizeLP();
m_dc.SetWindowExt(docSizeLP.cx, docSizeLP.cy);

// Next set the viewport extent
CSize docSizeDP = GetDocumentSizeDP();
m_dc.SetViewportExt((int) (docSizeDP.cx * fZoom), (int) (docSizeDP.cy * fZoom));

Теперь я сталкиваюсь с тремя странными вещами:

  • При рендеринге моего представления в метафайл (CMetaFileDC) мой контент переворачивается в метафайле вверх ногами..Однако если я заменю вызов SetViewportExt() на вызов SetViewportExtEx(), то метафайл будет корректным.Разница, по-видимому, в том, что SetViewportExtEx() устанавливает отрицательную высоту области просмотра, хотя мое переданное значение определенно положительно - и что мне нужна отрицательная высота области просмотра, чтобы получить правильный метафайл.
  • С другой стороны, использование SetViewportExtEx() по умолчанию приводит к предварительному просмотру печати, чтобы ничего не показывать .Снова высота области просмотра становится отрицательной при вызове SetViewportExtEx(), что, вероятно, является причиной этого.
  • При обычном рендеринге представления (представление MFC) оба значения SetViewportExt() и SetViewportExtEx() приводят к положительной высоте области просмотра.

Итак, есть ли у кого-нибудь ответы на эти два вопроса?

  1. Почему, черт возьми, SetViewportExtEx() устанавливает высоту моего окна просмотра как отрицательное значение в метафайле и предварительном просмотре печатирендеринга, хотя я пропускаю положительный?
  2. Почему мой рендеринг метафайла требует отрицательной высоты области просмотра, чтобы в конце не быть перевернутым?

ЯЛюбопытно, есть ли у кого-нибудь ответы на это, поскольку моя мудрость на этом закончилась.: -)

1 Ответ

1 голос
/ 21 августа 2012

Ваш вопрос подсказал мне, как решить проблему с расширенным метафайлом.Мое приложение также выводило данные в режиме MM_ISOTROPIC и с логическим (0,0) в центре представления.Выходное изображение было смещено и неправильно масштабировано.

Потратив немало времени на это, я наконец понял, что проблема может заключаться в двух версиях контекстов устройства, которые есть в CDC MFC.Первый DC m_hDC предназначен для фактического вывода, а второй m_hAttribDC предназначен для запроса метрик устройства, таких как DPI.

В итоге я закончил готовить контекст устройства следующим образом:

if (pDC->IsPrinting()){
  pDC->SetMapMode(MM_ISOTROPIC);
  pDC->SetViewportOrg(x0, y0);
  pDC->SetWindowExt(wind_extent, wind_extent);
  pDC->SetViewportExt(viewport_extent, -viewport_extent);
}
else{
  ::SetMapMode(pDC->m_hDC, MM_ISOTROPIC);
  ::SetViewportOrgEx(pDC->m_hDC, x0, y0, NULL);
  ::SetWindowExtEx(pDC->m_hDC, wind_extent, wind_extent, NULL);
  ::SetViewportExtEx(pDC->m_hDC, viewport_extent, -viewport_extent, NULL);
}

Предварительный просмотр и вывод метафайла после этого работали нормально.

Надеюсь, это поможет.

...