Hintergrundbild auf drawingArea zentrieren [ERLEDIGT]

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Hintergrundbild auf drawingArea zentrieren [ERLEDIGT]

Beitrag von Benz »

Hi,

ich habe folgenden Code:

Code: Alles auswählen

     oDlg:drawingArea:bitmap := 100
     oDlg:drawingArea:colorBG := GRA_CLR_WHITE

...

   membreite_logo := 1200
   memlaenge_logo := 484

   aSizedrawingArea := oDlg:drawingArea:currentSize()

   memxpos_logo := (aSizedrawingArea[1] - membreite_logo)/2
   memypos_logo := (aSizedrawingArea[2] - memlaenge_logo)/2

   oDlg:drawingArea:setPosAndSize( {memxpos_logo,memypos_logo},oDlg:drawingArea:currentSize())
   oDlg:drawingArea:SetColorBG( GRA_CLR_WHITE )
leider wird mit diesem Code die drawingArea verschoben und nicht das Hintergrundbild, so erscheint links neben dem Bild ein grauer Hintergrund und nicht mehr der weiße.
Gibts ne Möglichkeit nur nur das Bild zu zentrieren ??
Zuletzt geändert von Benz am Mo, 21. Okt 2013 18:04, insgesamt 1-mal geändert.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Hintergrundbild auf drawingArea zentrieren

Beitrag von brandelh »

Normalerweise ändert man nicht die Lage der drawingArea, bestenfalls ändert man die Größe des Außenfensters über Clientside ...

Die DrawingArea ist ein spezielles Fenster (XbpIWindow()) und unter Eigenschaften gibt es:

:bitmap (das Bild)
:options

Attribut: EXPORTED
Datentyp: Numerisch (XBP_IMAGE_TILED)

Beschreibung
Die Instanzvariable :options definiert Optionen für die Anzeige eines XbpIWindow-Objekts. Die folgenden Optionen werden unterstützt:
Optionen für die Anzeige von Rastergrafiken, siehe :bitmap
Konstante Beschreibung
XBP_IMAGE_NORMAL Grafik wird in der Ursprungsgröße angezeigt und wird an den Rändern abgeschnitten
XBP_IMAGE_TILED *) Grafik wird gekachelt angezeigt
XBP_IMAGE_SCALED Grafik wird auf die Größe des XbpIWindow angepaßt.

eine XBP_IMAGE_NORMAL sollte eigentlich zentriert sein ... :wink:

Falls du aber ein Control (XbpBitmap, XbpStatic) nutzt um das Bild anzuzeigen und dieses auf der Drawingarea plazierst, kannst du CenterControl(o) verwenden - vorher muss der Parent richtig sitzen !
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Hintergrundbild auf drawingArea zentrieren

Beitrag von AUGE_OHR »

hi,

wie Hubert schon sagte ist die DrawingArea kein normales XbPart sondern ein spezielles Fenster (XbpIWindow() )
wenn du nun eine Resource direkt mit der Property o:bitmap belegst solltest du folgendes bedenken :

1.) das Bitmap ist "fest" verankert mit Pos und Size
2.) das Bitmap wird nicht neu "gemalt"

zu 1.) wenn du den Dialog maximiert wird das Bitmap nicht mehr stimmen
zu 2.) wenn du den Dialog minimierst oder ein Teil verdeckt ist wird dann kann es sein
das dass Bitmap nicht oder unvollständig angezeigt wird.

wie man richtig ein Bitmap anzeigt siehe :
c:\ALASKA\XPPW32\Source\samples\apps\ImgView\ImgView.prg
oder
c:\ALASKA\XPPW32\Source\samples\basics\PRESPACE\normalps.prg

a.) mach aus der Resoure ein Bitmap Object
b.) nutzte den o:Paint Callback Slot
c.) "Presentation Space erzeugen, der mit dem Device-Kontext der drawingArea verknüpft wird"

Code: Alles auswählen

oPS := XbpPresSpace():new():create( oDlg:drawingArea:winDevice() )
in den "malst" du dein Bitmap.
gruss by OHR
Jimmy
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Re: Hintergrundbild auf drawingArea zentrieren

Beitrag von Benz »

das hört sich ja schonmal gut an ;) werde das demnächst mal versuchen, danke ;)
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Re: Hintergrundbild auf drawingArea zentrieren

Beitrag von Benz »

Hat gut funktioniert und hier noch der entsprechende Sourcecode :)

Code: Alles auswählen

  
PROCEDURE Main

.....


 oPS := XbpPresSpace():new():create( oDlg:drawingArea:winDevice() )

   oImage   := XbpBitmap():new():create( oPS )
   oImage:load(NIL,100)
   oImage:draw(oPS,{100,100})

   oDlg:show()
   oDlg:drawingarea:paint := {|x,y,obj| x:=obj:currentSize(), ;
                                              oImage:draw( oPS,{memxpos_logo,memypos_logo}),;
                                              Sleep(0.1) }

   oDlg:resize := {||  proc_pos_hintergrund_bild( @memxpos_logo ;
                            , @memypos_logo ;
                            , oDlg ;
                            , membreite_logo ;
                            , memlaenge_logo ) ;
                       ,oImage:draw( oPS,{memxpos_logo,memypos_logo}) }

