Drucken im Briefmarken Format?



  • Hallo.

    Ich habe mir eine DirectDraw Anwendung geschrieben, wo ich einen Ausschnitt (BMP) drucken kann. Leider muss ich feststellen, das auf unterschiedlichen Druckern, der Ausdruck unterschiedlich gross ist. Mal Briefmarken Grösse mal riessig das man 4 Blätter für bräuchte.

    Kann mir jemand im untenstehenden Quelle den Fehler aufzeigen bzw was fehlt?

    Momentan beeinflusse ich extern (ini-datei) durch xdruckmult und ydruckmult die Blattgrösse. Was aber keine Dauerlösung sein kann. Kennt sich jemand in diesem Gebiet etwas aus?

    int StartPrint(char *druckername, char *printjobname, char *startfilename, int numberofpages, int printgraphic, int options)
    {
    	HDC	printDC;
    	static DOCINFO di;
    	int	printjobID;
    	bool stretch=false, landscape=false, portrait=true;
    	char text[512];
    
    	if (options & SPO_STRETCH)		// Druck auf Seite vergrössern
    		stretch	= true;	
    
    	if (options & SPO_LANDSCAPE)	// Querformat	
    	{
    		landscape = true;
    		portrait  = false;
    	}
    	else if (options & SPO_PORTRAIT)// Hochformat
    	{
    		landscape = false;
    		portrait  = true;
    	}	
    
    	// DC vom Drucker erstellen
    	printDC = GetPrinterDC(druckername);	
    	if (printDC==NULL)
    	{
    		sprintf(text,"PrinterDC konnte nicht erstellt werden für: %s",druckername);
    		Error(text);
    	}
    
    	// Daten zum Druckauftrag
    	di.cbSize		= sizeof(DOCINFO);
    	di.lpszDocName	= printjobname;
    	di.fwType		= NULL;
    	di.lpszDatatype	= NULL;
    	di.lpszOutput	= NULL;
    
    	if (printDC != NULL)
    	{
    		printjobID=StartDoc(printDC, &di);
    
    		if (printjobID > 0)	// Neuen Druckauftrag anfangen
    		{
    			StartPage(printDC);
    
    			HBITMAP hBitmap, hbmNew;    
    			hBitmap = (HBITMAP)LoadImage(NULL, startfilename, IMAGE_BITMAP, 0, 0, 
    			LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE); 
    			HDC hdcSrc = CreateCompatibleDC(NULL);
    			BITMAP bm;
    			GetObject(hBitmap, sizeof(bm), &bm);
    			SelectObject(hdcSrc, hBitmap);
    			hbmNew = CreateBitmap(bm.bmWidth, bm.bmHeight, bm.bmPlanes, bm.bmBitsPixel, NULL);
    			StretchBlt(printDC,xanfang,yanfang,int(640*xdruckmult),int(840*ydruckmult),hdcSrc,0,0,640,840,SRCCOPY);
    			DeleteDC(hdcSrc);
    
    			// Seite schliessen
    			EndPage(printDC);
    
    			// Druckauftrag beenden
    			EndDoc(printDC);
    		}
    		else
    		{
    			// Fehler
    			return -1;
    		}
    		// DC vom Drucker löschen
    		DeleteDC(printDC);
    
    		return printjobID;
    	}
    	else
    	{
    		// Fehler
    	}
    
    	return -1;
    }
    


  • Da fehlt SetMapMode 🙂

    PS: Die y-Koordinaten sind jetzt negativ!



  • Danke für die Antwort. Auf welchen Wert muss man denn SetMapMode stellen, damit es bei allen Druckern gleich gross ausdruckt?
    Und inwiefern ist y negativ? Das Blatt wird so sauber gedruckt, man muss es nur gegebenfalls mit xdruckmult und ydruckmult strecken.

    Hat eventuell jemand einen "sauberen" fertigen Code? 😉



  • Welchen MapMode du nimmst ist egal, die anderen haben alledie Eigenschaft, dass es auf allen Geräten gleich aussieht und y negativ ist. 😃
    Wenn du nix weisst, nimm MM_HIMETRIC.


Anmelden zum Antworten