:motion / :move eines XbpDialog ohne "Titlebar"

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

:motion / :move eines XbpDialog ohne "Titlebar"

Beitrag von AUGE_OHR »

moin,

wenn ich, nach PDR 5147, auf die "Titlebar" meine XbParts lege und die
"Titlebar" dann "voll" ist, weiss ich nicht wie ich den XbpDialog "move"n
soll ?

Ich hab mir das andere Beispiel von "Greg Doran" angesehen und seine

Code: Alles auswählen

:lbDown
:motion
:lbUp
nachgebildet welche ich auf die XbParts gelegt habe. Nun bin ich soweit
das ich die Xbparts "im" XbpDialog "move"n kann, aber ich will ja das
ganze "Fenster" ...

leider findet man über ":motion" kaum was in den Newsgroup Foren
und auch in meinem "Archive" hab ich kaum brauchbares gefunden.

... ich "denke" ich müsste die ":motion" vom XbPart an den Parent:motion
(XbpDialog) "weiterleiten" ... ?

Jemand eine Idee oder sample ?

gruss by OHR
Jimmy
p.s. soll/kann ich hier 400 Zeilen posten ?
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

Beitrag von AUGE_OHR »

hi,

soweit hab ich es nun geschafft den XbpDialog, mit "owend window"
als "bunten Titlebar", mit der Maus "wie gewohnt" zu verschieben.

Dazu hab ich nun die Methoden LBDown in die Class integriert und
leite den "Titlebar":LBDown and den Parent (self) weiter.

Code: Alles auswählen

oTEXT:lbDown := {|x,y,o| ::ishold := .T., ::lbdown(x,y)}
oTEXT:lbUp   := {|x,y,o| ::lbUp  (x,y), ::ishold := .F.}

METHOD XbpDialogEx:LBDown(aPos)
   IF ::ishold                       // nur wenn es vom Titlebar kommt 
      ::CaptureMouse(.T.)
      ::isMove :=.T.   //ivar
      ::mPos := GetCurAbsPos(aPos)
   ELSE
        ???                           // und was mache ich "sonst" ? 
   ENDIF
RETURN Self
soweit sogut, aber nun kann ich weder den "maximize" oder "close"
Button auf dem XbpDialogEx anclicken ?

mir scheint es so als wenn nun "alle" :LBDown ge"captured" werden,
also was schreibe ich bei ELSE ?

gruss by OHR
Jimmy
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

Beitrag von AUGE_OHR »

Code: Alles auswählen

METHOD XbpDialogEx:LBDown(aPos)
   IF ::ishold
      ::CaptureMouse(.T.)
      ::isMove :=.T.  
      ::mPos := GetCurAbsPos(aPos)
   //
   // sonst zur "SuperClass" leiten !!!
   //
   ELSE
      ::XbpDialog:LBDown(aPos)
   ENDIF
RETURN Self
so das ist die Lösung des Problems.

Ich hab ja eine eigene Class von XbpDialog erstellt. Wenn ich nun also
"vererbte" Methoden "überschreibe" muss ich im ELSE zur "SuperClass"
umleiten.

Code: Alles auswählen

METHOD XbpDialogEx:show()
...
   IF myShow
...
   ELSE
      ::XbpDialog:show()
   ENDIF
also auch das Problem "gelöst" nun sind es "nur" noch 2 ...

1.) "Focus" Problem : ich komme jetzt auch wieder an den "close" Button
ran ... ABER wenn ich nun auf meinen "bunten Titelbar" clicke um z.B.
das "Fenster" zu moven (was jetzt geht), dann kan ich "danach" nicht
mehr an den "sichtbaren close" button. Unter XP "sieht" man sogar noch
das der "close" Button die "hover" Farbe aktiviert aber es passiert nichts
wenn ich auf das "X" clicke.

