Problem beim drucken



  • Zuerst simpelst zusammengefasst: ich möchte drucken.
    Aber nicht eine bestehende Datei, sondern den Inhalt eines Textspeichers auf den ich über einen Handle zugreife.
    Ich weiss von vornherein nicht wie gross der Inhalt des Handles sein wird, daher muss ich mit flexiblen Grössen für die Seitenzahlen arbeiten.
    Um dorthin zu gelangen möchte ich erst einmal eine ganz einfache Druckausgabe mit einem vorgegebenem String erhalten: einfach eine Zeile auf ein Blatt.
    Ich erzeuge mir die Printdialogbox, wähle automatisch den Standarddrucker und erlaube weder Selection noch Pagenums.
    Wenn ich nun den Dialog schliesse druckt der Drucker aber nicht, es passiert gar nichts, nichtmal eine leere Seite wird gedruckt.
    Was mache ich falsch bzw. was habe ich vergessen?
    Könnte es sein, dass ich nicht einfach so auf das Blatt drucken kann, sondern vorher ein Rect angeben muss in der Grösse die ich haben will (in diesem Fall das ganze A4 Blatt) in das ich dann den Text schreiben kann?

    Hier mein Code:

    static	PRINTDLG		gsPD;
    static	DOCINFO		gsDI;
    static	DEVNAMES		gsDEVNAMES;
    static	DEVMODE		gs_devicemode;
    
    BOOL PrintResults(HWND hWnd)
    {
    	int	nError = 0;
    	LPSTR	pszFileText = "Dieses ist ein Test";
    	DWORD	dwFileSize = 19;
    
    	// Initialize the PRINTDLG members.
    	memset(&gsPD, 0, sizeof(PRINTDLG));
    	gsPD.lStructSize = sizeof(PRINTDLG);
    	gsPD.hwndOwner = hWnd;
    	gsPD.hDevMode = NULL;
    	gsPD.hDevNames = NULL;
    	gsPD.nMinPage = 1;
    	gsPD.nMaxPage = 1000;
    	gsPD.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_ALLPAGES | PD_COLLATE | PD_NOPAGENUMS | PD_NOSELECTION | PD_RETURNDC;
    	gsPD.nCopies = 1;
    
    	// Zero and then initialize the members of a DOCINFO structure
    	memset(&gsDI, 0, sizeof(DOCINFO));
    	gsDI.cbSize = sizeof(DOCINFO);
    	gsDI.lpszDocName = "CallTree Results";
    	gsDI.lpszOutput = "CallTree Results";
    	gsDI.lpszDatatype = (LPTSTR) NULL;
    	gsDI.fwType = 0;
    
    	nError = PrintDlg((LPPRINTDLG)&gsPD);
    
    	if (nError == true) {
    		// Begin a print job by calling the StartDoc function
    		nError = StartDoc(gsPD.hDC, &gsDI);
    
    		// Inform the driver that the application is about to begin sending data
    		nError = StartPage(gsPD.hDC);
    
    		nError = TextOut(gsPD.hDC, 50, 50, pszFileText, dwFileSize);
    
    		// Inform the spooler that the page is complete
    		nError = EndPage(gsPD.hDC);
    
    		// Inform the driver that document has ended
    		nError = EndDoc(gsPD.hDC);
    
    		DeleteDC(gsPD.hDC);
    	}
    	if (gsPD.hDevMode  != NULL)
    		GlobalFree(gsPD.hDevMode);
    	if (gsPD.hDevNames != NULL)
    		GlobalFree(gsPD.hDevNames);
    
    	return bPrint;
    }
    

    Vielen Dank.



  • Ist denn der return value von PrintDlg((LPPRINTDLG)&gsPD); nonzero bzw. kommt er in den if-Block überhaupt rein?
    GetLastError



  • Jep, ist er.
    Alle ReturnValues sind nonzero, im konkreten Falle 1.
    Der if-Block wird problemlos durchlaufen und ich erhalte keine einzige Fehlermeldung.



  • Hab den Fehler selbst gefunden.
    Ich habe in der DOCINFO-Struktur den Namen für ein Outputfile angegeben und wusste nicht, dass ich entweder ein Outputfile auf Festplatte anlegen oder an das Device die Daten senden kann.
    Dachte da geht es beides.
    Habe den Pointer für das Outputfile nun auf NULL gesetzt und nun wird auch alles gedruckt.


Anmelden zum Antworten