StretchDIBits auf einen druckerDC



  • hallo

    ich möchte ein kleines scannprogramm schreiben. scannen klappt schon, nur drucken
    nicht.

    ich habe einen zeiger auf die bits die ich setzten möchte, sowie eine BITMAPINFO
    die die daten des DIBs enthällt. die werte sind auch alle gültig. jetzt will
    ich die daten mit StretchDIBits in den druckerDC kopieren. rückgabewert ist 0,
    und GetLastError liefert "ERROR_INSUFFICIENT_BUFFER" mit der beschreibung:
    "The data area passed to a system call is too small."

    ich vermute man kann die daten nicht so einfach rüberkopieren.

    das ergebniss ist einfach ein leeres blatt 😞

    der code:

    PRINTDLG printdlg;
    DWORD printflags = PD_ALLPAGES | PD_COLLATE | PD_RETURNDC | PD_NOSELECTION | PD_PRINTSETUP;
    
    ZeroMemory(&printdlg, sizeof(printdlg));
    
    printdlg.lStructSize = sizeof(printdlg);
    printdlg.hwndOwner = 0;
    printdlg.Flags = printflags;
    printdlg.nCopies = 1;
    
    if (PrintDlg(&printdlg))
    {
    	DOCINFO di = {sizeof(DOCINFO), "Scanner"};
    
    	if (StartDoc(printdlg.hDC, &di) > 0)
    	{
    		if (StartPage(printdlg.hDC) > 0)
    		{
    			long xres = GetDeviceCaps(printdlg.hDC, HORZRES);
    			long yres = GetDeviceCaps(printdlg.hDC, VERTRES);
    
    			BITMAPINFO bmi;
    			bmi.bmiHeader = *pheader; // pheader ist vom scanner
    
    			StretchDIBits(printdlg.hDC, 0, 0, xres, yres, 0, 0, width, height, pbits, 0, 0, SRCCOPY); // pbits, width und height auch
    			EndPage(printdlg.hDC);
    		}
    		EndDoc(printdlg.hDC);
    	}
    
    	DeleteDC(printdlg.hDC);
    }
    

    was mache ich falsch?



  • mittlerweile hab ich mal eine bitmap im drucker dc erzeugt, hat jedoch nichts
    gebracht 😞

    long xres = GetDeviceCaps(printdlg.hDC, HORZRES);
    long yres = GetDeviceCaps(printdlg.hDC, VERTRES);
    
    BITMAPINFO bmi;
    bmi.bmiHeader = *pheader;
    
    HBITMAP bmp = CreateCompatibleBitmap(printdlg.hDC, xres + 1, yres + 1);
    HGDIOBJ old = SelectObject(printdlg.hDC, bmp);
    
    StretchDIBits(printdlg.hDC, 0, 0, xres, yres, 0, 0, width, height, pbits, 0, 0, SRCCOPY);
    
    SelectObject(printdlg.hDC, old);
    DeleteObject(bmp);
    


  • alle normalen funktionen wie textout oder lineto funktionieren, nur keine
    kopierfunktionen 😞



  • Du hast BITMAPINFO (sollte der Parameter nach pbits sein) gar nicht gesetzt?

    (Eine Bitmap in einen Printer-DC zu selektieren macht btw überhaupt keinen Sinn)


Log in to reply