XBP_PP_ORIGIN / XBP_ORIGIN_TOPLEFT

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
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

XBP_PP_ORIGIN / XBP_ORIGIN_TOPLEFT

Beitrag von AUGE_OHR »

ich hatte ein Demo Code mit XBP_ORIGIN_TOPLEFT wo ich einige Zeit benötigt habe um die DXE LIBl anzupassen.
da ich vorhabe alle DXE Module auch XBP_ORIGIN_TOPLEFT fähig zu machen frage ich nach weiteren Tips.

die Position einer ComboBox() ist ja meistens Negativ ( zum Parent ) damit man das SLE Feld sieht.
bei XBP_ORIGIN_TOPLEFT ist das 0 ( Zero ) ;)

bei welchen anderen XbParts hat man noch solche Effekte ?
kann man den Form-Designer auf XBP_PP_ORIGIN / XBP_ORIGIN_TOPLEFT trimmen ?
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: XBP_PP_ORIGIN / XBP_ORIGIN_TOPLEFT

Beitrag von Jan »

Hallo Jimmy,

ich arbeite seit vielen Jahren grundsätzlich mit TopLeft. Sowohl in der GUI als auch im Druck. Das klappt absolut reibungslos mit allen XBParts.

Was meinst Du mit negativer Position bzw. 0 bei ComboBox()?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: XBP_PP_ORIGIN / XBP_ORIGIN_TOPLEFT

Beitrag von AUGE_OHR »

Jan hat geschrieben:Was meinst Du mit negativer Position bzw. 0 bei ComboBox()?
habe jeweils +/- 100 im Demo eingefügt

Code: Alles auswählen

#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Font.ch"

PROCEDURE Main
LOCAL nEvent, mp1, mp2, aSize
LOCAL oDlg, oXbp, drawingArea, aEditControls := {}, oXbp1
LOCAL aDays := { "Montag" , "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag" , "Sonntag" } 
LOCAL i

   IF IsMemberVar(XbpDialog(),"ClientSize") == .T.
      aSize := {0,0}
   ELSE
      aSize := {286,149}
   ENDIF
   
   oDlg := XbpDialog():new( AppDesktop(), , {32,114}, aSize, , .F.)
   IF aSize[1] == 0 .AND. aSize[2] == 0
      oDlg:ClientSize := {270,110}
   ENDIF
   oDlg:taskList := .T.
   oDlg:title := "Combobox on Static"
   oDlg:create()

   drawingArea := oDlg:drawingArea
   drawingArea:setFontCompoundName( "8.Arial" )

   oXbp1 := XbpStatic():new( drawingArea, , {10,50}, {240,36}, { { XBP_PP_BGCLR, -255 } } )
   oXbp1:caption := "Gruppe"
   oXbp1:clipSiblings := .T.
   oXbp1:type := XBPSTATIC_TYPE_GROUPBOX
   oXbp1:create()

   oXbp := XbpCombobox():new( oXbp1, , {4,4-100}, {104,20+100}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oXbp:tabstop := .T.
   oXbp:create()
   i := 1
   FOR i := 1 TO 7
      oXbp:addItem( aDays[i] ) 
   NEXT

   oXbp := XbpCombobox():new( oXbp1, , {132,4-100}, {104,20+100}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oXbp:tabstop := .T.
   oXbp:create()
   i := 1
   FOR i := 1 TO 7
      oXbp:addItem( aDays[i] ) 
   NEXT

   CenterControl(oDlg)
   oDlg:show()
   SetAppFocus(oDlg)

   nEvent := xbe_None
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO
RETURN
der oCombo:XbpSLE Teil soll ja immer sichtbar sein aber die "Höhe" der Listbox geht ja nach unten.
wenn ich also die Listbox grösser machen will muss ich die Y-Position um den selben Betrag "negativ" verschieben damit der oCombo:XbpSLE Teil "relative" auf Höhe 0 ist.

das hatte zur Folge, bei dem Programm mit XBP_ORIGIN_TOPLEFT, das nach dem Resize (Pos/Size) die DXE Controls "verschwunden" waren und ich nicht verstand "warum" :banghead:
... bis ich XBP_ORIGIN_TOPLEFT fand.

bei der ComboBox bemerkte das beim resize dass oCombo:XbpSLE dabei auf Hohe 0 zu platzieren ist und die SIZE tatsächlich "positiv" gedacht scheint.

ich muss also nun die Situationen finden wo ich "zu viel" Berechnung mache die für XBP_ORIGIN_BOTTOMLEFT notwendig waren wie dieses Beispiel.

Code: Alles auswählen

// ermittelt aktuelle Maus Position
FUNCTION GetCursorPos()
LOCAL cBuffer    := SPACE( 8 )
LOCAL aPos := { nil, nil }
LOCAL aSize := AppDeskTop():CurrentSize()

   DllCall( "User32.DLL", DLL_STDCALL, "GetCursorPos", @cBuffer )

   aPos[ 1 ] := Bin2U( SUBSTR( cBuffer, 1, 4 ) )
   aPos[ 2 ] := Bin2U( SUBSTR( cBuffer, 5, 4 ) )

   ***** For Xbase++ Coordinates, Bottom Left == 0,0  use.....
   aPos[ 2 ] := aSize[ 2 ] - aPos[ 2 ]

RETURN aPos
gruss by OHR
Jimmy
Antworten