RETURN


PROCEDURE proc_pos_hintergrund_bild( memxpos_logo ;
                                   , memypos_logo ;
                                   , oDlg ;
                                   , membreite_logo ;
                                   , memlaenge_logo )

   LOCAL aSizedrawingArea

   aSizedrawingArea := oDlg:drawingArea:currentSize()

   memxpos_logo := (aSizedrawingArea[1] - membreite_logo)/2
   memypos_logo := (aSizedrawingArea[2] - memlaenge_logo)/2

RETURN
Danke für Eure Hilfe!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Hintergrundbild auf drawingArea zentrieren

Beitrag von AUGE_OHR »

Benz hat geschrieben:

Code: Alles auswählen

PROCEDURE Main
...
   oDlg:drawingarea:paint := {|x,y,obj| x:=obj:currentSize(), ;
                                              oImage:draw( oPS,{memxpos_logo,memypos_logo}),;
                                              Sleep(0.1) }

   oDlg:resize := {||  proc_pos_hintergrund_bild( @memxpos_logo ;
                            , @memypos_logo ;
                            , oDlg ;
                            , membreite_logo ;
                            , memlaenge_logo ) ;
                       ,oImage:draw( oPS,{memxpos_logo,memypos_logo}) }
das sieht doch schon ganz gut aus ...
wenn ich das richtig sehe stellst du was mit dem Bild an ... und was ist mit dem Dialog selbst ?
das o:resize sollte sich auf oDialog:DrawingArea beziehen und die Parameter zwischen den "|OldSize,NewSize,oSelf|" solltest du in deine Berechnung mit einbeziehen.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Hintergrundbild auf drawingArea zentrieren [ERLEDIGT]

Beitrag von brandelh »

seit der 1.90.355 gibt es eine Funktion CenterControl(), die das zentrieren von Controls im Parent vornimmt, damit kann man sich die Rechenorgie sparen ;-)
Gruß
Hubert
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Re: Hintergrundbild auf drawingArea zentrieren [ERLEDIGT]

Beitrag von Benz »

das sieht doch schon ganz gut aus ...
wenn ich das richtig sehe stellst du was mit dem Bild an ... und was ist mit dem Dialog selbst ?
das o:resize sollte sich auf oDialog:DrawingArea beziehen und die Parameter zwischen den "

Code: Alles auswählen

|OldSize,NewSize,oSelf|
" solltest du in deine Berechnung mit einbeziehen.
Ist es schneller wenn ich

Code: Alles auswählen

|OldSize,NewSize,oSelf|
benutze, statt

Code: Alles auswählen

PROCEDURE proc_pos_hintergrund_bild( memxpos_logo ;
                                   , memypos_logo ;
                                   , oDlg ;
                                   , membreite_logo ;
                                   , memlaenge_logo )
...

   aSizedrawingArea := oDlg:drawingArea:currentSize()
...
?
Ansonsten wäre es ja prinzipiell egal, was ich nehme oder nicht? :?
seit der 1.90.355 gibt es eine Funktion CenterControl(), die das zentrieren von Controls im Parent vornimmt, damit kann man sich die Rechenorgie sparen ;-)
Das könnte ich natürlich auch noch machen :D aber prinzipiell ist es ja nicht soo viel Rechenaufwand :)
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Hintergrundbild auf drawingArea zentrieren [ERLEDIGT]

Beitrag von brandelh »

wie man die Werte berechnet, ist von der Geschwindigkeit her egal, d.h. so schnell dass man es bei einer einzelnen Berechnung nicht messen kann.
CenterControl() spart nur Tipparbeit ;-)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Hintergrundbild auf drawingArea zentrieren [ERLEDIGT]

Beitrag von AUGE_OHR »

Benz hat geschrieben:Ist es schneller wenn ich

Code: Alles auswählen

|OldSize,NewSize,oSelf|
benutze ...
nein ... damit hat es weniger zu tun.
die Parameter enthalten ja die tatsächlichen Wert welche sich bei oDlg:drawingArea

Code: Alles auswählen

oDlg:drawingArea:resize := {|OldSize,NewSize,oSelf|  proc_pos_hintergrund_bild(OldSize,NewSize,oSelf) }
während des resize ergeben. um ein unnötiges resize zu verhindern könnte z.b. so was nützlich sein.

Code: Alles auswählen

PROC proc_pos_hintergrund_bild(OldSize,NewSize,oSelf)

   IF aOldSize[1] == 0 .AND. aOldSize[2] == 0  // was minimize
      aOldSize := aNewSize
   ELSEIF aNewSize[1] == 0 .OR. aNewSize[2] == 0 // now miminized
     RETURN
   ELSEIF aNewSize[1] == aOldSize[1] .AND. aNewSize[2] == aOldSize[2] // no change
     RETURN
   ENDIF
   
   // more here
gruss by OHR
Jimmy
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Re: Hintergrundbild auf drawingArea zentrieren [ERLEDIGT]

Beitrag von Benz »

okay :) danke für eure Tipps, bin für jede Hilfestellung dankbar ;)
Antworten