2.) wenn ich "minimieren" und dann wieder auf "normal" bin ist nur
noch ein "schwarzer" Balken statt Titlebar vorhanden :(

da ich aber auch mit "::TitleON" zur Laufzeit den "Titlebar" ein/aus-
schalten kann müssten die Bitmap Objekte "eigendlich" zur Laufzeit
"vorhanden" sein ...oder werden die "irgendwie" evtl. auf Size = {0,0}
gesetzt so das ich die nicht mehr "sehen" kann ?

gruss by OHR
Jimmy

Code: Alles auswählen

CLASS  XbpDialogEx FROM XbpDialog
...
METHOD XbpDialogEx:AddBitmap( cCaption )
LOCAL aPos  := ::SetBMPPos( 1 )
LOCAL aItemSize  := { ::currentsize()[1] + ::nYTitlebarheight - ::nXOffset -( (LEN( ::aDlg4Buttons )+1)*(::nYTitlebarheight ) ) , ::nYTitlebarheight }
LOCAL oDlg, oBitmap, nBGClr
LOCAL oButton, oTEXT
LOCAL aPres   := {{ XBP_PP_FGCLR, GRA_CLR_BLACK         },;
                  { XBP_PP_BGCLR, XBPSYSCLR_TRANSPARENT },;
                  { XBP_PP_COMPOUNDNAME , FONT_DEFPROP_SMALL+FONT_STYLE_BOLD    }}

LOCAL aTest   := {{ XBP_PP_FGCLR, GRA_CLR_BLACK         },;
                  { XBP_PP_BGCLR, GRA_CLR_RED           },;
                  { XBP_PP_COMPOUNDNAME , FONT_DEFPROP_SMALL+FONT_STYLE_BOLD    }}

LOCAL hWndDlg           := 0

   IF PCOUNT() > 0
      ::TText := cCaption
   ENDIF

#IFDEF TESTI
   oBitmap := XbpBitmap():New():Create()
#ELSE
   oBitmap := ExXbpBitmap():New():Create()
#ENDIF

   IF FILE("TITLE.BMP")
      oBitmap:LoadFile("TITLE.BMP")
   ELSE
      oBitmap:load( , 4000 )
   ENDIF
   nBGClr := oBitmap:getDefaultBgColor()
   oBitmap:transparentClr := nBGClr

   ::Setparent():SetColorBG( nBGClr )
   ::SetColorBG( nBGClr )

   // the dialog created without border, titlebar or anything.
   oDlg := XbpDialog():new( AppDesktop(), self, aPos, aItemSize, aTest, .F. )
   oDlg:movewithOwner := .T.
   oDlg:Border        := XBPDLG_NO_BORDER
   oDlg:Titlebar      := .F.
   oDlg:minButton     := .F.
   oDlg:maxButton     := .F.
   oDlg:create()

   hWndDlg:= oDlg:GetHWND()

   oButton := XbpPushButton():new( oDlg:drawingarea,,{ 0, 0},;
                                            oDlg:CurrentSize() )
   oButton:autosize := .F.
   oButton:PointerFocus := .F.
   oButton:activate :=  {|| ;
      IF(::getFrameState() = XBPDLG_FRAMESTAT_NORMALIZED ,;
      IF(::maxButton,::XbpDialog:setFrameState(XBPDLG_FRAMESTAT_MAXIMIZED),NIL) ,;
      ::XbpDialog:setFrameState(XBPDLG_FRAMESTAT_NORMALIZED) ), ::myRefresh(.T.)  }

*   oButton := XbpStatic():new( oDlg:drawingarea , , { 0, 0}, oDlg:CurrentSize())
*   oButton:type := XBPSTATIC_TYPE_BITMAP

   oButton:caption  := BMP2BMP(oBitmap,oDlg:CurrentSize())
   oButton:clipSiblings := .T.
   oButton:Create()

   oTEXT := XbpStatic():new( oButton , , { 4, 0}, oDlg:CurrentSize(), aPres)
   oTEXT:type     := XBPSTATIC_TYPE_TEXT
   oTEXT:options  := XBPSTATIC_TEXT_LEFT + XBPSTATIC_TEXT_VCENTER
   oTEXT:caption  := ::TText

   oTEXT:lbdblclick  := {|| PostAppEvent(xbeP_Activate,,,oButton)}

   oTEXT:lbDown := {|x,y,o| ::ishold := .T., ::lbdown(x,y)}
   oTEXT:motion := {|x,y,o| ::motion(x,y)}
   oTEXT:lbUp   := {|x,y,o| ::lbUp  (x,y), ::ishold := .F.}

   oTEXT:Create()

   // add the dialog to the array that stores each user defined
   // button of the titlebar.
   AAdd( ::aoBitmap, oDlg )

RETURN( self )

METHOD XbpDialogEx:myRefresh(lvalue)
   IF PCOUNT() > 0
      ::TitleON := lvalue
   ENDIF
   ::hide()
   ::show()
RETURN Self

METHOD XbpDialogEx:hide()
LOCAL i,iMax := LEN(::aDlg4Buttons)
LOCAL j,nLen
LOCAL aZeroSize := {0,0}

   ::nLastSize := ::currentsize()

   ::aoBitmap[1]:DrawingArea:Childlist()[1]:hide()
   ::aoBitmap[1]:hide()

   FOR i = 1 TO iMax
      ::aDlg4Buttons[i]:hide()
      nLen := LEN(::aDlg4Buttons[i]:Childlist() )
      j := 0
      FOR j = 1 TO nLen
         ::aDlg4Buttons[i]:Childlist()[j]:hide()
      NEXT
   NEXT

*   ::XbpDialog:setsize(aZeroSize)
   ::XbpDialog:hide()
   ::XbpDialog:toBack()      
RETURN Self

METHOD XbpDialogEx:show()
LOCAL i,iMax := LEN(::aDlg4Buttons)
LOCAL j,nLen
LOCAL aMainSize := ::nLastSize
LOCAL aTitleSize
LOCAL aChildSize

   IF aMainSize <> NIL
*      ::XbpDialog:setsize(aMainSize)
   ENDIF
   ::XbpDialog:toFront()
   ::XbpDialog:show()

   IF ::TitleON .AND. LEN(::aoBitmap) > 0
      aTitleSize := ::aoBitmap[1]:currentSize()

      aChildSize := { ::currentsize()[1] + ::nYTitlebarheight - ::nXOffset  ;
                     -( (LEN( ::aDlg4Buttons )+1)*(::nYTitlebarheight ) )  ,;
                      ::nYTitlebarheight }

      IF aMainSize <> NIL
         //
         // if "maximize" or "minimize" while :hide
         //
         IF aTitleSize[1] > aMainSize[1]
            ::Resize( aTitleSize, aMainSize )
         ELSEIF aTitleSize[1] < aChildSize[1]
            ::Resize( aTitleSize, aMainSize )
         ENDIF
      ENDIF

      ::aoBitmap[1]:Show()
      ::aoBitmap[1]:invalidateRect()

      ::aoBitmap[1]:DrawingArea:Childlist()[1]:Show()
      ::aoBitmap[1]:DrawingArea:Childlist()[1]:Childlist()[1]:invalidateRect()
      FOR i = 1 TO iMax
         ::aDlg4Buttons[i]:Show()
         nLen := LEN(::aDlg4Buttons[i]:Childlist() )
         j := 0
         FOR j = 1 TO nLen
            ::aDlg4Buttons[i]:Childlist()[j]:Show()
         NEXT
      NEXT
   ENDIF
RETURN Self

METHOD XbpDialogEx:Resize( aOldSize, aNewSize )
LOCAL i, iMax
LOCAL oButton, aNewPos
LOCAL aChildSize,oBitmap

   IF aOldSize[1] == 0 .AND. aOldSize[2] == 0   // New line
      aOldSize := aNewSize                      // New line
   ELSEIF aNewSize[1] == 0 .OR. aNewSize[2] == 0 // New line
      RETURN                                    // New line
   // add "same Size", nothing had happend
   ELSEIF aNewSize[1] == aOldSize[1] .AND. aNewSize[2] == aOldSize[2]
      RETURN
   ENDIF                                        // New line

   ::XbpDialog:resize( aOldSize, aNewSize )

   IF ::TitleON .AND. LEN(::aoBitmap) > 0
      iMax := LEN( ::aDlg4Buttons )
      IF ( ::minButton .AND. ::maxButton )
         IF IsThemeActive(.T.)
            ::nXOffset     := 97
         ELSE
            ::nXOffset     := 94
         ENDIF

      ELSEIF ( ::maxButton .AND. .NOT. ::minButton )
         IF IsThemeActive(.T.)
            ::nXOffset     := 96/4*3
         ELSE
            ::nXOffset     := 96/4*3
         ENDIF

      ELSEIF (::minButton .AND. .NOT. ::maxButton )
         IF IsThemeActive(.T.)
            ::nXOffset     := 97
         ELSE
            ::nXOffset     := 94
         ENDIF

      ELSEIF (.NOT. ::minButton .AND. .NOT. ::maxButton )
         IF IsThemeActive(.T.)
#IFDEF TESTI
            ::nXOffset     := 96/4*2
#ELSE
            ::nXOffset     := (96/4*1)+3
#ENDIF
         ELSE
            ::nXOffset     := 96/4*2
         ENDIF
      ENDIF

      aChildSize := { ::currentsize()[1] + ::nYTitlebarheight - ::nXOffset  ;
                   -( (LEN( ::aDlg4Buttons )+1)*(::nYTitlebarheight ) )    ,;
                      ::nYTitlebarheight }

      ::aoBitmap[1]:setPosAndSize( ::SetBMPPos(1), aChildSize )
      ::aoBitmap[1]:DrawingArea:Childlist()[1]:setSize( aChildSize  )
      IF ::isvisible()
         ::aoBitmap[1]:Show()
      ELSE
         ::aoBitmap[1]:hide()
      ENDIF

      oBitmap := ::aoBitmap[1]:DrawingArea:Childlist()[1]:caption
      oBitmap := BMP2BMP( oBitmap,aChildSize)
      ::aoBitmap[1]:DrawingArea:Childlist()[1]:setcaption(oBitmap)
      ::aoBitmap[1]:DrawingArea:Childlist()[1]:Childlist()[1]:setSize( {aChildSize[1]-::IconSize,aChildSize[2]} )
      IF ::isvisible()
         ::aoBitmap[1]:DrawingArea:Childlist()[1]:Show()
      ELSE
         ::aoBitmap[1]:DrawingArea:Childlist()[1]:hide()
      ENDIF

      ::aoBitmap[1]:DrawingArea:Childlist()[1]:Childlist()[1]:setcaption(::title)
      ::aoBitmap[1]:DrawingArea:Childlist()[1]:Childlist()[1]:invalidateRect()
      IF ::isvisible()
         ::aoBitmap[1]:DrawingArea:Childlist()[1]:Childlist()[1]:Show()
      ELSE
         ::aoBitmap[1]:DrawingArea:Childlist()[1]:Childlist()[1]:hide()
      ENDIF

      FOR i := 1 TO iMax
         oButton := ::aDlg4Buttons[i]:drawingArea:childList()[1]
         aNewPos := ::SetRelPos( i )
         ::aDlg4Buttons[i]:setPos( aNewPos )
         IF ::isvisible()
            ::aDlg4Buttons[i]:Show()
         ELSE
            ::aDlg4Buttons[i]:hide()
         ENDIF
      NEXT

   ENDIF
RETURN( self )
gruss by OHR
Jimmy
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

Beitrag von AUGE_OHR »

hi,

also nun hab ich einen "workaround" für den "close" Button :

Code: Alles auswählen

METHOD XbpDialogEx:LBclick(aPos)
LOCAL xxx
LOCAL aSize := ::currentsize()

   ALTD()
   xxx := SetappWindow()
   xxx := SetappFocus()

   DO CASE

      CASE aPos[1] >= aSize[1] - (::nYTitlebarheight*1) .AND.;
           aPos[1] <= aSize[1]

           PostAppEvent( xbeP_Close ,,,self)

      CASE aPos[1] >= aSize[1] - (::nYTitlebarheight*2) .AND.;
           aPos[1] <= aSize[1] - (::nYTitlebarheight*1)

           IF ::XbpDialog:maxbutton
              IF ::XbpDialog:getFrameState() = XBPDLG_FRAMESTAT_MAXIMIZED
                 ::XbpDialog:setFrameState(XBPDLG_FRAMESTAT_NORMALIZED)
              ELSE
                 ::XbpDialog:setFrameState(XBPDLG_FRAMESTAT_MAXIMIZED)
              ENDIF
              ::myRefresh()
           ENDIF

      CASE aPos[1] >= aSize[1] - (::nYTitlebarheight*3) .AND.;
           aPos[1] <= aSize[1] - (::nYTitlebarheight*2)

           IF ::XbpDialog:minbutton
              ::XbpDialog:setFrameState(XBPDLG_FRAMESTAT_MINIMIZED)
              ::myRefresh()
           ENDIF

   OTHERWISE

      ::XbpDialog:LBclick(aPos)

   ENDCASE

RETURN Self
ich "frage" jetzt also die Mausposition ab. Da sich die 3 Button´s immer
rechts oben befinden "weiss" ich also auch deren Position.

aber das behebt nicht das "eigendliche" Problem, den ich muss ja immer
noch alles an die "SuperClass" senden ... ?

ich werde mal versuchen ein "sample" zu machen und es im Alaska Forum
uploaden, vielleicht "sieht" dann jemand was ich meine.

gruss by OHR
Jimmy
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

Beitrag von AUGE_OHR »

so ich hab jetzt das Demo im Alaska Forum unter

public.xbase++.gui
"Superclass" ?
23. April 2007

abgelegt. Wer Lust hat kann sich ja mal den "SKIN" Titlebar ansehen.

gruss by OHR
Jimmy
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

Beitrag von AUGE_OHR »

hi,

Das Problem war/ist "CaptureMouse()" welches die Maus-"aktionen"
auf das "Titlebar Bitmap" beschränkt. Wenn man es aus dem Demo
rausnimmt funktioniert das "move"n auch noch, aber es "ruckelt" ein
wenig jenach dem wie "schnell" man mit der Maus ist.

Nun muss ich nur noch raus bekommen "wie" ich es "wo" einsetzten
muss damit es "richtig" funktioniert. Ansonsten ist noch ein "repaint"
Fehler gewesen beim "resize" wenn man die "echten Mini-/Maximinze"
Button benutzt hatte, aber auch das geht jetzt "soweit".

achja zum Thread Thema : hab es nun auf RBDown/RBUp gelegt wenn
der Dialog keinen Titlebar hat und man ihn "move"n will.

gruss by OHR
Jimmy
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Jimmy,

ich habe dein Beispiel runtergeladen, angesehen und dabei ein kleines Problem gefunden.
Ich arbeite auch unter WinXP mit der klassischen Ansicht. Genau hier kommt es bei dir zum Problem: die Tasten werden nicht richtig (etwas verdeckt ) angezeigt. Mit eingeschalteten XP-Style funktioniert es.
Gruß,

Andreas
VIP der XUG Osnabrück
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

Beitrag von AUGE_OHR »

hi,
andreas hat geschrieben: ich habe dein Beispiel runtergeladen, angesehen und dabei ein kleines Problem gefunden.
Ich arbeite auch unter WinXP mit der klassischen Ansicht. Genau hier kommt es bei dir zum Problem: die Tasten werden nicht richtig (etwas verdeckt ) angezeigt. Mit eingeschalteten XP-Style funktioniert es.
Das Demo ist noch nicht "ganz" fertig. Ich hab zwar schon die Abfrage
"IF IsThemeActive(.T.)" drin, aber noch nicht "optimiert". Im Demo
wurde bislang ein "fester" Offset genommen. Nun hab ich auch das
schon auf die "Titlebar high" umgestellt und muss das ohne "Theme"
nochmal testen.

Ich benutzte dafür jetzt die API-Funkzion von Günter "GetSystemMetrics(
SM_CYCAPTION )" statt der "pure" Xbase Funktion GetTitleBarHeight()
da die "genauere" Werte liefert.

