void PrintView(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC printDC = getPrinterDC(); if (!printDC) { ::MessageBox(0, _T("Error creating printing DC"), _T("Error"), MB_APPLMODAL | MB_OK); return; } if (::SetAbortProc(printDC, AbortProc) == SP_ERROR) { ::MessageBox(0, _T("Error setting up AbortProc"), _T("Error"), MB_APPLMODAL | MB_OK); return; } IWebFrame* frame = 0; if (FAILED(gWebView->mainFrame(&frame))) goto exit; IWebFramePrivate* framePrivate = 0; if (FAILED(frame->QueryInterface(&framePrivate))) goto exit; framePrivate->setInPrintingMode(TRUE, printDC); UINT pageCount = 0; framePrivate->getPrintedPageCount(printDC, &pageCount); DOCINFO di; initDocStruct(&di, _T("WebKit Doc")); ::StartDoc(printDC, &di); // FIXME: Need CoreGraphics implementation void* graphicsContext = 0; for (size_t page = 1; page <= pageCount; ++page) { ::StartPage(printDC); framePrivate->spoolPages(printDC, page, page, graphicsContext); ::EndPage(printDC); } framePrivate->setInPrintingMode(FALSE, printDC); ::EndDoc(printDC); ::DeleteDC(printDC); exit: if (frame) frame->Release(); if (framePrivate) framePrivate->Release(); }
HRESULT STDMETHODCALLTYPE WebKitUIDelegate::printFrame( /* [in] */ IWebView *webView, /* [in] */ IWebFrame *frame) { // This code is originally based on the PrintView function in // the WinLauncher code of WebKit. We should periodically check // there to ensure that this doesn't become obsolete. // Open a printing dialog to fetch the HDC of the desired printer. PRINTDLG dialog; ZeroMemory(&dialog, sizeof(PRINTDLG)); dialog.lStructSize = sizeof(PRINTDLG); dialog.Flags = PD_PRINTSETUP | PD_RETURNDC; BOOL dialogResult = ::PrintDlg(&dialog); if (!dialogResult) // Error or cancel. { DWORD reason = CommDlgExtendedError(); if (!reason) // User cancelled. return S_OK; logger->Error("Could not print page, dialog error code: %i", reason); return E_FAIL; } HDC hdc = dialog.hDC; if (!hdc) { logger->Error("Could not fetch printer HDC."); return E_FAIL; } if (::SetAbortProc(hdc, AbortProc) == SP_ERROR) { logger->Error("Could not set printer AbortProc."); return E_FAIL; } IWebFrame* mainFrame = 0; if (FAILED(webView->mainFrame(&mainFrame))) { return E_POINTER; } IWebFramePrivate* framePrivate = 0; if (FAILED(mainFrame->QueryInterface(&framePrivate))) { mainFrame->Release(); return E_POINTER; } framePrivate->setInPrintingMode(TRUE, hdc); UINT pageCount = 0; framePrivate->getPrintedPageCount(hdc, &pageCount); DOCINFO docInfo; ZeroMemory(&docInfo, sizeof(DOCINFO)); docInfo.cbSize = sizeof(DOCINFO); docInfo.lpszDocName = _T("Titanium Document"); ::StartDoc(hdc, &docInfo); void* graphicsContext = 0; for (size_t page = 1; page <= pageCount; page++) { ::StartPage(hdc); framePrivate->spoolPages(hdc, page, page, graphicsContext); ::EndPage(hdc); } framePrivate->setInPrintingMode(FALSE, hdc); ::EndDoc(hdc); ::DeleteDC(hdc); if (mainFrame) mainFrame->Release(); if (framePrivate) framePrivate->Release(); return S_OK; }