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.