Leider sind noch paar "Kleinigkeiten" nicht gelöst :
1.) "re-paint" Title Font : Da der "echte" Title nun "verdeckt" wird vom
Bitmap muss ich den Title "re-paint"en. Ich bekomme aber nicht raus
welchen Font der "echte" Title hat/hatte.

2.) Border-"wide" : z.Z. verwende ich eine Konstante (=6) weil ich nicht
weiss wie ich zur Laufzeit "ermitteln" soll welche Border "active" ist und
wie "wide" der Border ist.

3.) CaptureMouse(.T.) : hab noch nie damit gearbeitet und muss erst
raus bekommen wie man das "richtig" einsetzt.

Tja und dann ist da noch die "Geschwindigkeit" ... da er ja nun noch
zusätzliche XbParts "paint"en muss braucht er dafür mehr Zeit. Bei
meiner "onboard" GFK Lösung mit 32MB ist das echt "langsam" wenn
man z.b. "resize"ed.

"Bringen" moderne GFK mit "viel" RAM da etwas für Xbase++ ?

gruss by OHR
Jimmy
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

Beitrag von AUGE_OHR »

hi,

also wenn ich das richtig sehe kann man mit "SystemParametersInfoA"
diverse "System Informationen" bekommen.
http://msdn2.microsoft.com/en-us/library/ms724947.aspx

