Я реализую функцию печати в большом проекте для печати так называемых гаджетов (полученных из 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
Что всегда работает?
Что не работает?
Поэтому я попытался печатать через 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?
Это похоже на ошибку MFC. Каким-то образом драйвер принтера не инициализирован правильно. Я попробовал несколько решений, но не смог заставить это работать. В самых простых примерах это действительно дает сбой с разными результатами на разных машинах.