| |
|
|
Bernd Krauss | Hallo, bei einem Ausdruck mit Prospeed.DLL ist der Druck viel zu klein. Wenn ich um den Faktor 10 erhöhe, dann klappt es mit manchen Druckern, auf anderen Rechner stürzt er ab. Am Bildschirm wird das Bild richtig angezeigt. Hier ist der Code für die Prozedur. Es wird das Bild = BDatei$ die Koordinaten = Bx&, By& die gewünschte Breite und Höhe = BreitX&, BreitY& und ob gedruckt werden soll = Drk% übermittelt. Kann mir jemand helfen? KompilierenMarkierenSeparieren
Proc BildAnz
parameters BDatei$, Bx&, By&, BreitX&, BreitY&, Drk%
declare BQuelle&, BBreite&, BHoehe&, neubreit&, neuhoch&
declare neubreitx&, neuhochy&, DrkKlein&, DrkBild&
declare Faktor%
let Faktor% = 10
BQuelle&=LoadExtImage(addr(BDatei$))
ifnot equ(BQuelle&,0)
BBreite& = GetBmpWidth(BQuelle&) Breite und Hoehe des Bilds
BHoehe& = GetBmpHeight(BQuelle&) ermitteln
messagebox(Str$(BBreite&),Str$(BHoehe&),0)
if gt(BBreite& / BHoehe& , BreitX& / BreitY&)
neubreit& = BreitX&
neuhoch& = BHoehe&/BBreite&*neubreit&
else
neuhoch& = BreitY&
neubreit& = BBreite&/BHoehe&*neuhoch&
endif
if drk%
let neuhoch& = neuhoch& * Faktor%
let neubreit& = neubreit& * Faktor%
DrkKlein&=CreateExtBmp(%HDC,neubreit&,neuhoch&)
SizeExtBmp (DrkKlein&,0,0,neubreit&,neuhoch&,BQuelle&,0,0,BBreite&,BHoehe&,0)
DrkBild&=CreateExtBmp(%HDC,neuhoch&,neubreit&)
Die automatische Zentrierung beim Rotieren ausgleichen
If neubreit&>=neuhoch&
neubreitx&=(neubreit&-neuhoch&)/2
Else
neubreitx&=(neuhoch&-neubreit&)/2
EndIf
neuhochy&=neubreitx&
Case neubreit&>neuhoch&:neubreitx&=-neubreitx&
Case neuhoch&>neubreit&:neuhochy&=-neuhochy&
RotateExtBmp(DrkBild&,neubreitx&,neuhochy&,neubreit&,neuhoch&,DrkKlein&,0,0,90,0)
let Bx& = Bx& * Faktor%
let By& = By& * Faktor%
CopyExtBmp(%hdc,Bx&,By&,neuhoch&,neubreit&,DrkBild&,0,0,0)
else
SizeExtBmp (%hdc,Bx&,By&,neubreit&,neuhoch&,BQuelle&,0,0,BBreite&,BHoehe&,0)
endif
endif
FreeAllExtBmps()
endproc
|
|
|
| |
|
|
|
Frank Abbing | Bitte einen lauffähigen Demoquellcode posten. Hier kann ich nirgendwo erkennen, wie dein Ausdruck vostatten gehen soll. Auch die Angabe deiner Profanversion wäre von Vorteil.
Nachtrag von iF: [tb]minimalbeispiel[/tb] |
|
|
| |
|
|
|
Bernd Krauss | Hallo Frank, vielen Dank für die rasche Antwort. Hier ist der lauffähige Quelltext, entschuldige bitte, ich kam nicht früher dazu. Voraussetzung ist die Prospeed.dll und ein Bild namens "alf.jpg" im Programmverzeichnis. Ich habe das von der Prospeed.dll als jpg-Datei genommen. Wenn man das Programm startet, sieht man, das Bild wird korrekt am Bildschirm angezeigt, wird aber zu klein und an falscher Stelle gedruckt. Der Parameter drk% in der Prozedur Bildanz spielt in diesem Programmbeispiel keine Rolle. Vielleicht ist die Prozedur ja auch viel zu kompliziert programmiert. Es soll eine JPG-Datei an einer best. Stelle in ein Rechteck eingepasst und um 90 Grad gedreht werden. Profanversion ist XProfan 10 Viele Grüße Bernd Krauss Hier also der lauffähige Quelltext: KompilierenMarkierenSeparierendeclare neudll&, Antw%
DEF LoadExtImage(1) !"ProSpeed","LoadExtImage"
DEF SizeExtBmp(11) !"ProSpeed","SizeExtBmp"
DEF CreateExtBmp(3) !"ProSpeed","CreateExtBmp"
DEF RotateExtBmp(10) !"ProSpeed","RotateExtBmp"
DEF CopyExtBmp(9) !"ProSpeed","CopyExtBmp"
DEF GetBmpWidth(1) !"ProSpeed","GetBmpWidth"
DEF GetBmpHeight(1) !"ProSpeed","GetBmpHeight"
DEF FreeAllExtBmps(0) !"ProSpeed","FreeAllExtBmps"
neudll&=usedll("ProSpeed.dll")
Proc BildAnz
parameters BDatei$, Bx&, By&, BreitX&, BreitY&, Drk%
declare BQuelle&, BBreite&, BHoehe&, neubreit&, neuhoch&
declare neubreitx&, neuhochy&, DrkKlein&, DrkBild&
BQuelle&=LoadExtImage(addr(BDatei$))
ifnot equ(BQuelle&,0)
BBreite& = GetBmpWidth(BQuelle&) Breite und Hoehe des Bilds
BHoehe& = GetBmpHeight(BQuelle&) ermitteln
Es wird geprüft, ob an Breite oder Höhe angepasst wird
if gt(BBreite& / BHoehe& , BreitX& / BreitY&)
neubreit& = BreitX&
neuhoch& = BHoehe&/BBreite&*neubreit&
else
neuhoch& = BreitY&
neubreit& = BBreite&/BHoehe&*neuhoch&
endif
DrkKlein&=CreateExtBmp(%HDC,neubreit&,neuhoch&)
SizeExtBmp (DrkKlein&,0,0,neubreit&,neuhoch&,BQuelle&,0,0,BBreite&,BHoehe&,0)
DrkBild&=CreateExtBmp(%HDC,neuhoch&,neubreit&)
Die automatische Zentrierung beim Rotieren ausgleichen
If neubreit&>=neuhoch&
neubreitx&=(neubreit&-neuhoch&)/2
Else
neubreitx&=(neuhoch&-neubreit&)/2
EndIf
neuhochy&=neubreitx&
Case neubreit&>neuhoch&:neubreitx&=-neubreitx&
Case neuhoch&>neubreit&:neuhochy&=-neuhochy&
RotateExtBmp(DrkBild&,neubreitx&,neuhochy&,neubreit&,neuhoch&,DrkKlein&,0,0,90,0)
CopyExtBmp(%hdc,Bx&,By&,neuhoch&,neubreit&,DrkBild&,0,0,0)
endif
FreeAllExtBmps()
endproc
cls
rectangle 100 , 100 , 300, 400
BildAnz "alf.jpg" , 100 , 100 , 300, 200 , 0
let Antw%=messagebox ("Willst du drucken?", "Druck?", 4)
if Antw%=6
cls
startprint
rectangle 100 , 100 , 300, 400
BildAnz "alf.jpg" , 100 , 100 , 300, 200 , 1
endprint
endif
FreeAllExtBmps()
freedll neudll&
end
|
|
|
| |
|
|
|
Frank Abbing | Ach ja, ich sehe, was du meinst. Erklären kann ich es dir aber nicht. Wird eine interne Profan-Drucker-HDC Geschichte sein. ProSpeeds CopyExtBmp() ist ja nur ein Aufruf der API BitBlt(). Und die funktioniert auch falsch, habs ausgetestet und dabei allen Schnickschnack weggelassen. Es liegt also nicht an der Dll. Wenn Roland das hier liessst, wird er sicher was dazu sagen können. Ansonsten musst du ihn mal direkt kontakten. |
|
|
| |
|
|
|
RGH | Hallo,
API-Funktionen leitet XProfan grundsätzlich unverändert weiter. API-Funktionen werden also grundsätzlich "auf eigene Gefahr" hin verwandt. Beim Drucken ist zu beachten, daß die Druckseite im Normalfall um den Faktor 10 größer ist, als die Koordinaten- und Größenangaben in XProfan. Alle Koordinatenangaben und Größenangaben beim Drucken mittels der API sind daher um diesen Faktor zu multiplizieren. (Ab XProfan 10 kann man den Faktor mittels einer Set-Funktion einstellen und mittels einer Get-Funktion auslesen. Näheres siehe Hilfe.)
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 14.02.2007 ▲ |
|
|
|
|
Bernd Krauss | Hallo Roland, vielen Dank für die schnelle Info. Mit dem Faktor 10 geht es. Der "Absturz", von dem ich anfangs schrieb hat sich aufgeklärt: Mit dem Faktor 10 dauert die Berechnung für den Druck auf meinem alten P III 600 so lange, dass ich immer dachte, der PC sei abgestürzt. Das mit der Set und Get-Funktion habe ich allerdings trotz Studium der XProfan 10 Hilfe nicht verstanden. Welche Set-Funktion soll ich nehmen und mit welcher Syntax? Und mit welcher Get Funktion soll ich was auslesen? Ich habe einfach die Koordinaten Bx& und By& und neubreit& und neuhoch& mit 10 multipliziert. Ist das auch ok? Viele Grüße Bernd |
|
|
| |
|
|
|
RGH | Bernd Krauss
Das mit der Set und Get-Funktion habe ich allerdings trotz Studium der XProfan 10 Hilfe nicht verstanden. Welche Set-Funktion soll ich nehmen und mit welcher Syntax? Und mit welcher Get Funktion soll ich was auslesen?
Großes SORRY! Da habe ich genau diese Set-Funktion in der Hilfe vergessen:
Mit @Set("PrintRes", N%) kann man den Faktor verändern. Wennn Du für N% den Wert 1 nimmst, sollte es zwar funktionieren, ohne daß Du den Faktor in Deinem Programm einbaust, aber der Ausdruck dürfte dann etwas grobkörnig sein, da nur mit etwa 80dpi (20 cm = ca. 8 Zoll. 640 Punkte auf 8 Zoll macht eben 80 Punkte/Zoll) gedruckt wird. Die Druckauflösung entspricht dann also etwa 3 Punkte/mm. Wenn das reicht, etwa für Farb-Fotos, ist das die einfachste Lösung. Bei Liniengrafiken könnten dann allerdings Treppchen zu sehen sein. (In der Standardeinstellung mit Faktor 10 entspricht die Druckauflösung etwa 800dpi ... um da Treppchen zu sehen, braucht es schon einen Laserdrucker, dünne diaogonale Linien und eine gute Lupe.)
Mit @Get("PrintRes") kann der eingestellte Wert ausgelesen werden.
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 15.02.2007 ▲ |
|
|
|
|
| RGH
Großes SORRY! Da habe ich genau diese Set-Funktion in der Hilfe vergessen:
| |
|
|
|
| |
|
|