Frage zu Drucken mit Textanpassung und Images



  • Hallo Leute,

    mal wieder ne Frage,

    ich möchte einen Text, der mir als CString vorliegt ausdrucken, und bei Ende Druckbereich einen Zeillenumbruch macht.
    Zudem möchte ich noch Trennlinien und eventuell Images einbringen.

    Das Mit der Textausgabe un dem Druckbereich hatt geklappt, nur weis ich nicht wie ich das mit dem Zeillenumbruch machen soll.
    Auch fehlt mir das Zeichenen von Linien und Images..

    hier was ich herausbekommen habe..

    CPrintDialog dlgPrint(FALSE,PD_ALLPAGES,this); 
    	UpdateData(TRUE);
    	// CString m_sText;
    	// m_AuthAnzeige.GetLine(0,m_sText.GetBuffer(NULL));
    
    	int m_iLeft = 15; // in mm
    	int m_iTop = 15; // in mm
    	int m_iRight = 15; // in mm
    	int m_iButton =15; // in mm
    
    	if (dlgPrint.DoModal()==IDOK) 
    	{ 
    		CDC dcPrint; 
    		dcPrint.Attach(dlgPrint.GetPrinterDC()); 
    		DOCINFO myPrintJob; 
    		myPrintJob.cbSize = sizeof(myPrintJob); 
    		myPrintJob.lpszDocName = "PrintingTest"; 
    		myPrintJob.lpszOutput = NULL; 
    		myPrintJob.lpszDatatype = NULL; 
    		myPrintJob.fwType = NULL; 
    		if (dcPrint.StartDoc(&myPrintJob)>=0) 
    		{ 
    			// Als Hilfe wie man bestimmte Parameter abfragt 
    			int te = dcPrint.GetDeviceCaps(ASPECTY); 
    			int test = dcPrint.GetDeviceCaps(ASPECTX); 
    			int m_iHorizont = dcPrint.GetDeviceCaps(HORZRES); 
    			int m_iVerdikal = dcPrint.GetDeviceCaps(VERTRES); 
    
    			dcPrint.StartPage(); 
    			RECT rctA; 
    			rctA.left = (m_iHorizont/210) * m_iLeft; // 210 Breite DIN A4   
    			rctA.top = (m_iVerdikal/297) * m_iTop; // 297 Höhe DIN A4  
    			rctA.right  = m_iHorizont - ((m_iHorizont/210) * m_iRight);   
    			rctA.bottom = m_iVerdikal - ((m_iVerdikal/297) * m_iButton); 
    
    			// dcPrint.TextOut(0,0,drucken);
    			dcPrint.DrawText(m_strAuthText, &rctA, DT_LEFT); 
    			dcPrint.EndPage(); 
    			dcPrint.EndDoc(); 
    		}
    		dcPrint.DeleteDC(); 
    	}
    

    kann mir jemand helfen ??

    Gruß
    andy_mann



  • Übergib DrawText() zusätzlich DT_WORDBREAK, dann wird automatisch auf die nächste Zeile umgebrochen.
    Zum Linien malen sieh Dir mal CDC::LineTo() an.
    Bitmaps drucken ist ein bisschen komplizierter: Mit ::StretchDIBits() fügst Du Du ein DIB (device independent bitmap) an einer bestimmten Stelle in einer bestimmten Größe ein.

    Gruß T. 🙂



  • Vielen Dank,

    kannst Du mir auch noch sagen, wie man einen Seitenumbruch bekommt und noch die Information der Seitenanzahl damit ich diese unten am rand hinzufügen kann ??

    Gruß
    andy_mann



  • Ohne das Doc/View-Framework mußt Du alles zu Fuß erledigen.

    Wenn Du den Seitenumbruch ermitteln willst, mußt Du mit DrawText() und den Parametern DT_CALCRECT | DT_WORDBREAK den Platzbedarf Deines Strings errechnen. Ich kenn nur die Methode entweder zeichen- oder wortweise zu probieren...

    Du beginnst beim ersten Wort des CStrings und checkst ob es in die Print-Area reinpaßt. Solange dieser Teil des Strings reinpaßt, verlängerst Du um das nächste Wort und probierst wieder. Ist ziemlich aufwendig, aber funzt.

    Hier ein Beispiel bei Codeguru, der Autor hat allerdings zeichenweise gecheckt was natürlich noch aufwendiger ist:

    http://www.codeguru.com/Cpp/W-P/printing/article.php/c2957/

    Gruß T. 🙂



  • Ahja, vielen Dank, muß ich dann noch berücksichtigen.

    Ich hätte aber noch mal ne Frage,

    wenn ich in einem Text bestimmte abschnitte Formatieren möchte, dann geht das ja nur, wenn ich dem Text irgendwelche haltestellen mitgebe, an dennen er weiß, ab hier muß ich Fett schreiben usw.

    Das bedeutet ja, dass ich dann so eine art z.b. mini HTML selbst schreiben muß.

    Sonst muß ich ja z.b. die Überschriften als Variable Deklarieren und dann beim Zeichen wieder einfügen.

    Un das bei einem großen Text von mehr als 1000 Zeichen.

    Bin ich da jetzt auf dem Holzweg oder gibt es da andere möglichkeiten..

    Gruß
    andy_mann


Log in to reply