Seite 1 von 1

XbpPresSpace - pageSize, viewPort, origin ?

Verfasst: Sa, 30. Sep 2017 21:13
von georg
Guten Abend -


mal wieder ein Alaska-Beispiel und eine Reihe fragen dazu. Das PreView-Beispiel erlaubt es, in einem XbpStatic() eine Druckvorschau zu realisieren.

Das klappt deshalb so gut, weil das Vorschau-Objekt das gleiche Seitenverhältnis hat wie die (theoretisch) zu druckende Seite.

Was nun, wenn ich ein quadratisches Vorschau-Objekt haben will, in dem eine DIN A4-Seite dargestellt wird? (Klar, ich muss dann in die eine oder andere Richtung scrollen, aber das nimmt man in dem Fall in Kauf.)

Also etwa so:

Code: Alles auswählen

PPPPPPPP-------------
PPPPPPPP-------------
PPPPPPPP-------------
PPPPPPPP-------------
---------------------
---------------------
---------------------
---------------------
---------------------
---------------------
Die Striche sollen die Seite darstellen, die P den sichbaren Ausschnitt.

Wie realisiert man so etwas?

Re: XbpPresSpace - pageSize, viewPort, origin ?

Verfasst: Sa, 30. Sep 2017 21:27
von Martin Altmann
Hallo Georg,
das ist doch mit dem Zoomfaktor in dem Beispiel realisiert.
Ich habe hier auch eine Anpassung veröffentlicht - beliebig viele Seiten, anspringbar und einzeln/komplett druckbar.
Hier :arrow: http://www.xbaseforum.de/viewtopic.php? ... d=a#p36025

Viele Grüße,
Martin

Re: XbpPresSpace - pageSize, viewPort, origin ?

Verfasst: So, 01. Okt 2017 8:19
von georg
Guten Morgen, Martin -


werde ich mir gerne anschauen, allerdings muss ich da wohl erst einmal ein wenig "umbauen", da ich XClass nicht einsetze.

Re: XbpPresSpace - pageSize, viewPort, origin ?

Verfasst: So, 01. Okt 2017 9:23
von Martin Altmann
Moin Georg,
ersetze ds durch Xbp, dann kannst du den Compiler anschmeißen. Dann meckert er nur noch einzelne Methoden oder iVars an - diese Zeilen dann einfach löschen. Sollte erst Mal klappen.

Viele Grüße,
Martin

Re: XbpPresSpace - pageSize, viewPort, origin ?

Verfasst: So, 01. Okt 2017 14:51
von DelUser01
Hallo Georg

wie Martin schon schreibt kann man das mit dem Zoomfaktor aus dem Alaska-Beispiel heraus realisieren.
Habe meine Print-Vorschau vor einiger Zeit auch daraus weiterentwickelt. Nur das mit dem Verschieben des vergrößerten Bereichs (Balken oder Maus) habe ich nicht - ob das machbar ist? Könnte mir aber vorstellen dass man das anders machen muss. Mit dem Beispiel-Ansatz wäre es vermutlich zu langsam. Das müsste irgendwie "virtuell" gehen - wie in einem Bilder-Viewer.
XClass verwende ich dabei nicht.

Re: XbpPresSpace - pageSize, viewPort, origin ?

Verfasst: So, 01. Okt 2017 18:05
von georg
Hallo,


also ich komme mit dem Zoom-Beispiel in Bezug auf mein Problem nicht klar.

Solange das Verhältnis des XbpPreview-Objektes und des "Papiers" 1:1 ist, passt alles. Aber das XbpPreview-Objekt soll z.B. quadratisch sein und das "Papier" trotzdem DIN A4. Zumindest in meinen Versuchen hat das nicht funktioniert.

Re: XbpPresSpace - pageSize, viewPort, origin ?

Verfasst: So, 01. Okt 2017 18:31
von Martin Altmann
Hallo Georg,
anbei mein überarbeitetes prg - sollte sich jetzt auch ohne XClass++ compilieren lassen.
In Main wird das Dialogfenster gebaut und in FormatPage der Aufbau der Vorschau. Das ist das (auf meine Erweiterung angepasste) Beispiel, das Alaska mitliefert.
Bei mir bleibt das Seitenverhältnis erhalten - man kann aber vergrößern und dann den sichtbaren Ausschnitt verschieben.
Wenn Du mit einem entsprechend kleinen Fenster und großen Standard-Zoomfaktor experimentierst, solltest Du dem schon recht nahe kommen.

Viele Grüße,
Martin

Re: XbpPresSpace - pageSize, viewPort, origin ?

