Deutsch
Forum

Druck mit Prospeed.DLL ist zu klein

 

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

 
11.02.2007  
 




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]
 
11.02.2007  
 




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:
KompilierenMarkierenSeparieren
declare 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
 
13.02.2007  
 




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.
 
13.02.2007  
 




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
 
15.02.2007  
 




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:

 
15.02.2007  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

2.406 Betrachtungen

Unbenanntvor 0 min.
Erasmus.Herold08.05.2016
Peter Max Müller27.03.2013

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie