c++ - 使用 MFC 打印到打印机 DC

标签 c++ printing mfc

我遵循了 Microsoft 关于创 build 备上下文的教程,并且尝试在 Internet 上寻找合适的来源(显然,MFC 是一个神秘的东西)。下面成功打印出“Hello, World!”;除了它非常小。

如何向打印机发送 CImage 而不是文本? 我怎样才能使文本的大小大于几毫米? 我搜索了 MSDN,但所有内容要么已过时(如我正在使用的示例代码),要么只是没有得到很好的记录。

 // get the default printer
  CPrintDialog dlg(FALSE);
  dlg.GetDefaults();

  // is a default printer set up?
  HDC hdcPrinter = dlg.GetPrinterDC();
  if (hdcPrinter == NULL)
  {
    //MessageBox(_T("Buy a printer!"));
  }
  else
  {
    // create a CDC and attach it to the default printer
    CDC dcPrinter;
    dcPrinter.Attach(hdcPrinter);

    // call StartDoc() to begin printing
    DOCINFO docinfo;
    memset(&docinfo, 0, sizeof(docinfo));
    docinfo.cbSize = sizeof(docinfo);
    docinfo.lpszDocName = _T("CDC::StartDoc() Code Fragment");

    // if it fails, complain and exit gracefully
    if (dcPrinter.StartDoc(&docinfo) < 0)
    {
      //MessageBox(_T("Printer wouldn't initalize"));
    }
    else
    {
      // start a page
      if (dcPrinter.StartPage() < 0)
      {
        //MessageBox(_T("Could not start page"));
        dcPrinter.AbortDoc();
      }
      else
      {
        // actually do some printing
        //CGdiObject* pOldFont = dcPrinter.SelectStockObject(SYSTEM_FONT);

        dcPrinter.SetMapMode(MM_HIENGLISH);
      auto font = CreateFont(
      3'000,                        // nHeight
      1'500,                         // nWidth
      0,                         // nEscapement
      0,                         // nOrientation
      FW_NORMAL,                 // nWeight
      FALSE,                     // bItalic
      FALSE,                     // bUnderline
      0,                         // cStrikeOut
      ANSI_CHARSET,              // nCharSet
      OUT_DEFAULT_PRECIS,        // nOutPrecision
      CLIP_DEFAULT_PRECIS,       // nClipPrecision
      DEFAULT_QUALITY,           // nQuality
      DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
      _T("Arial"));                 // lpszFacename
      dcPrinter.SelectObject(&font);
        dcPrinter.TextOut(450, 450, _T("Hello World!"), 12);
        dcPrinter.EndPage();
        dcPrinter.EndDoc();
        //dcPrinter.SelectObject(pOldFont);
      }
    }
  }

最佳答案

小文本问题

问题是,默认情况下,字体的大小是以设备相关的单位指定的,打印机的分辨率通常比屏幕高得多。因此,如果您在屏幕上创建了一个 20 像素高的字体(每英寸可能有 96 像素),当您尝试在打印机上使用该字体时,它可能每英寸有 300 或 600 点,那么您的文本看起来真的小。

正如另一个答案所示,一个想法是更改映射模式,以便打印机使用更接近屏幕上的单位。

另一种方法是根据打印机的 DPI 创建具有适当大小(LOGFONT 结构中的 lfHeight 字段)的新字体,您可以使用 GetDeviceCaps 函数确定该值。如果您需要特定的字体大小,例如 14 号文本,这会很方便。

LOGFONT lf = {0};
lf.lfHeight = -MulDiv(point_size, ::GetDeviceCaps(dcPrinter, LOGPIXELSY), 72);
// init other field of lf as you like
HFONT hfontPrinter = ::CreateFontIndirect(&lf);
HFONT hfontOld = ::SelectObject(hdcPrinter, hfontPrinter);

// now draw to the hdcPrinter

::SelectObject(hdcPrinter, hfontOld);
::DeleteObject(hfontPrinter);

发送 CImage

我不使用 MFC,但看起来您可以使用打印机 DC 调用 CImage::StretchBlt。再一次,当您选择目标坐标时,您可能必须考虑到打印机的高分辨率。

关于c++ - 使用 MFC 打印到打印机 DC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36798307/

相关文章:

c++ - 如何填充矩形(c++、mfc)

c++ - 如何使用 -Wall 启用 -Wunused-variable?

c++ - QJsonValue 是私有(private)的?

python - 当尝试在 python 中打印 a\时扫描字符串文字时 EOL

python - 如何并排打印电压?

c++ - 如何在 C++ 宏中定义模式?

c++ - 为什么以及何时使用多态性将基类指向 C++ 中的派生类

c++ - 具有固定数量的模板参数的类内部的多个包扩展

printing - 使用 maskdict 在 postscript 中进行图像屏蔽

C++ - MFC - 更改 CMenu 的文本