使用 CDC 的 MFC 打印仅适用于某些打印机

MFC Printing with CDC just works on some Printers

我正在一个大项目中实现一个打印函数来打印所谓的小工具(派生自 CWnd)。在小工具中 Class 我创建了一个函数来将其呈现到设备上下文

PrintPageContent(CDC * pDC, const CRect & rContent, int page, int numPages) 
{
    PrintWindow(pDC, PW_CLIENTONLY);
    pDC->Rectangle(rContent.left,rContent.top, rContent.right, rContent.bottom);
}

为了轻松呈现小工具,我考虑过使用 PrintWindow 函数 https://msdn.microsoft.com/en-us/library/x51z0shh.aspx


什么总是有效的?


什么不起作用?


所以我尝试通过 PDF Creator 和局域网中的 3 台本地打印机在 2 台不同的 Windows 机器(Win7、Win8)上进行打印,结果不同(它们似乎总是一样的,所以我不不要认为它是某种未初始化的成员)。非常奇怪的是我在机器上有不同的结果,例如有一台打印机适用于 PC A 但不适用于 PC B。

我可以告诉您,我的应用程序无法进行打印,因此这不是驱动程序问题。打印正常文档、图像完全有效。正如我已经说过的,边框总是被打印出来。

这可能是什么原因造成的?您知道此类问题的案例吗?

提示: 作为解决方法,我尝试通过 BitBlt 直接从 UI 的 CPaintDC 复制小工具。在这种情况下,我有同样的问题



为了找到问题,我创建了一个小型测试项目来重现情况。 这是源代码

//Create Members
CDC pDC;
HDC hdc;

//Get Printer/Printer Settings
LPCSTR buffer = NULL;
GetDefaultPrinterName(buffer);
hdc = CreateDC("WINSPOOL", buffer, NULL, NULL);
pDC.Attach(hdc);
pDC.m_bPrinting = TRUE;

//Start Document Printing
pDC.StartDoc("TEST");
pDC.StartPage();

//Render Window
PrintWindow(&pDC,PW_CLIENTONLY);

//Render Frame Rectangle
CRect WindowRect;
GetClientRect(WindowRect);
WindowRect.MoveToXY(0,0);
CBrush brush;
brush.CreateSolidBrush(RGB(0,0,0));
pDC.FrameRect(WindowRect,  &brush);

// Finish Printing
pDC.EndPage();
pDC.EndDoc();

我在这里遇到了同样的问题。同一台打印机适用于同一台 PC。 我认为唯一的问题可能是我创建 HDC

的那一行
hdcBuffer = CreateDC("WINSPOOL", buffer, NULL, NULL);

我认为这个与 "printWindow" 或 "bitblt" 相关的调用是问题所在。

或者这可能是 MFC 错误?

它看起来像一个 MFC 错误。不知何故,打印机驱动程序未正确初始化。我尝试了几种解决方案,但无法正常工作。它在最简单的例子中确实失败了,在不同的机器上有不同的结果。