Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 249466 (10902)
  Suchen
 Zurück zur Übersicht
 AutorThema: JPGs usw. mit PROFAN² drucken
Stephan Sonneborn
Datum:13.09.01 20:39 Antwortenals Email verschicken (stephans_email@freenet.de) 


Hallo zusammen,

ich habe ein Etiketten-Druckprogramm geschrieben und kann leider zur Zeit nur BMPs und RLEs drucken. Mit Hilfe der NViewLib.DLL kann ich zwar die Bilder anzeigen, aber leider kann ich sie nicht ausdrucken. Ich weiß zumindest nicht wie.

Die Druckroutine meines Programms funktioniert entsprechend der Bildschirmausgabe, nur daß im Falle des Druckens die StartPrint/EndPrint-Befehle gesetzt werden. Es ist ein-und-dieselbe Prozedur. Die StartPrint/Endprint-Befehle werden durch einen übergebenen Parameter geschaltet oder eben nicht.

Es ist bei der Ausgabe der Grafiken wichtig, sowohl die Lage, als auch die Größe variabel zu gestalten. Daher kommt zur Zeit auch LoadSizedBmp zum Einsatz.

Hat jemand eine Idee, wie man JPGs mit einem "LoadSizedJPG" :-) anzuzeigen und vor allem auszudrucken?

Danke schon im Voraus von
Stephan


Marcel Pursche
Datum:14.09.01 14:18 Antwortenals Email verschicken (mp05@metropolis.de) 


Hallo,
Du könntest zuerst die JPG in die Memory-Bitmap laden und dann die Memory-Bitmap drucken.

Ein Beispiel:

$I NViewLib.inc

MCLS GrößeX%,GrößeY%
StartPaint -1
LoadSizedPic 0,0,GrößeX%,GrößeY%,1
EndPaint
StartPrint
MCopyBmp 0,0-GrößeX%,GrößeY%>0,0;0
EndPrint



Stephan Sonneborn
Datum:14.09.01 20:14 Antwortenals Email verschicken (stephans_email@freenet.de) 


Danke Marcel,

nur leider klappt das so nicht. Ich habe das schon mal so versucht. Das Problem ist folgendes:
Ich stelle verschiedene Objekte zur Verfügung, die auf dem Etikett erscheinen können: Texte, Bilder, Numerierungen, Linien, Flächen usw. Jedes Objekt ist ein Datensatz in einer dBase-Datenbank. Beim Drucken (und auch beim Anzeigen auf dem Bildschirm) wird jedes Objekt eingelesen und seinem Typ entsprechend angezeigt bzw. ausgedruckt.

Beim Druckvorgang steht das StartPrint VOR dem Suchen des ersten Objektes in der Datenbank und EndPrint nach der Ausgabe des letzten.

