Höhe Tabs in XbpTabpage

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Höhe Tabs in XbpTabpage

Beitrag von Jan »

Weiß jemand, wie man die Höhe der Reiter in XbpTabpage auslesen kann? Mit :tabHeight komme ich da nicht wirklich weiter. Das gibt -1 zurück, was lt. Onlinehilfe das 1,5fache der Titelzeile ausmachen soll. Aber stimmt das denn immer? Was ist mit Tabpages mit mehrzeiligen Captions, oder Icons dadrin? Dann verändert sich doch auch die Höhe?

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: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Höhe Tabs in XbpTabpage

Beitrag von AUGE_OHR »

Jan hat geschrieben:Weiß jemand, wie man die Höhe der Reiter in XbpTabpage auslesen kann? Mit :tabHeight komme ich da nicht wirklich weiter. Das gibt -1 zurück, was lt. Onlinehilfe das 1,5fache der Titelzeile ausmachen soll. Aber stimmt das denn immer? Was ist mit Tabpages mit mehrzeiligen Captions, oder Icons dadrin? Dann verändert sich doch auch die Höhe?
PDR 4294, public.xbase++.bugreport, 20. April 2001
> +-------+
> | Tab height = -1 :-(
> +--------
> |
> | actual page height ????
> |
> |
> +---------

oTab:ClientSize()

which gives the size of the client area of the tabpage - without tab. This was
introduced in 1.6.
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Höhe Tabs in XbpTabpage

Beitrag von Jan »

Hallo Jimmy,

ja, das passt. Muchas Danke!

Hattest Du hier im Forum nicht mal irgendwo eine Aufstellung gemacht, was für Maße man so alles rausbekommen kann? Borderbreite, Titelleistenhöhe, etc.?

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: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Höhe Tabs in XbpTabpage

Beitrag von AUGE_OHR »

hi,
Jan hat geschrieben: Hattest Du hier im Forum nicht mal irgendwo eine Aufstellung gemacht, was für Maße man so alles rausbekommen kann? Borderbreite, Titelleistenhöhe, etc.?
Border war wegen den verschiedenen Xbpstatic und der Grösse der :DrawingArea. Ich hatte dazu
ein Sample gemacht.

Titleleisten Höhe und Schrift Type des :Title war in Zusammenhang mit "Button in der Titlebar".
Leider stimmt das ganze bei VISTA nicht mehr ... die 3 Buttons sind ja nicht mehr "quadratisch" ...
wenn du was darüber findest beim googlen, sag Bescheid ... ich habe mich darum noch nicht
gekümmert ...
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Höhe Tabs in XbpTabpage

Beitrag von AUGE_OHR »

hi,

hab mal gerade "geguckt" und festgestellt das ich 2 Lösungen hatte und keine Lust die auszu-
probieren. Die eine geht über die API

Code: Alles auswählen

#define SM_CYCAPTION 4
::nYTitlebarheight := GetSystemMetrics(SM_CYCAPTION) - 3

FUNCTION GetSystemMetrics(nIndex)
   STATIC GetSystemMetrics
   IF GetSystemMetrics = NIL
      GetSystemMetrics := DllPrepareCall("user32.dll",;
                                          DLL_STDCALL,"GetSystemMetrics")
   ENDIF
   RETURN DllExecuteCall(GetSystemMetrics,nIndex)
aber ich glaube dann fehlte da der "Border" (-3) und deshalb hab ich dann

Code: Alles auswählen

FUNCTION GetTitleBarHeight(oDlg)
LOCAL nBorder := GetBorderWide(oDlg)
LOCAL oRet

   IF IsThemeActive(.T.)
      oRet := (o:currentSize() [2] - o:drawingArea:currentSize() [2] - (2 * nBorder) - 1 - 2)
   ELSE
      oRet := (o:currentSize() [2] - o:drawingArea:currentSize() [2] - (2 * nBorder) - 1)
   ENDIF

RETURN (oRet)
gemacht und das mit

Code: Alles auswählen

#define SPI_GETBORDER 5
FUNCTION GetBorderWide(oDlg)
LOCAL nWide   := 0

   IF oDlg:border > XBPDLG_NO_BORDER

      IF DllCall("User32.dll",;
                  DLL_STDCALL,;
                 "SystemParametersInfoA",;
                  SPI_GETBORDER,;
                              0,;
                         @nWide,;
                         0) # 0
         //
         // eine Rahmenline hat eine "Licht-" und eine "Schatten"-Seite
         // von jeweils 1 Pixel breite.
         //
         // Wenn nWide also 1 zurück gibt dann muss man noch +1 +1 dazu
         // rechnen ... und das links/rechts und evtl. unten und oben.
         //
         // bei "oben" kommt zusätzlich noch die unter Titlebar Line mit
         // 2(?) Pixeln dazu
         //
         DO CASE
            //    Kein Rahmen
            CASE oDlg:border ==  XBPDLG_NO_BORDER
            //    Fenstergr÷▀e ist verõnderbar
            CASE oDlg:border ==  XBPDLG_SIZEBORDER
            // *) D³nner Rahmen, Fenstergr÷▀e
            CASE oDlg:border ==  XBPDLG_THINBORDER
                                  //
                                  //     kann nicht verõndert werden
                                  //
            //    Dicker Rahmen, Fenstergr÷▀e
            CASE oDlg:border ==  XBPDLG_DLGBORDER
                                  //
                                  //     kann nicht verõndert werden
                                  //
            //**) Dicker, hervorgehobener Rahmen (default)
            CASE oDlg:border ==  XBPDLG_RAISEDBORDERTHICK
            // *) D³nner, hervorgehobener Rahmen
            CASE oDlg:border ==  XBPDLG_RAISEDBORDERTHIN
            //    Dicker, eingedr³ckter Rahmen
            CASE oDlg:border ==  XBPDLG_RECESSEDBORDERTHICK
            // *) D³nner, eingedr³ckter Rahmen
            CASE oDlg:border ==  XBPDLG_RECESSEDBORDERTHIN
            //    Dicker, hervorgehobener Rahmen
            CASE oDlg:border ==  XBPDLG_RAISEDBORDERTHICK_FIXED
                                  //
                                  //     Gr÷▀e kann nicht verõndert werden
                                  //
            // *) D³nner, hervorgehobener Rahmen
            CASE oDlg:border ==  XBPDLG_RAISEDBORDERTHIN_FIXED
                                  //
                                  //     Gr÷▀e kann nicht verõndert werden
                                  //
            //   Dicker, eingedr³ckter Rahmen
            CASE oDlg:border ==  XBPDLG_RECESSEDBORDERTHICK_FIXED
                                  //
                                  //     Gr÷▀e kann nicht verõndert werden
                                  //
            // *) D³nner, eingedr³ckter Rahmen
            CASE oDlg:border ==  XBPDLG_RECESSEDBORDERTHIN_FIXED
                                  //
                                  //     Gr÷▀e kann nicht verõndert werden

         ENDCASE
      ENDIF
   ENDIF

RETURN nWide
gemacht. Nun muss ich "nur" noch die bei mir verwendete Konstante BORDER_SIZE "austauschen"
und es testen ob es nun stimmt ...
gruss by OHR
Jimmy
Antworten