Nun gibt es da diverse SPI_ Konstanten wie :

Code: Alles auswählen

#define SPI_GETBORDER               5

FUNCTION GetBorderWide(oDlg)
LOCAL cString := "                            "         // buffer per @
LOCAL nWide := 0

ALTD()
IF oDlg:border > XBPDLG_NO_BORDER
   IF DllCall("User32.dll",                   ;
               DLL_STDCALL,                  ;
               "SystemParametersInfoA", ;
               SPI_GETBORDER,             ;
               0,                                    ;
               @cString,                         ;
               0 ) # 0

*      nWide := (cString)       // <- was mache ich hier ???
   ENDIF
ENDIF
RETURN nWide

Ich hab aber wieder mal das "Problem" das ich nicht weiss wie ich das
"Ergebniss" cString "übersetzten" soll ... GÜNTER Hilfe !

Für den Dialog "Title Font" hab ich leider noch nichts gefunden ...

gruss by OHR
Jimmy
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

Beitrag von AUGE_OHR »

hi,

unter : HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics
hab ich in der Registry nun die Einträge gefunden : "BorderWidth -15"
...negativer Wert ?

auch den Dialog "Titlebar" Font hab ich wohl unter "CaptionFont"
gefunden, aber womit wandle ich nun den REG_BINARY um ?

