更改 TextOut 中设置位置的单位,C++
Change the unit for setting position in TextOut, C++
我目前正在使用 C++ 开发打印插件,并开始使用 TextOut
打印我想要的文本。它工作得很好,但显然,TextOut
用作参数的位置以像素为单位。有没有办法将它们设置为厘米或毫米?还是其他?
应该对打印实施特殊处理。基本上,您需要根据 HIMETRIC 单位执行转换。纸张大小以 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);
}
}
好吧,这很简单。坐标不是以像素为单位,而是以您的映射模式的坐标为单位。恰好DC的默认映射模式是MM_TEXT,每个坐标单位是设备上的一个像素。
使用 SetMapMode() 将映射模式更改为您喜欢使用的坐标系。您还可以使用 window 范围、视口范围和原点来自定义它。您可能需要查看 SetMapMode() 和 MM_LOMETRIC(或 MM_HIMETRIC)映射模式的文档。
我目前正在使用 C++ 开发打印插件,并开始使用 TextOut
打印我想要的文本。它工作得很好,但显然,TextOut
用作参数的位置以像素为单位。有没有办法将它们设置为厘米或毫米?还是其他?
应该对打印实施特殊处理。基本上,您需要根据 HIMETRIC 单位执行转换。纸张大小以 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);
}
}
好吧,这很简单。坐标不是以像素为单位,而是以您的映射模式的坐标为单位。恰好DC的默认映射模式是MM_TEXT,每个坐标单位是设备上的一个像素。
使用 SetMapMode() 将映射模式更改为您喜欢使用的坐标系。您还可以使用 window 范围、视口范围和原点来自定义它。您可能需要查看 SetMapMode() 和 MM_LOMETRIC(或 MM_HIMETRIC)映射模式的文档。