使用MFC打印到打印机DC

时间:2016-04-22 15:51:54

标签: c++ printing mfc

我已经关注微软关于创建设备上下文的教程,并且我已经尝试在互联网上寻找合适的来源(显然,MFC是一个神秘的东西)。以下成功打印出" Hello,World!&#34 ;;除了它非常小。

如何将CImage发送到打印机而不是文本? 我怎么能让文字的大小超过几毫米呢? 我已经搜索过MSDN,但是所有内容都已过时(如我正在使用的示例代码),或者没有详细记录。

{{1}}

4 个答案:

答案 0 :(得分:3)

小文字问题

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

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

另一种方法是根据打印机的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。再次,当您选择目标坐标时,您可能需要考虑打印机的更高分辨率。

答案 1 :(得分:1)

问题在于:

dcPrinter.SetMapMode(MM_TEXT);

MM_TEXT将一个逻辑点映射到一个设备点;考虑到打印机的典型分辨率为600 DPI,你的东西将比屏幕上的小几倍。

使用MM_HIENGLISH或其他一些与设备无关的模式;这是MSDN link

答案 2 :(得分:1)

使用CFont :: CreatePointFont()或CFont :: CreatePointFontIndirect()创建合理的字体。大多数打印机都是600 DPI。大多数屏幕都是96 DPI。屏幕上的12磅字体基本上是2磅字体,在打印机上难以辨认。

创建字体并将其选择到DC中。在使用它之后和销毁DC(CDC类)之前,不要忘记从DC中选择它。 (CDC析构函数会自动删除HDC)。

答案 3 :(得分:0)

我已经使用以下方法成功打印了“ Hello World!”。祝你有愉快的一天!”位于打印机页面原点的200x200单色位图(MyLogo.bmp)右侧(我正在使用黑白热敏打印机):

CDC printDC( GetMyPrintDC() );    // e.g. as per original code
DOCINFO di( GetMyDocInfo() );     // e.g. as per original code
printDC.StartDoc( &di );
  ATL::CImage logo;
  logo.Load( "MyLogo.bmp" );
  const BOOL result( logo.Draw( printDC.GetSafeHdc(), CPoint( 0, 0 ) ) );
CFont myFont, *old;
myFont.CreatePointFont(100, "Courier New", &printDC);
old = printDC.SelectObject(&myFont);
printDC.TextOut( 250, 50, "   Hello World!" );
printDC.TextOut( 250, 150, "Have a nice Day!" );
printDC.SelectObject( old );
myFont.DeleteObject();
printDC.EndPage();
printDC.EndDoc();
printDC.DeleteDC();

三行缩进的行突出显示了在打印机上渲染CImage所需的全部内容。改变CreatePointFont()中的参数以调整文本的大小(否则很小)以适合。