gruss by OHR
Jimmy
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

Beitrag von AUGE_OHR »

hi,
AUGE_OHR hat geschrieben:

Code: Alles auswählen

               @cString,                         ;
               0 ) # 0
*      nWide := (cString)       // <- was mache ich hier ???
statt @cString muss man hier @nWide verwenden da der Rückgabewert
eine Integer ist ... kein Wunder das ich so "komische" Charakter Zeichen
hatte ...

gruss by OHR
Jimmy
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

Beitrag von AUGE_OHR »

AUGE_OHR hat geschrieben: unter : HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics
...
auch den Dialog "Titlebar" Font hab ich wohl unter "CaptionFont"
gefunden, aber womit wandle ich nun den REG_BINARY um ?
sehe ich mir das "direkt" in der Registry an so bekomme ich

Code: Alles auswählen

F3 FF FF FF 00 00 00 00
00 00 00 00 00 00 00 00
BC 02 00 00 00 00 00 01
00 00 00 00 54 00 72 00
68 88 65 00 74 00 20 00
4D 00 53 00 00 00 00 00
wenn ich aber mit Thomas Braun´s RegClass den "Value" auslese
bekomme ich einen String von "nur 4 Zeichen" wobei es erst in der
"dritten" Reihe mit "BC 02" losgeht. Ich habe es dabei sowohl mit