Leider darf man den MCLS-Befehl (ebenso wie StartPaint/EndPaint nicht während StartPrint/Endprint benutzen (Warum eigentlich nicht? StartPaint -1 sollte doch möglich sein...!) Und das muß ich machen, weil ja ein Bild nicht unbedingt das erste oder das letzte Objekt der Datenbank ist. Außerdem können auch mehrere verschiedene Bilder auf dem Etikett vorhanden sein...

Gibts noch einen anderen Weg?


Jörg Sellmeyer
Datum:15.09.01 01:17 Antwortenals Email verschicken (joerse@gmx.de) 


Hallo Stephan,
Vielleicht kannst Du Dein Komplettes Formular zunächst (entsprechend skaliert)
auf eine Speicherbitmap bringen, um diese dann auszudrucken.
Jörg


Stephan Sonneborn
Datum:15.09.01 10:28 Antwortenals Email verschicken (stephans_email@freenet.de) 


Hallo Jörg,

ja, genau das werde ich jetzt mal ausprobieren. Ich war mir nur nicht sicher, ob Texte und Linien usw. auch auf diese Speicherbitmap (StartPaint -1) geschrieben werden und vor allem dort mit einem Bitmap-Kopierbefehl auch wieder zurückzuholen sind...

Aber ich probiers gleich mal aus! Danke!

Gruß Stephan


Stephan Sonneborn
Datum:15.09.01 10:38 Antwortenals Email verschicken (stephans_email@freenet.de) 


Mist!

Alle MCopy***-Befehle sind während der Druckausgabe nicht zugelassen...

Roland, warum eigentlich nicht???

Gruß Stephan


Sebastian Sprenger
Datum:15.09.01 11:01 Antwortenals Email verschicken (prof.chaos@netcologne.de) 


Hallo Stephan,
wenn du die Speicher-Bitmap speicherst, und dann während der Druckausgabe mit LoadBmp lädst, müsste es klappen.
Sebastian


Marcel Pursche
Datum:15.09.01 11:05 Antwortenals Email verschicken (mp05@metropolis.de) 


Hallo,
Speichere doch die Memory-Bitmap vorher als Temp.bmp und lade sie dann mit LoadBmp "Temp.bmp",0,0;0. Zum Speichern der Memory-Bitmap verwende ich:

StartPaint -1
SaveBmp "Temp.bmp",0,0-GrößeX%,GrößeY%
EndPaint


Marcel Pursche
Datum:15.09.01 11:11 Antwortenals Email verschicken (mp05@metropolis.de) 


Ups da hab ich woll einen Beitrag übersehen und nochmal die selbe Idee gepostet.


Stephan Sonneborn
Datum:15.09.01 11:52 Antwortenals Email verschicken (stephans_email@freenet.de) 


Hallo!

Das habe ich in der Zwischenzeit auch probiert. Klappt auch ganz gut.

ABER:
Leider wird die Memory-Bitmap nur mit 72dpi gespeichert. Das ist für den Bildschirm auch völlig ausreichend. Nur beim Drucken kommt selbst die TT-Schrift Arial gerastert daher...

Aber ich denke, wir sind auf dem richtigen Weg... Mal sehen, ich werde noch ein wenig herumprobieren. Aber vielleicht hat jemand eine Idee, wie man die Auflösung der Memory-Bitmap erhöhen könnte.

Danke schonmal für Eure Hilfe!

Gruß Stephan



Dennis Schulmeister
Datum:15.09.01 13:04 Antwortenals Email verschicken (Dennis.Schulmeister@web.de) 


Hallo Stephan,

probiere mal, ob die 720 dpi erreichen kannst,
in dem du in der Memorybitmap alles 10x größer
erstellst und natürlich auch 10x größer abspeicherst.
Ausdrucken dann natürlich in normaler Größe.
Ist nur so eine Idee. Muß nicht unbedingt funktionieren.

Dennis


Sebastian Sprenger
Datum:15.09.01 13:06 Antwortenals Email verschicken (prof.chaos@netcologne.de) 


Hallo,
hier ist noch eine andere Lösung, leider nicht so einfach wie das mit der Speicher-Bitmap, aber unschöne Ecken gibt es da nicht ...

$I NVIEWLIB.INC

def LockWindowUpdate(1) !"USER32","LockWindowUpdate"
window 200,200-600,300
settruecolor 1

usefont "Arial",60,13,1,1,0
textcolor rgb(64,128,255),-1
drawtext 5,10,"Was willst du?"  ' Blödsinn schreiben

declare xx%,yy%
let xx%=width(%hwnd)
let yy%=height(%hwnd)           ' Fenstergröße ermitteln
mcls xx%,yy%                    ' Eine Speicher-Bitmap daraus anlegen
copybmptomem 0,0-xx%,yy%>0,0    ' Das, was da gerade im Fenster steht, reinkopieren
LockWindowUpdate(%hwnd)         ' Und das Fenster einfrieren, damit niemand etwas sieht

loadpic "CAT.TGA",0,0,1         ' LoadSizedPic wird nicht funktionieren!
usefont "Arial",60,12,1,1,0
textcolor rgb(192,255,32),-1
drawtext 5,10,"Ich? Gar nichts!"' Noch mehr Blödsinn schreiben
savebmp "TEST.BMP",0,0-200,70   ' Und die Bitmap speichern

mcopybmp 0,0-xx%,yy%>0,0;0      ' Das, was vorher im Fenster stand, wieder ins Bild reinkopieren
LockWindowUpdate(0)             ' Und das Fenster wieder auftauen
Sebastian


Bernhard Künzel
Datum:15.09.01 21:14 Antwortenals Email verschicken (b.kuenzel@chello.at) 


Hallo Stephan,
Hier eine Lösung zum anzeigen und drucken von jpg und bmp Dateien
---------------------------------------------
'>>>>>Headerdatei>>>>>>>>>>>>>>>>>
LoadBitMapEx( = External("NViewLib.DLL","NViewLibLoad",;
'Par1:Addr. Bildname
'Par2:Fortschrittbalken 0=aus 1=ein
'Ergebnis: BildHandle
BmpX( = External("NViewLib.DLL","GetWidth";
'Ergebnis: Breite
BmpY( = External("NViewLib.DLL","GetHeight";
'Ergebnis: Höhe
CreateCompatibleDC( = External("gdi32","CreateCompatibleDC",;
StretchBlt( = External("gdi32","StretchBlt",;
DeleteDC( = External("GDI32","DeleteDC",;
'>>>>>ENDE Headerdatei>>>>>>>>>>>>>>>>>

Declare hNViewLib&,MemDc&
Def IsDrucker(0) Equ(%HDC,%HDC2)
'Ergebnis= 1 Drucker eingeschaltet
' 0 Drucker ausgeschaltet
'//am Anfang des Programms
hNViewLib&=UseDLL("NViewLib.DLL")
MemDc&=~CreateCompatibleDC(%HDC) 'darf nicht in der Druckerschleife gesetzt werden
'// MemDC& gilt für das ganze Programm

Proc JpgTest
'//diese Procedur kann unverändert für den Bildschirm und zum Drucken verwendet werden
'//kann auch bei bmp-Dateien verwendet werden
Parameters Datei$,Xa&,Ya&,Breite&,Höhe&
Declare HOldBild&,hGrafik&
hGrafik&=~LoadBitMapEx(ADDR(Datei$),0)
If hGrafik&
If IsDrucker()
Xa&=Xa& * 10
Ya&=Ya& * 10
Breite&=Breite& * 10
Höhe&=Höhe& * 10
EndIf
HOldBild&=~SelectObject(MemDC&,hGrafik&)
~StretchBlt(%HDC,Xa&,Ya&,Breite&,Höhe&,MemDC&,0,0,~BmpX(),~BmpY(),$CC0020)
DeleteObject hOldBild&
DeleteObject hGrafik&
Else 'Fehler beim laden des Orginalbildes
MessageBox("Beim laden der Grafikdatei ist ein Fehler aufgetreten!","Grafikanzeige",16)
EndIf
EndProc
'//am Ende des Programms
~DeleteDC(DRD#.MemDC&)
FreeDll hNViewLib&
-----------------------------------------------
sollte etwas noch unklar sein, kannst du mir ein eMail senden.

MFG
Bernhard



Bernhard Künzel
Datum: 15.09.01 21:26 Antwortenals Email verschicken (b.kuenzel@chello.at) 


Hallo Stephan,
bei einer Zeile hat sich ein Fehler eingeschlichen, da ich alles bei mir in Bereichen gespeichet habe

'//am Ende des Programms
Ist Falsch >>>> ~DeleteDC(DRD#.MemDC&)
muß richtig lauten ~DeleteDC(MemDC&)

MFG
Bernhard




 Zurück zur Übersicht