天天看点

重温 Win32 API ----- 截屏指定窗体并打印1 基本思路2 代码实现

朋友说在一个VC++6.0开发的项目中要增加打印窗体的功能,让帮忙写个代码供其调用。

这么老的IDE当然不想碰了,并且也不喜欢MFC笨拙不清晰的封装。所以决定採用纯Win32 API,然后用C++类简单封装一下。

窗体DC和打印机DC是两类不兼容的DC。所以它们之间传送位图仅仅能通过DIB。首先,通过BitBlt()把要打印窗体的客户区复制到DDB内存位图中,然后通过GetDIBits()把DDB转换为DIB,最后通过StretchDIBits()向打印机DC输出。

头文件 WinowPrinter.h

实现文件 WindowPrinter.cpp

scaleX : scaleY;

int xDst, yDst, cxDst, cyDst;

cxDst = (int)((float)bmpWnd.bmWidth * scale);

cyDst = (int)((float)bmpWnd.bmHeight * scale);

xDst = (int)((pageWidth - cxDst) / 2);

yDst = (int)((pageHeight - cyDst) / 2);

static DOCINFO di = { sizeof(DOCINFO), L"PRINTJOBNAME" };

if (::StartDoc(hdcPrinter, &di) > 0)

{

if (::StartPage(hdcPrinter) > 0)

::StretchDIBits(hdcPrinter,

xDst, yDst, cxDst, cyDst,

0, 0, bmpWnd.bmWidth, bmpWnd.bmHeight,

lpbitmap,

(BITMAPINFO*)&bi,

DIB_RGB_COLORS,

SRCCOPY);

::EndPage(hdcPrinter);

}

::EndDoc(hdcPrinter);

::DeleteDC(hdcPrinter);

::free(lpbitmap);

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5193905.html,如需转载请自行联系原作者

继续阅读