Code: Alles auswählen

oReg:ReadBinType("C")
aSubkeys := oReg:ValueList()
nPosi := ASCAN(aSubkeys,{|aEl| "CAPTIONFONT" $ TRIM(UPPER(aEl[1])) })
IF nPosi > 0
    uVal := oReg:GetValue(aSubkeys[nPosi][1])
    uVal := aSubkeys[nPosi][2]
...
als auch mit :

Code: Alles auswählen

oReg:ReadBinType("C")
uVal := oReg:GetValue("CaptionFont")
versucht und immer "nur 4 Zeichen" im String ...
jemand noch eine Idee ?

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:

Beitrag von brandelh »

Hi Jimmy,

4 Byte entspricht einer 32 Bit Integer, also einem Zeiger.
Eventuell ist das die Adresse an der der String zu finden ist.
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

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: 4 Byte entspricht einer 32 Bit Integer, also einem Zeiger.
Eventuell ist das die Adresse an der der String zu finden ist.
ich habe mich schon wieder "täuschen" lassen. Tatsächlich ist der
Rückgabe Wert ein String, aber ich habe nur 4 Zeichen "gesehen"
den "danach" kam HEX 00 ...
mit der Fehlermeldung "sehe" ich nun den "ganzen" String aber
irgendwie "fehlt" noch was ... ?
------------------------------------------------------------------------------
FEHLERPROTOKOLL von "C:\4\titlebar.exe" Datum: 25.04.07 21:21:40

Xbase++ Version : Xbase++ (R) Version 1.90.331
Betriebssystem : Windows XP 05.01 Build 02600 Service Pack 2
------------------------------------------------------------------------------
oError:args :
-> VALTYPE: C VALUE: ¾··· ╝☻ ☺ T r e b u c h e t
M S
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Parameter hat falschen Typ
oError:filename :
oError:genCode : 2
oError:operation : u2Bin
oError:osCode : 0
oError:severity : 2
oError:subCode : 3
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von GETTITLEFONT(979)
Aufgerufen von MAIN(138)
das "T r e b u c h e t M S", was tatsächlich eingestellt ist, sieht "komisch"
aus mit dem "vorspann" ... und "sieht" jemand die Font "Grösse" in dem
String ?

