Я реализую функцию печати в большом проекте для печати так называемых гаджетов (полученных из 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. Когда я на самом деле Печать это не будет. В обоих случаях вызывается одна и та же функция, и единственное, что отличается, это то, что в случае Preview -> «CDC * pDC» является объектом «CPaintDC», а в случае фактической печати — объектом «CDC».
Чтобы быть уверенным, что это действительно функция «PrintWindow», что не сработает, я добавил еще одну строку кода в функцию [pDC-> Rectangle (…);], которую я вижу в Preview, а также на бумаге.
Я также думал об использовании функции CWnd :: Print или CWnd :: PrintClient, но ни один из них не работает в обоих случаях.
Поэтому мой вопрос заключается в том, что я могу сделать в качестве обходного пути или какова может быть причина, по которой рендеринг объекта (производного от CWnd) не будет работать на CDC, но на CPaintDC?
CPaintDC вызывает CWnd :: BeginPaint при построении и CWnd :: EndPaint при уничтожении, поэтому ручной вызов тех, кто находится на CDC, может работать.
Я только что узнал, что проблема не в CDC / CpaintDC.
Это просто не будет работать для принтеров, которые я тестировал в первую очередь.
Я попробовал другой принтер, и он работал.
Я создал еще один вопрос для «реальной» проблемы
Печать MFC с CDC работает только на некоторых принтерах