Печать MFC с CDC работает только на некоторых принтерах

Я реализую функцию печати в большом проекте для печати так называемых гаджетов (полученных из CWnd). В классе гаджетов я создал функцию для ее рендеринга в контекст устройства

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


Что всегда работает?

  • Все в PrintPreview
  • Прямоугольник границы, когда я на самом деле печатаю

Что не работает?

  • гаджет не печатается в некоторых случаях «фактического процесса печати» / «печати на бумаге».

Поэтому я попытался печатать через PDF Creator и через 3 локальных принтера в своей локальной сети на 2 разных машинах Windows (Win7, Win8) с разными результатами (они кажутся всегда одинаковыми, поэтому я не думаю, что это какой-то неинициализированный член) , Что очень странно, так это то, что у меня разные результаты на машинах, например, есть один принтер, который работает для ПК A, но не для ПК B.

Я могу сказать вам, что печать просто не будет работать в моем приложении, поэтому это не проблема драйвера. Печать нормальных документов, изображений полностью работает. И, как я уже сказал, граница всегда печатается.

Что может быть причиной этого? Знаете ли вы какие-либо случаи такой проблемы?

Подсказка:
В качестве обходного пути я попытался скопировать гаджет из CPaintDC пользовательского интерфейса напрямую через BitBlt. В этом случае у меня та же проблема



Чтобы найти проблему, я создал небольшой тестовый проект для воссоздания ситуации.
Вот исходный код

//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();

Здесь я сталкиваюсь с теми же проблемами. Те же принтеры работают на тех же компьютерах.
Я думаю, что единственной проблемой может быть линия, где я создаю HDC

hdcBuffer = CreateDC("WINSPOOL", buffer, NULL, NULL);

Я думаю, что этот вызов в связи с «printWindow» или «bitblt» является проблемой.

Или это может быть ошибка MFC?

1

Решение

Это похоже на ошибку MFC. Каким-то образом драйвер принтера не инициализирован правильно. Я попробовал несколько решений, но не смог заставить это работать. В самых простых примерах это действительно дает сбой с разными результатами на разных машинах.

0

Другие решения