gruss by OHR
Jimmy
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Jimmy,

sehe das jetzt erst...

siehe meine Antwort im Alaska-GUI-Forum.

Viele Grüße,
Günter
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

Beitrag von AUGE_OHR »

hi,
Günter Beyes hat geschrieben: siehe meine Antwort im Alaska-GUI-Forum.
Danke, nun hab ich auch den "Systemfont" und kann den in der Titlebar
"re-paint"en. Nur mit der "Fonthigh" hab ich noch Probleme den er gibt
mit das z.Z. 62.40 raus was ein "bisschen" gross ist ... :)

danke nochmals
gruss by OHR
Jimmy
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Jimmy hat geschrieben:Nur mit der "Fonthigh" hab ich noch Probleme den er gibt
mit das z.Z. 62.40 raus was ein "bisschen" gross ist ... :)
"ein bisschen" ist gut...

da muss ich noch mal recherchieren...

... und habe dies in einem anderen Forum gefunden:
The first number in the data string of each font is the size value (6-24) but it's in a hex style. It's not hard to find the relation of the numbers - 8=f5 (default for message text), 9=f4, 10=f3.. and.. not so on.. actually you should miss one hex value on every three size values.. so 11=f1 (not f2), and 14=ed / 7=f7...
Das sieht schon realistischer aus, denke ich :)

Gruß,

Günter
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

Beitrag von AUGE_OHR »

hi,
Günter Beyes hat geschrieben: ... und habe dies in einem anderen Forum gefunden:
The first number in the data string of each font is the size value (6-24) but it's in a hex style. It's not hard to find the relation of the numbers - 8=f5 (default for message text), 9=f4, 10=f3.. and.. not so on.. actually you should miss one hex value on every three size values.. so 11=f1 (not f2), and 14=ed / 7=f7...
Das sieht schon realistischer aus, denke ich :)
em, äh ... ich habe es mir mehrfach durchgelesen und verstehe nur
"Bahnhof" ...

kann das sein das man die TwipsPerPixel auf die Bildschirm Auflösung
"umrechnen" muss (Twips to Pixels) ?
http://support.microsoft.com/default.as ... US;Q210590

danke für deine Mühe
gruss by OHR
Jimmy
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Jimmy,

wie ich das Posting des anonymen Helfers verstehe, beschreibt er folgende Umsetzungstabelle.

Viele Grüße,
Günter

Code: Alles auswählen

do case
case nSize = 0xF8
   nPoints := 6
case nSize = 0xF7
   nPoints := 7

case nSize = 0xF5
   nPoints := 8
case nSize = 0xF4
   nPoints := 9
case nSize = 0xF3
   nPoints := 10

case nSize = 0xF1
   nPoints := 11
case nSize = 0xF0
   nPoints := 12
case nSize = 0xEF
   nPoints := 13

case nSize = 0xED
   nPoints := 14
case nSize = 0xEC
   nPoints := 15
case nSize = 0xEB
   nPoints := 16

case nSize = 0xE9
   nPoints := 17
case nSize = 0xE8
   nPoints := 18
case nSize = 0xE7
   nPoints := 19

case nSize = 0xE5
   nPoints := 20
case nSize = 0xE4
   nPoints := 21
case nSize = 0xE3
   nPoints := 22

case nSize = 0xE1
   nPoints := 23
case nSize = 0xE0
   nPoints := 24

otherwise
   // Fehler ! ?
end case
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

Beitrag von AUGE_OHR »

hi,
Günter Beyes hat geschrieben: wie ich das Posting des anonymen Helfers verstehe, beschreibt er folgende Umsetzungstabelle.

Code: Alles auswählen

do case
case nSize = 0xF3
   nPoints := 10
aha, jetzt "sehe" ich es ... hab wohl bei HEX in der Schule nicht aufgepasst

