【问题标题】:Change the unit for setting position in TextOut, C++更改 TextOut、C++ 中设置位置的单位
【发布时间】:2016-01-27 02:42:21
【问题描述】:

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

【问题讨论】:

  • 您需要知道每厘米或毫米有多少像素并自己进行转换。

标签: c++ winapi printing mfc textout


【解决方案1】:

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

使用 SetMapMode() 将映射模式更改为您喜欢使用的坐标系。您还可以根据需要使用窗口范围、视口范围和原点来自定义它。您可能需要查看 SetMapMode() 和 MM_LOMETRIC(或 MM_HIMETRIC)映射模式的文档。

【讨论】:

    【解决方案2】:

    应该对打印实施特殊处理。基本上,您需要根据 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多