winapi — изменить единицу для установки положения в TextOut, переполнение стека

В настоящее время я работаю над плагином для печати с C ++ и начинаю работать с TextOut напечатать текст, который я хочу. Это прекрасно работает, но, видимо, позиции, которые TextOut использует в качестве параметров в пикселях. Есть ли способ установить их в см или мм? или любой другой?

2

Решение

Ну, это довольно просто. Координаты не в пикселях, но они находятся в координатах вашего режима отображения. Так уж получилось, что режимом отображения DC по умолчанию является MM_TEXT, в котором каждая единица координат равна одному пикселю на устройстве.

Измените режим отображения с помощью SetMapMode () на систему координат, которую вы предпочитаете использовать. Вы также можете поэкспериментировать с экстентами окон, экстентами области просмотра и источниками, чтобы настроить их так, как вы хотите. Возможно, вы захотите посмотреть документацию по SetMapMode () и режиму отображения MM_LOMETRIC (или MM_HIMETRIC).

1

Другие решения

Для печати должна быть предусмотрена специальная обработка. По сути, вам нужно выполнить преобразование на основе единиц HIMETRIC. Размер бумаги в ГИМЕТРИЧЕСКИХ единицах.

Вот код, который поможет вам начать работу (на основе MFC):

if (pDC->IsPrinting())
{
// printable area in millimeters
int nWidth = pDC->GetDeviceCaps(HORZSIZE);
int nHeight = pDC->GetDeviceCaps(VERTSIZE);

CDC ScreenDC;
ScreenDC.CreateIC(_T("DISPLAY"), NULL, NULL, NULL);

int nPixelsPerInchX = ScreenDC.GetDeviceCaps(LOGPIXELSX);
int nPixelsPerInchY = ScreenDC.GetDeviceCaps(LOGPIXELSY);

// paper size is in HIMETRIC units. we need to convert
CSize PaperSize(MulDiv(nWidth,nPixelsPerInchX*100,HIMETRIC_PER_INCH),
MulDiv(nHeight,nPixelsPerInchY*100,HIMETRIC_PER_INCH));

// now we need to calculate zoom ratio so the layer content fits on page
double fZoomX = (double)PaperSize.cx/(double)m_DocSize.cx;
double fZoomY = (double)PaperSize.cy/(double)m_DocSize.cy;

m_PrintZoom = min(fZoomX, fZoomY);
ResetViewSize(TRUE);

if (pDC->IsKindOf(RUNTIME_CLASS(CPreviewDC)))
{
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(nPixelsPerInchX, nPixelsPerInchY);
pDC->SetViewportExt(pDC->GetDeviceCaps(LOGPIXELSX), pDC->GetDeviceCaps(LOGPIXELSY));
pDC->SetViewportOrg(0,0);
pDC->SetWindowOrg(0,0);
}
}
1

По вопросам рекламы [email protected]