im Alaska Forum kam nun noch diese Antwort
Andreas Gehrs-Pahl hat geschrieben: Function GetTitleBarFont()
LOCAL cFSize := ''
LOCAL cFName := ''
LOCAL cValue := ;
GetRegKeyValue('HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics', ;
'CaptionFont', 'C')
if OS(OS_FAMILY) == "WIN9X"
cFSize := alltrim(str(abs(Bin2L(substr(cValue, 1, 4)))))
cFName := substr(cValue, 19, At(chr(0), cValue, 19) - 19)
else
cFSize := alltrim(str(Round(abs(Bin2L(substr(cValue, 1, 4))) * 72 / ;
GetWindowsFontsDPI(), 0)))
cFName := StrTran(substr(cValue, 29), chr(0), '')
endif
return (cFSize + '.' + cFName)

Function GetWindowsFontsDPI(lWidth)
LOCAL lHeight := iif(lWidth == NIL, .t., .not. lWidth)
LOCAL nHWnd := AppDesktop():GetHWnd()
LOCAL nHDC := DllCall("User32.DLL", DLL_STDCALL, "GetDC", nHWnd)
LOCAL nLogPix := 96 // default for Small Fonts
if nHDC > 0
nLogPix := DllCall("GDI32.DLL", DLL_STDCALL, "GetDeviceCaps", nHDC, ;
iif(lHeight, LOGPIXELSY, LOGPIXELSX))
DllCall("User32.DLL", DLL_STDCALL, "ReleaseDC", nHWnd, nHDC)
endif
return (nLogPix)

Function GetRegKeyValue(cKeyName, cValueName, cBinType)
LOCAL oRegKey := XbpReg():New(cKeyName)
LOCAL xValue := NIL
oRegKey:ReadBinType(cBinType)
xValue := iif(empty(cValueName), oRegKey:Standard(), ;
oRegKey:GetValue(cValueName))
* oRegKey:Destroy()
return (xValue)
wenn man nun die "62,40" durch seine Funktion GetWindowsFontsDPI()
schickt bekommt man ebenfalls 0xF3 = 10 raus. Man muss also bei
"beliebigen" Fonts noch die DPI berücksichtigen um die "richtige" FontSize
zu erhalten.

Interessant das unter "WIN9X" der "Fontname" auf einer anderen Position
zu ermitteln ist ... das hatte ich noch gar nicht getestet.

Dies gibt mir nun endlich auch die Möglichkeit meine XbpStatic (Text)
und XbpSLE (SLEPic) beim "resize" auch in der Höhe der "Fonts" neu zu
"berechnen" (statt bisher "in Stufen" anzupassen)

ok, damit ist dann auch das "Problem" gelöst. Jetzt bleibt "nur noch" den
"richtigen" Einsatz von CaptureMouse(.T./.F.) in meiner ":LBUp(aPos)"
und ":LBDown(aPos)" Methode rausbekommen ...

danke,
gruss by OHR
Jimmy
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

Beitrag von AUGE_OHR »

hi,

hier wohl die "entgültige" Version die auch "bold" und "italic" berücksichtigt
Andreas Gehrs-Pahl hat geschrieben: Function GetTitleBarFont()
LOCAL cValue := ;
GetRegKeyValue('HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics', ;
'CaptionFont', 'C')
LOCAL cFSize := ''
LOCAL cFName := ''
LOCAL lBold := .f.
LOCAL lItalic := .f.
if OS(OS_FAMILY) == "WIN9X"
cFSize := alltrim(str(abs(Bin2I(substr(cValue, 1, 2)))))
lBold := (Bin2I(substr(cValue, 9, 2)) == 700) // 400 => Not Bold
lItalic := (Bin2I(substr(cValue, 11, 2)) == 1) // 0 => Not Italic
cFName := substr(cValue, 19, At(chr(0), cValue, 19) - 19)
else
cFSize := alltrim(str(Round(abs(Bin2L(substr(cValue, 1, 4))) * 72 / ;
GetWindowsFontsDPI(), 0)))
lBold := (Bin2I(substr(cValue, 17, 2)) == 700) // 400 => Not Bold
lItalic := (Bin2I(substr(cValue, 21, 2)) == 1) // 0 => Not Italic
cFName := StrTran(substr(cValue, 29), chr(0), '')
endif
//
// weil "bold" ja "fett" auf Deutsch heisst ...
//
return (cFSize + '.' + cFName + iif(lBold, FONT_STYLE_BOLD , '') + ;
iif(lItalic, FONT_STYLE_ITALIC, ''))
gruss by OHR
Jimmy
Antworten