FontSize für Anwendung

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 144
Registriert: Mi, 02. Aug 2006 18:13
Wohnort: 24536 Neumünster
Danksagung erhalten: 6 Mal
Kontaktdaten:

FontSize für Anwendung

Beitrag von Lutz Rübe »

hallo zusammen,

ich hab da mal wieder eine Frage, die für die "Profis" unter euch mit Sicherheit eine Banalität ist, für mich aber sich etwas schwierig darstellt.

Bei einer reinen GUI Anwendung möchte ich die Fonts generell über alles ändern (vielleicht sogar über "Parameter", die der Benutzer individuell einstellen kann).

Alle Elemente der Anwendung ( Header, Footer, Captions, Eingabe-Felder etc.) sollen einheintlich in der Größe geändert werden. (für "halbblinde" Benutzer, die mit hochauflösenden Monitoren arbeiten als auch für "Adleraugen".... )

Gibt es da eine Möglichkeit ? Die Bildschirmauflösung über Windows zu ändern ist keine Alternative.

Schönen (Feier)tag noch und viele Grüße
Lutz
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:

Beitrag von Jan »

Hallo Lutz,

OT: Bei uns ist kein Feiertag. Wir sind die bösen Protestanten und nicht die guten Katholiken hier 8)

Zum Thema: natürlich geht das. Du kannst ja die Fontgröße in eine Variable legen, die dann entsprechend eingesetzt wird.

Schwieriger wird das mit den Feld- und Dialoggrößen. Denn bei größerer Schrift ist ja auch die Länge der Texte anders, was die ganze Optik über den Haufen werfen kann. Aber auch das kann man machen, indem Du diese Abmessungen ebenfalls variabel machst. Im einfachsten Fall z. B. stellst Du die mit einem festen Wert auf 10 Punkt ein und änderst über einen variablen Multiplikator Breite und Höhe um x Prozent, je nach Schriftgrad.

Aber dennoch kann es noch Probleme geben: Wenn Du den ganzen Bildschirm ausnutzt, dann wird Dir der Inhalt irgendwann nach rechts über den Rand wandern, wenn Du wirklich die XBPart-Größen variabel machst.

Jan
Benutzeravatar
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 144
Registriert: Mi, 02. Aug 2006 18:13
Wohnort: 24536 Neumünster
Danksagung erhalten: 6 Mal
Kontaktdaten:

Beitrag von Lutz Rübe »

Hallo Jan,

danke für die schnelle Antwort.

auch ich bin einer von diesen "bösen Protestanten". Mich hat's damals nur beruflich in das katholische BW verschlagen. Gerne nutze ich die Vorteile der Katholiken auch für mich.

Die Antwort hört sich gut an, leider ist sie mir zu allgemein... Hast Du mal ein kurzes, prägnantes Beispiel dazu ?

Gruß
Lutz
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:

Beitrag von Jan »

Code: Alles auswählen

PUBLIC gcFontSize := [Einzulesender Wert]     // Vom User wählbar/eingebbar
PUBLIC gcFont := gcFontSize + "Arial Unicode MS"    // Die Schrift aus variabler Größe und Bezeichnung zusammensetzen
PUBLIC gnFontMultiplicator := VAL(gcFontSize) * 0.1  //Nur als Beispiel

...

oDlg:drawingArea:SetFontCompoundName(MEMVAR->gcFont)   // Die Schrift erzeugen

...

// Ein SLE mit angepasstem Startpunkt und angepasster Größe, ausgehend von einer Standardgröße, die bei 10 Punkt passen würde
oSLE := XBPSle():new(, , {nStartOben, nStartLinks}, {25 * MEMVAR->gnFontMultiplicator, 75 * MEMVAR->gnFontMultiplicator})   
Das ist jetzt wirklich nur mal QaD, ungetetstet, und die Logik müsste noch verfeinert werden. nStartOben und nStartlinks musst Du immer mitführen, denn die berechnen sich ja nach jedem Feld neu, abhängig von der Feldhöhe.

Jan
Benutzeravatar
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 144
Registriert: Mi, 02. Aug 2006 18:13
Wohnort: 24536 Neumünster
Danksagung erhalten: 6 Mal
Kontaktdaten:

Beitrag von Lutz Rübe »

Hallo Jan,

danke für das Beispiel... Aber das ist genau die Variante, die ich nicht suche... Da muß ich ja während der Programmierung für jedes einzelne Objekt (Combobox, SLE, PushButton, etc.) die Schriftart/Variable angeben. Wenn ich dann den Source ändere und neue Objekte hinzufüge, dann muß ich bei diesen neuen Objekten jedes einzelne wieder mit diesen Variablen bestücken.

Gibt es da nicht eine allgemeine Einstellung, die für alle Objekte gleichermaßen (als Standard) gilt ?

Die Frage mal andersrum gestellt: Woher weiß xBase wenn ich eine GUI Anwendung erstelle, welche Fonts und Sizes es nehmen muß ? Kann ich da nicht die Änderungen bereits vornehmen ?

Gruß
Lutz
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:

Beitrag von Jan »

Lutz,

die Schrift ist so für das gesamt Programm gleich. Wenn Du das in dem Dialog machst, den Du dann mit SetAppWindow(oDlg) als Standard-Anwendungsfenster deklarierst. Die Schrift wird dann weitervererbt an alle Dialoge, die dessen Child sind.

Mit den einzelnen Dialogen hast Du natürlich Recht. Fügst Du da ein XBPart ein, dann verschiebt sich alles. Aber Das würde es auch, wenn Du das in der "einfachen" Vorgehensweise machen würdest. Aber gerade deswegen habe ich ja die Variablen in PUBLICs gepackt, damit z. B. der Vergrößerungs-Multiplikator überall sichtbar und sofort einsetzbar ist. Und gerade das ist dann auch wiederum ein Vorteil mit den Variablen für den Startpunkt: Nach jedem Erzeugeneines XBParts rechnest Du das hoch um den gewollten Abstand, und alles dahinter verschiebt sich mit. Du kannst also z. B. ganz einfach eine Zeile einfügen, und alle weiteren Zeilen verschieben sich automatisch mit.

