2016-03-10 2 views
1

Я использую следующий код для печати того, что находится внутри буфера обмена (растровое изображение).
На печатной бумаге я вижу черную линию, нарисованную с помощью MoveTo/LineTo, однако растровое изображение не нарисовано.
Использование того же кода чертежа в CView отлично работает.MFC - Печать CBitmap на принтер CDC

keybd_event(VK_SNAPSHOT, 1, 0, NULL); 
HBITMAP handle = NULL; 

if (::OpenClipboard(NULL)) 
{ 
    handle = (HBITMAP)GetClipboardData(CF_BITMAP); 

    if (handle) 
    { 
     CBitmap* pBmp = CBitmap::FromHandle(handle); 
     BITMAP bm; 
     pBmp->GetBitmap(&bm); 
     int iBmpWidth = bm.bmWidth; 
     int iBmpHeight = bm.bmHeight; 

     CPrintDialog* pDlg = new CPrintDialog(FALSE); 
     CString csText; 
     CString cTitle; 

     if (pDlg->GetDefaults() == FALSE) 
     { 
      delete pDlg; 
      return; 
     } 

     pDlg->m_pd.Flags &= ~PD_RETURNDEFAULT; 
     LPDEVMODE pDevMode = pDlg->GetDevMode(); 
     ::GlobalUnlock(pDlg->m_pd.hDevMode); 

     DOCINFO di; 
     di.cbSize = sizeof(DOCINFO); 
     pDlg->m_pd.hwndOwner = this->GetSafeHwnd(); 

     if (pDlg->DoModal() == IDOK) 
     { 
      HDC hdcPrinter = pDlg->GetPrinterDC(); 

      if (hdcPrinter != NULL) 
      { 
       pDevMode = (LPDEVMODE)GlobalLock(pDlg->m_pd.hDevMode); 
       pDevMode->dmPaperSize = DMPAPER_A4;    
       pDevMode->dmOrientation = DMORIENT_LANDSCAPE; 
       ResetDCW(hdcPrinter, pDevMode);     
       GlobalUnlock(pDlg->m_pd.hDevMode); 

       // create a CDC and attach it to the default printer 
       CDC dcPrinter; 
       dcPrinter.Attach(hdcPrinter); 

       // call StartDoc() to begin printing 
       DOCINFO docinfo; 
       memset(&docinfo, 0, sizeof(docinfo)); 
       docinfo.cbSize = sizeof(docinfo); 
       docinfo.lpszDocName = _T("CDC::StartDoc() Code Fragment"); 

       // if it fails, complain and exit gracefully 
       if (dcPrinter.StartDoc(&docinfo) < 0) 
       { 
        MessageBox(_T("Printer wouldn't initalize")); 
       } 
       else 
       { 
        // start a page 
        if (dcPrinter.StartPage() < 0) 
        { 
         MessageBox(_T("Could not start page")); 
         dcPrinter.AbortDoc(); 
        } 
        else 
        { 

         int PaperWidth = dcPrinter.GetDeviceCaps(HORZRES); 
         int PaperHeight = dcPrinter.GetDeviceCaps(VERTRES);    

         CDC memDC; 
         memDC.CreateCompatibleDC(&dcPrinter); 
         CBitmap* pOldBit = memDC.SelectObject(pBmp); 

         dcPrinter.MoveTo(1000, 1000); 
         dcPrinter.LineTo(PaperWidth - 1000, PaperHeight - 1000); 

         dcPrinter.StretchBlt(100, 
               100, 
               PaperWidth - 100, 
               PaperHeight - 100, 
               &memDC, 
               0, 
               0, 
               iBmpWidth, 
               iBmpHeight, 
               SRCCOPY); 

         memDC.SelectObject(pOldBit); 
         memDC.DeleteDC(); 

         dcPrinter.EndPage(); 
         dcPrinter.EndDoc(); 
        } 
       } 
      } 
     } 

     delete pDlg; 
    } 

    ::EmptyClipboard(); 
    ::CloseClipboard(); 
} 

ответ

0

Использование кода без каких-либо изменений работает для меня, я проверил использование реального принтера и CutePDF, как напечатанный точечный рисунок. Возможно, это проблема с вашим источником DC при создании memDC, либо он не поддерживает правильное цветовое пространство или не поддерживает растровые операции. Вместо этого попробуйте использовать следующий код:

CDC* pDC = GetDesktopWindow()->GetDC(); 
memDC.CreateCompatibleDC(pDC); 
GetDesktopWindow()->ReleaseDC(pDC); 
+0

Я получаю такое же поведение с вашим кодом Ричард.
Я собираюсь попробовать другой компьютер. – Toyo

Смежные вопросы