改变TextOut, c++中设置位置的单位

Change the unit for setting position in TextOut, C++

本文关键字:位置 单位 设置 TextOut c++ 改变      更新时间:2023-10-16

我目前正在用c++编写一个打印插件,并开始使用TextOut打印我想要的文本。它工作得很好,但显然,TextOut用作参数的位置是以像素为单位的。有办法将它们设置为厘米或毫米吗?

这很简单。坐标不是以像素为单位,而是以映射模式的坐标为单位。恰好DC的默认映射模式是MM_TEXT,它的每个坐标单位是设备上的一个像素。

使用SetMapMode()将您的映射模式更改为您喜欢使用的坐标系。您还可以使用窗口范围、视口范围和原点来自定义它。您可能需要查看SetMapMode()和mm_lmetric(或MM_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);
    }
}