Druckproblem auf anderen Rechner?
-
Hallo Zusammen.
Ich habe eine Funktion, welche mir einen Text ausdruckt.
Bei mir kommt der schön so auf das Blatt wie er sollte.
Nicht verschoben nichts. Alles wird gedruckt!Doch bei jemand anderem klebt alles bei ihm am rechten rand oben links und auf dem Blatt ist nur die Hälfte zu sehen!
Wie kann ich, um dieses problem zu lösen, dem Programm die aktuellen "Druckertreiberwerte" übergeben und verarbeiten, so dass je nach drucker auch wirklich überall alles ausgedruckt / zu sehen wird / ist ??
Mein jetztiger Code sieht so aus:
CPrintDialog dlgPrint(FALSE,PD_ALLPAGES,this); UpdateData(TRUE); if (dlgPrint.DoModal()==IDOK) { CDC dcPrint; dcPrint.Attach(dlgPrint.GetPrinterDC()); DOCINFO myPrintJob; myPrintJob.cbSize = sizeof(myPrintJob); myPrintJob.lpszDocName = "Lottogen-Druckauftrag"; myPrintJob.lpszOutput = NULL; myPrintJob.lpszDatatype = NULL; myPrintJob.fwType = NULL; if (dcPrint.StartDoc(&myPrintJob)>=0) { dcPrint.StartPage(); RECT rctA; rctA.left = 100; rctA.top = 100; rctA.right = 1000; rctA.bottom = 1000; //klappt alles wunderbar bei mir. auch wenn ich anstatt 1000 einfach nur 800 //einsetze und anstatt rectA.left=100 30, und bei top 50 schreibe. Bei mir //gehts. Beim anderen klebts einfach fest???! dcPrint.DrawText(m_sText, &rctA, DT_CENTER); //DT_CENTER bringt nichts, klebt //woanders trotzdem am linken oberen rand! dcPrint.EndPage(); dcPrint.EndDoc(); } dcPrint.DeleteDC(); }
Könnte mir jemand Helfen??
mfg
ProTHX zum Voraus!
-
Jeder Drucker hat eine andere Auflösung. Sogra auf einem Drucker gibt es verschiedene Auflösungen.
Du musst dir die Auflösung berechen.
GetDeviceCaps(VERTRES)
GetDeviceCaps(VERTSIZE)
GetDeviceCaps(HORZSIZE)
GetDeviceCaps(HORZRES)mal als Stichworte.
Lies das Buch Vc++ 6 in 21 Tagen. Gibts Online zu lesen.
-
Das Problem habe ich leider auch.
Nun ich komme mit den Druckfuntkionen nicht zurecht und höre das hier GetDeviceCaps zum ersten mal.Ganz und Gut, aber wie berechne ich das das es je nach Drucker automatisch berechnet und dann zentriert auf dem Blatt ausgibt???
Ich habe keinen schimmer einer Ahnung, obwohl ich VC++ in 21 Tagen gelesen habe!!! www.mut.chNoch was: kann mir nun jemand ein Beispiel dazu geben???
dankemfg
UNBEKANNT & Co. ** Auch programmer is dabei.. grins!!
BNE ich bins
-
Als kleine Hilfe.
Gedruckt wird immer in ZOLL. Auf den Druckern ist aber die Anzahl Druckpunkte pro Zoll je nach Auflösung nicht gleich.
Dies muss man berechnen. Will man jetzt eine Linie von 1 Zoll Zeichnen (Drucken ist ja auch nur Zeichnen) muss man erst schauen wieviele Punkte auf dem aktuellen Druker 1 Zoll entspricht und dann die Zeichenroutine anpassen. Jeder Stifft zum Zeichnen hat eine Punktbreite und einiges mehr. Dies muss man alles Berücksichtigen.
Wie ihr seht ist es nicht so einfach zu Drucken.
Es gibt aber LIBS dafür.
-
Das stimmt, ist mir auch schon aufgefallen.
Es gibt Libs dafür? wo denn?
mfg
Pro
-
Ich hab den Code jetzt mal so:
//... int var_hor1; int var_hor2; int var_vert1; int var_vert2; var_vert1 = dcPrint.GetDeviceCaps(VERTRES); var_vert2 = dcPrint.GetDeviceCaps(VERTSIZE); var_hor1 = dcPrint.GetDeviceCaps(HORZSIZE); var_hor2 = dcPrint.GetDeviceCaps(HORZRES); //Und wie komm ich jetzt an die LEFT, TOP, RIGHT, BOTTOM ??? RECT rctA; rctA.left = 100; rctA.top = 100; rctA.right = 1000; rctA.bottom = 1000; //,...
Nun ich frage mich, wie bringe ich jetzt die gegebene Daten von den INT auf rctA.left über etc??
Mit rctA.left = var_vert1; oder mit rctA.left = dcPrint.GetCurrentPen(); oder so, gehts auch net!
Warum dat denn? und wie muss ich dat machen?
mfg
Pro
-
Ein einfacher Ansatz wäre sowas.
RECT rctA; rctA.left = (100 * dcPrint.GetDeviceCaps(LOGPIXELSX)) / 600; rctA.top = (100 * dcPrint.GetDeviceCaps(LOGPIXELSY)) / 600; rctA.right = (1000 * dcPrint.GetDeviceCaps(LOGPIXELSX)) / 600; rctA.bottom = (1000 * dcPrint.GetDeviceCaps(LOGPIXELSY)) / 600;
Dabei ist 600 nur ein Beispiel. Nimm hier die Auflösung (in dpi) Deines Druckers für den Du Dein Layout ausgetüftelt hast und bei dem alles klappte.
Du solltest natürlich auch die Schriftgröße der Auflösung anpassen:
LOGFONT LogFont; LogFont.lfHeight = -MulDiv(10, GetDeviceCaps(dcPrint,LOGPIXELSY), 72); //MSDN Beispiel
Man muß halt ziemlich viel "zu Fuß" erledigen beim Drucken...
Gruß T.
-
Theo schrieb:
Man muß halt ziemlich viel "zu Fuß" erledigen beim Drucken...
Gruß T.
Das ist mir zumindest jetzt auch klar geworde *grins*!
Thx für dein Ansatz!Kann damit viel anfangen.
mfg
Pro
-
danke nochmals an alle!
Hat wunderbar geklappt!Das 600 einfach auf 200 oder 100 runterschrauben, dann klappts!
mfg
ProTipp: Ev. FAQ?