MFC PrintWindow(CPaintDC) работает, но PrintWindow(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. Когда я на самом деле Печать это не будет. В обоих случаях вызывается одна и та же функция, и единственное, что отличается, заключается в том, что в случае Preview -> "CDC * pDC" является объектом "CPaintDC", а в случае фактической печати - объектом "CDC".

Чтобы быть уверенным, что это действительно функция "PrintWindow", что не сработает, я добавил еще одну строку кода в функцию [pDC->Rectangle(...);], которую я вижу в Preview, а также на бумаге.

Я также думал об использовании функции CWnd::Print или CWnd::PrintClient, но ни один из них не работает в обоих случаях.

Поэтому мой вопрос заключается в том, что я могу сделать в качестве обходного пути или какова может быть причина, по которой рендеринг объекта (производного от CWnd) не будет работать на CDC, но на CPaintDC?

2 ответа

Решение

Я только что узнал, что проблема не в CDC/CpaintDC. Это просто не будет работать для принтеров, которые я тестировал в первую очередь. Я попробовал другой принтер, и он работал.

Я создал еще один вопрос для проблемы " НАСТОЯЩАЯ". Печать MFC с CDC работает только на некоторых принтерах.

CPaintDC вызывает CWnd::BeginPaint при построении и CWnd::EndPaint при уничтожении, поэтому ручной вызов их на CDC может сработать.

Другие вопросы по тегам