Ein Bitmap mit MFC drucken?



  • Hallo erstmal!

    Auf Codeproject habe ich ein Beispiel gefunden wie man etwas ausdrucken
    kann. In diesem Fall ein Bitmap.

    Hier verstehe ich aber nicht, wie man das Bild in der original Größe
    drucken kann. Es soll nicht auf das ganze Blatt vergrößert werden.

    Es muss wohl StretchBlt() auskommentiert werden. Nur dann druckt er gleich
    gar nimmer 😮

    CPrintDialog printDlg(FALSE);
     printDlg.GetDefaults(); 
     // Or get from user:
     // if (printDlg.DoModal() == IDCANCEL)   
     //        return; 
     CDC dc;
     if (!dc.Attach(printDlg.GetPrinterDC())) {
      AfxMessageBox(_T("No printer found!")); return;
     } 
    
     dc.m_bPrinting = TRUE; 
     DOCINFO di;    
     // Initialise print document details
     ::ZeroMemory (&di, sizeof (DOCINFO));
     di.cbSize = sizeof (DOCINFO);
     di.lpszDocName = filename; 
     BOOL bPrintingOK = dc.StartDoc(&di); // Begin a new print job 
     // Get the printing extents
     // and store in the m_rectDraw field of a 
     // CPrintInfo object
     CPrintInfo Info;
     Info.SetMaxPage(1); // just one page 
     int maxw = dc.GetDeviceCaps(HORZRES);
     int maxh = dc.GetDeviceCaps(VERTRES); 
     Info.m_rectDraw.SetRect(0, 0, maxw, maxh); 
     for (UINT page = Info.GetMinPage(); page <= 
          Info.GetMaxPage() && bPrintingOK; page++) {
      dc.StartPage();    // begin new page
      Info.m_nCurPage = page;
      CBitmap bitmap;
      // LoadImage does the trick here, it creates a DIB section
      // You can also use a resource here
      // by using MAKEINTRESOURCE() ... etc. 
      if(!bitmap.Attach(::LoadImage(
       ::GetModuleHandle(NULL), filename, IMAGE_BITMAP, 0, 0, 
       LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE))) {
        AfxMessageBox(_T("Error loading bitmap!")); return;
       } 
       BITMAP bm;
       bitmap.GetBitmap(&bm);
       int w = bm.bmWidth; 
       int h = bm.bmHeight; 
       // create memory device context
       CDC memDC; 
       memDC.CreateCompatibleDC(&dc);
       CBitmap *pBmp = memDC.SelectObject(&bitmap);
       memDC.SetMapMode(dc.GetMapMode());
       dc.SetStretchBltMode(HALFTONE);
       // now stretchblt to maximum width on page
       dc.StretchBlt(0, 0, maxw, maxh, &memDC, 0, 0, w, h, SRCCOPY); 
       // clean up
       memDC.SelectObject(pBmp);
       bPrintingOK = (dc.EndPage() > 0);   // end page
     } 
     if (bPrintingOK)
       dc.EndDoc(); // end a print job
     else dc.AbortDoc();           // abort job.
    


  • Wie bekomm ich eigentlich die Größe des Bildes raus?

    Ich würde dann ja hier maxw und maxh richtig ersetzen können
    um das gewünschte angepasste Druckbild zu bekommen.

    dc.StretchBlt(0, 0, maxw, maxh, &memDC, 0, 0, w, h, SRCCOPY);
    

    Erster Ansatz führte zu chaotisch großen Zahlen.

    CBitmap bitmap;
     BITMAP bm;
     bitmap.GetBitmap(&bm);
     bitmap.LoadBitmap(filename);
    
    int maxw = bm.bmWidth;  //wird ne zahl jenseits von 60000
    int maxh = bm.bmHeight; //wird 114
    

    Hüülfe 😃



  • Du bist nen held -.- Holst dir erst die BITMAP struct und dann lädst de die Bitmap... wie um alles in der Welt sollen dann in bm die richtigen Daten stehen?

    PS: Man sollte hier mal nen Wtf of the day forum machen 🤡



  • Ja gut das war vertauscht. 😉

    Egal, denn daran liegt es nicht!! Die Lösung für diesen Fall
    ist und bleibt offenbar BITMAPFILEHEADER. Denn damit habe ich
    es mir jetzt zusammengeschustert. 🙄


Log in to reply