Im Prinzip ist es also so ('tschuldigung, hab ich nicht klar gemacht in dem Codebeispiel), daß alles VOR dem SLE in der Main steht, das SLE aber in deer entsprechenden Prozedur.

Jan
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: FontSize für Anwendung

Beitrag von AUGE_OHR »

hi,
Lutz Rübe hat geschrieben: Bei einer reinen GUI Anwendung möchte ich die Fonts generell über alles ändern (vielleicht sogar über "Parameter", die der Benutzer individuell einstellen kann).

Alle Elemente der Anwendung ( Header, Footer, Captions, Eingabe-Felder etc.) sollen einheintlich in der Größe geändert werden. (für "halbblinde" Benutzer, die mit hochauflösenden Monitoren arbeiten als auch für "Adleraugen".... )
grundsätzlich sind die Presentation Parameter für das "Aussehen"
zuständig. Die kannst du ja am Anfang definieren.
ABER jedes XbPart muss nun "den" Presentation Parameter benutzen !

Wenn du nun die Grösse verändern will ergeben sich wie schon gesagt
die Positions Probleme welches die selben sind wie bei einem :ReSize().

Deshalb solltest du dich mit der :ReSize Methode beschäftigen und hast
nebenbei dein FontSize Problem gelöst.

gruss by OHR
Jimmy

Code: Alles auswählen

FUNCTION DLGMINFO(oMainDlg,aoChild,aoDisplay,cFile)
...
   oDlg           := XbpDialog():new( AppDesktop(), , aPos, aSize, , .F. )
   oDlg:create()
   DrawingArea:Resize := {|aOld,aNew,oSelf| InfoResize(aOld, aNew ...)}
...
   aPP := { { XBP_PP_BGCLR , GRA_CLR_BLACK } ,;
            { XBP_PP_FGCLR , GRA_CLR_WHITE } ,;
            { XBP_PP_COMPOUNDNAME,"8.Arial"} }
   oPosi  := XbpStatic():new( oStatic,, {52,50},{300+8,12 },aPP )
   oPosi:type := XBPSTATIC_TYPE_TEXT
   oPosi:caption := cPosi
   oPosi:clipSiblings := .T.
   oPosi:lbClick := {| aPos, uNIL, self | MOREINFO(aoChild[CH_WMP]) }
   oPosi:create()

   AADD(aoDisplay,oPosi)
...

STATIC PROCEDURE InfoResize( aOldSize, aNewSize , oDraw, aoChild, oMainDlg)
LOCAL xDiff1 := 1 ,yDiff1 := 1
LOCAL xDiff2 := 1 ,yDiff2 := 1
LOCAL aDlgSize
LOCAL aPos1 , aDrawSize, aListSize
LOCAL aButtonSize
LOCAL oaMain,oaMid, oaParts
LOCAL j,jMax := 1
   //
   // if "minimized" or "disable"
   //
   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

   xDiff1 := INT(aNewSize[1]-aOldSize[1])       // new size
   yDiff1 := INT(aNewSize[2]-aOldSize[2])

   oaMain := oDraw:DrawingArea:ChildList()      // change to oDraw
   oDraw:LockUpdate(.T.)                        // New line
...

   ************************
   *
   * listbox
   *
   ************************

   aListSize := oaMid[2]:CurrentSize()          // current Size

   // add Diff
   oaMid[2]:setSize( { aListSize[1] +xDiff1, aListSize[2] +yDiff1 } )
   IF oaMid[2]:numItems() = 0
      oaMid[2]:addItem("this is a Test String")
   ENDIF
   DO CASE
      CASE (aListSize[2] +yDiff1) >   0 .AND. (aListSize[2] +yDiff1) <= 100
         oaMid[2]:setPresParam( XBP_PP_COMPOUNDNAME,"8.Arial"  )

      CASE (aListSize[2] +yDiff1) > 100 .AND. (aListSize[2] +yDiff1) <= 200
         oaMid[2]:setPresParam( XBP_PP_COMPOUNDNAME,"10.Arial" )

      CASE (aListSize[2] +yDiff1) > 200 .AND. (aListSize[2] +yDiff1) <= 300
         oaMid[2]:setPresParam( XBP_PP_COMPOUNDNAME,"12.Arial" )

      CASE (aListSize[2] +yDiff1) > 300 .AND. (aListSize[2] +yDiff1) <= 400
         oaMid[2]:setPresParam( XBP_PP_COMPOUNDNAME,"14.Arial" )

      CASE (aListSize[2] +yDiff1) > 400 .AND. (aListSize[2] +yDiff1) <= 500
         oaMid[2]:setPresParam( XBP_PP_COMPOUNDNAME,"16.Arial" )

      CASE (aListSize[2] +yDiff1) > 500 .AND. (aListSize[2] +yDiff1) <= 600
         oaMid[2]:setPresParam( XBP_PP_COMPOUNDNAME,"18.Arial" )

      CASE (aListSize[2] +yDiff1) > 600 .AND. (aListSize[2] +yDiff1) <= 700
         oaMid[2]:setPresParam( XBP_PP_COMPOUNDNAME,"20.Arial" )

      CASE (aListSize[2] +yDiff1) > 700 .AND. (aListSize[2] +yDiff1) <= 800
         oaMid[2]:setPresParam( XBP_PP_COMPOUNDNAME,"22.Arial" )

      CASE (aListSize[2] +yDiff1) > 800 .AND. (aListSize[2] +yDiff1) <= 900
         oaMid[2]:setPresParam( XBP_PP_COMPOUNDNAME,"24.Arial" )

      CASE (aListSize[2] +yDiff1) > 900 .AND. (aListSize[2] +yDiff1) <= 1000
         oaMid[2]:setPresParam( XBP_PP_COMPOUNDNAME,"26.Arial" )

      CASE (aListSize[2] +yDiff1) >1000 .AND. (aListSize[2] +yDiff1) <= 2000
         oaMid[2]:setPresParam( XBP_PP_COMPOUNDNAME,"28.Arial" )

   ENDCASE

   oDraw:LockUpdate(.F.)                        // New line
   oDraw:drawingArea:InvalidateRect()                       // New line

RETURN
Antworten