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 nimmerCPrintDialog 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.