Verfasst: So, 01. Okt 2017 18:59
von Martin Altmann
Das Seitenverhältnis im DIN-Format ist immer 1:2^0,5 (1 zu Wurzel aus 2). Du musst also beim Zoomfaktor für Breite und Höhe einen entsprechend unterschiedlichen Faktor anwenden, der dem entgegengesetzt ist. Allerdings natürlich im umgekehrtem Verhältnis ;-)

Viele Grüße,
Martin

Re: XbpPresSpace - pageSize, viewPort, origin ?

Verfasst: Mo, 02. Okt 2017 1:12
von DelUser01
Hallo Martin

aber wie willst Du den gezoomten Bereich verschieben?

Re: XbpPresSpace - pageSize, viewPort, origin ?

Verfasst: Mo, 02. Okt 2017 2:09
von Martin Altmann
:?: Roland,
ich verstehe deine Frage nicht. Dafür gibt es doch die Bildlaufleisten rechts und unten.

Viele Grüße,
Martin

Re: XbpPresSpace - pageSize, viewPort, origin ?

Verfasst: Mo, 02. Okt 2017 3:17
von AUGE_OHR
DelUser01 hat geschrieben: Mo, 02. Okt 2017 1:12 aber wie willst Du den gezoomten Bereich verschieben?
mit dem Finger ... wie auch ZOOM ;-)

im Alaska Beispiel gibt es ja Scrollbars welche die Method SetOrigin(x,y) aufruft.
das "malen" passiert im

Code: Alles auswählen

::oView:drawingArea:paint := {|| ::drawPage() }
Touch und Maus arbeiten ähnlich.

verschieben :
LbDown -> aOldPos / move / LbUp -> aNewPos
damit kann ich nun den X und Y Scrollbar ansteuern

zoom:
am einfachsten mit

Code: Alles auswählen

      ::DrawingArea:wheel := {|aPos, aWheel, oSelf| ::_Zoom(aPos, aWheel, oSelf) }
      ::wheel := {|aPos, aWheel, oSelf| ::_Zoom(aPos, aWheel, oSelf) }
nun kann man per Maus-Wheel + Ctrl

Code: Alles auswählen

      IF nKey = MK_CONTROL
         IF nWheel >= 360                        // 65416
            nWheel := -120
         ENDIF
         ::_Zoom(aPos, {nKey,nWheel}, ::DrawingArea )
oder mit 2 Finger -> spreizen um ein ZOOM auszuführen.

... und wer es per API mit ot4xb machen will

Code: Alles auswählen

CLASS DXE_Dialog FROM XbpDialog

   ::hWnd := ::GetHWnd()

#IFDEF Use_Pablo
   ot4xb_SubclassWindow( ::hWnd, Self)

INLINE METHOD WndProc( hWnd , nMsg , wp , lp )
LOCAL aPos   := {0,0}
LOCAL nWheel := 0
LOCAL nKey   := 0

   // here Mouse Wheel Event
   ELSEIF nMsg == WM_MOUSEWHEEL
      nKey   := LoWord(wP)
      nWheel := HiWord(wP)

      aPos[1]:= LoWord(lp)
      aPos[2]:= HiWord(lp)

      IF nKey = MK_CONTROL
         IF nWheel >= 360                        // 65416
            nWheel := -120
         ENDIF
         ::_Zoom(aPos, {nKey,nWheel}, ::DrawingArea )
      ENDIF
   ENDIF
RETURN

#ELSE
   ::DrawingArea:wheel := {|aPos, aWheel, oSelf| ::_Zoom(aPos, aWheel, oSelf) }
   ::wheel := {|aPos, aWheel, oSelf| ::_Zoom(aPos, aWheel, oSelf) }
#ENDIF

Re: XbpPresSpace - pageSize, viewPort, origin ?

Verfasst: Mo, 02. Okt 2017 6:18
von brandelh
Bei meiner Druckerklasse gibt es eine Datei (HBPRINTD.PRG), die als Druckerauswahl (mit/ohne Druckvorschau) dient,
da kannst du sehen wie ich die einzelnen Gra-Funktionen nutze um einmal zu drucken und einmal für die Vorschau (je nach oPS).

Re: XbpPresSpace - pageSize, viewPort, origin ?

Verfasst: Mo, 02. Okt 2017 14:18
von georg
Hallo,


erst einmal vielen Dank, zuerst an Martin für die Bereitstellung dieser gut ausgearbeiteten Klasse, sowie die ganzen Hinweise. Ich habe mir die ganzen Methoden, die rund um :zoom() aufgerufen werden, mal angeschaut und habe wieder ein wenig mehr verstanden.

Mal sehen, ob ich das umsetzen kann. Wenn nicht - melde ich mich :D