amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > TextLenght() ohne window/screen? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

18.01.2012, 13:34 Uhr

AGSzabo
Posts: 1663
Nutzer
Hallo,

wie kann man die Höhe und Breite eines Textes berechnen lassen, wenn man noch kein Fenster und auch keinen Screen für den RastPort hat? Das frage ich mich gerade, weil man mein GUI auch dann layouten können soll, wenn weder ein Fenster noch der/ein Screen dafür offen ist. Mein erster Gedanke war, einen temporären Rastport zu erzeugen ohne Layer und ohne Bitmap. Geht das oder wie würdet ihr es machen?

ags
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 18.01.2012 um 13:36 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

18.01.2012, 13:56 Uhr

Holger
Posts: 8116
Nutzer
Ausprobiert habe ich es nicht, aber das sollte schon funktionieren. Der Layer darf definitiv null sein, eine BitMap braucht’s eigentlich nicht, aber im Zweifelsfall kann man immer eine minimale 16×1 pseudo-BitMap angeben. Dann ist alles korrekt. Screen/Window sind für einen RastPort nicht notwendig.

Eine Alternative wäre es, den Text in eine IntuiText-Struktur zu packen und die Funktion IntuiTextLength(…) der intuition.library zu verwenden.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

18.01.2012, 14:00 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

Ok. Jetzt kommt noch eine Disziplin dazu: den Font in den RastPort rein setzen mit SetFont(), und zwar nicht den fixedwidth, der bei openwindow standardmäßig eingestellt ist, sondern den vom Screen. Woher nehmen?
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 18.01.2012 um 14:01 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

18.01.2012, 16:17 Uhr

thomas
Posts: 7716
Nutzer
@AGSzabo:

Na wenn du den vom Screen haben möchtest, dann musst du den vom Screen nehmen.

Ohne Screen layouten geht ohnehin nicht, weil die benötigten Informationen wie Breite der Fensterrahmen u.ä. nur über den Screen verfügbar sind.

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

18.01.2012, 17:10 Uhr

AGSzabo
Posts: 1663
Nutzer
@thomas:

Doch, geht, solange mich nur interesisert wieviel platz der inhalt des fensters braucht.

Und man muss doch irgendwie an die eingestellten Systemfonts ran kommen können?

--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 18.01.2012 um 17:15 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

18.01.2012, 17:51 Uhr

Der_Wanderer
Posts: 1229
Nutzer
So kommt man an die Fonts ran (NTUI source)
Die Funktion öffnet eine Font. Wenn die nicht gefunden wird, dann wird die Screenfont (wie im Menu) gesucht, und wenn die nicht geht dann die System Font (wie in der Shell)

code:
;///////////////////////////////////////////////////////////////////////////////
;/                                                                             /
;/ Syntax: result.l = _ntui_OpenFont {fontname.s,size.l,flags.l,*scr.Screen}   /
;/                                                                             /
;/ Description:                                                                /
;/ private: open a font for later use in NTUI                                  /
;/                                                                             /
;/ Inputs:                                                                     /
;/ - fontname.s   : name of the font (e.g. "topaz.font")                       /
;/ - size.l       : size of the font (e.g. 8)                                  /
;/ - flags.l      : ntui style flags of the font (e.g. #TUIF_BOLD)             /
;/ - *scr.Screen  : optional screen from were to get the default if this fails /
;/                                                                             /
;/ Result:                                                                     /
;/ - *font.TextFont : font handle                                              /
;/                                                                             /
;///////////////////////////////////////////////////////////////////////////////
Function.l _ntui_OpenFont{*fontnameS.str,size.l,flags.l,*scr.Screen}
DEFTYPE.TextAttr ta

*font.TextFont=#NULL

style.l = 0
If flags&#TUIF_BOLD    Then style | #FSF_BOLD
If flags&#TUIF_ITALIC  Then style | #FSF_ITALIC
If size<6 Then size=6
fontname.s = str_Read{&*fontnameS}

If fontname
  If (LCase$(Right$(fontname,5))><".font") Then fontname = fontname+".font"
  ta\ta_Name  = &fontname
  ta\ta_YSize = size          ;/* height of the font */
  ta\ta_Style = style         ;/* intrinsic font style */
  ta\ta_Flags = #FPF_DISKFONT ;|#FPF_PROPORTIONAL      ;/* font preferences and flags */
  *font = OpenDiskFont_(ta)
End If

If (*font=#NULL) AND ((flags&#TUIF_FIX)=0) ;/* if font cannot be opened, try the screen font */
  If *scr><#NULL
    size = *scr\Font\ta_YSize
    If (flags&#TUIF_SMALL) Then size*2/3 : If size<6 Then size=6
    ta\ta_Name  = *scr\Font\ta_Name
    ta\ta_YSize = size
    ta\ta_Style = style
    ta\ta_Flags = *scr\Font\ta_Flags
    *font = OpenDiskFont_(ta)
  End If
End If

If (*font=#NULL) AND ((flags&#TUIF_FIX)=0);/* if font cannot be opened, try the screen font wihtout styles*/
  If *scr><#NULL
    *font = OpenDiskFont_(*scr\Font)
  End If
End If

;If *font=#NULL ;/* if font still cannot be opened, try the default gfx font */
;  *gfxbase.GfxBase = OpenLibrary_ ("graphics.library",0)
;  If *gfxbase
;    *font = *gfxbase\DefaultFont
;  End If
;  CloseLibrary_ *gfxbase
;End If

If (*font=#NULL) ;/* if font still cannot be opened, try the default gfx font */
  InitRastPort_ rp.RastPort
  AskFont_ rp,ta ; might be better
  ta\ta_Style = style
  *font = OpenDiskFont_(ta)
End If

If (*font=#NULL) ;/* if font still cannot be opened, try the default gfx font wihtout styles*/
  InitRastPort_ rp.RastPort
  AskFont_ rp,ta ; might be better
  *font = OpenDiskFont_(ta)
End If

Function Return *font
End Function


--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 18.01.2012 um 17:53 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

18.01.2012, 19:31 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
So kommt man an die Fonts ran (NTUI source)
Die Funktion öffnet eine Font. Wenn die nicht gefunden wird, dann wird die Screenfont (wie im Menu) gesucht, …

Ja, aber der Threadersteller möchte ja den Screenfont haben, ohne einen Screen zu haben.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

18.01.2012, 19:35 Uhr

Thore
Posts: 2266
Nutzer
Ich schreib aus Erinnerung, daher stelle ich diese These asls Frage:
Ist es möglich, über die IntuitionBase an den ersten screen zu kommen, der normalerweise der WB Screen ist, von dort aus auf den RastPort und von da aus den Font auslesen?

[ - Antworten - Zitieren - Direktlink - ]

18.01.2012, 19:35 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
@thomas:
Doch, geht, …

Na, wenn Du es besser weißt, brauchst Du uns ja nicht zu fragen ;)
Zitat:
solange mich nur interesisert wieviel platz der inhalt des fensters braucht.
Wofür soll das gut sein?
Der Platz, den der Inhalt eines Fensters braucht, hängt vom ganz konkreten Screen ab. Und vom Zeitpunkt. Denn solange der Screen nicht gelockt ist, kann sich der Font beliebig ändern.
Zitat:
Und man muss doch irgendwie an die eingestellten Systemfonts ran kommen können?
Nicht ohne Mühe. Dahinter liegt eine ganz bestimmte Absicht.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

18.01.2012, 19:44 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Thore:
Ich schreib aus Erinnerung, daher stelle ich diese These asls Frage:
Ist es möglich, über die IntuitionBase an den ersten screen zu kommen, der normalerweise der WB Screen ist, von dort aus auf den RastPort und von da aus den Font auslesen?

NEIN

Der erste Screen ist mitnichten der WB-Screen. Der erste Screen ist der erste Screen.

Es gibt eine Funktion, die dafür vorgesehen ist, auf den default public screen zuzugreifen, und die heißt LockPubScreen.

Diese hat den Nebeneffekt, die Workbench zu öffnen, falls diese der DefaultPubScreen ist und gerade geschlossen ist (So viel zur Theorie erster Screen==WB).

Aber wenn der Default Screen nicht die Workbench ist, Du aber Deinen Screen mit „like workbench“ Option öffnest, kann der Font wiederum abweichen.

Er kann auch abweichen, wenn die Einstellung zwischenzeitlich geändert wurde, die Workbench diese Änderung aber noch nicht übernommen hat, während Dein neuer Screen natürlich mit aktueller Einstellung geöffnet wird.

Es gibt eine sehr simple Strategie: öffne Deinen eigenen Screen oder locke einen Public Screen und benutze dann einfach den Font, den der Screen besitzt, auf dem das Fenster auch geöffnet wird.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

18.01.2012, 19:49 Uhr

inq
Posts: 445
Nutzer
Zitat:
Original von AGSzabo:
@thomas:

Und man muss doch irgendwie an die eingestellten Systemfonts ran kommen können?



Auch wenn's nicht die feine Art ist:
öffne die Font-prefs Datei aus ENV:Sys, da sind alle 3 Systemfonts gespeichert. Ist relativ einfach zu durchschnüffeln ;)

Mach ich auch manchmal so....

inq (duck und weg)

[ - Antworten - Zitieren - Direktlink - ]

18.01.2012, 20:24 Uhr

thomas
Posts: 7716
Nutzer
@inq:

Das ist aber, wie Holger ganz richtig dargelegt hat, u.U. nicht der Font, der vom später geöffneten Screen benutzt wird.

D.h. wenn du Namen und Größe des Fonts aus einer Datei liest, anstatt aus der gesperrten Screen-Struktur, dann darfst du später auch nicht den Screen-Font benutzen, sondern musst den selbst ermittelten Font mit OpenDiskFont öffnen und nur diesen zur Darstellung der GUI heranziehen. Nicht nur beim Layout, sondern auch beim Zeichnen.

Wenn du das nicht tust, kann der Font, mit dem die GUI gezeichnet wird, von dem, mit dem das Layout gemacht wurde, abweichen. Und das sieht dann erst recht stümperhaft aus.



--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

18.01.2012, 20:49 Uhr

Thore
Posts: 2266
Nutzer
Was mich hier am meisten interessiert, wieso musst du Layouten wenn du noch keinen Screen hast?
Du kannst sowieso erst layouten wenn du alle Informationen beisammen hast, um den Screen zu öffnen, dann kannst du auch eine Rastport mit dem Font erzeugen und loslegen.
Oder Du hast einen anderen Grund den Du uns bisher nicht genannt hast :)

@Holger: Das Abschalten des WB Screens hatte ich vergessen, ich wusste da gabs einen gravierenden Haken.

[ - Antworten - Zitieren - Direktlink - ]

18.01.2012, 21:22 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Es gibt zumindest die Möglichkeit, an die System FOnt zu kommen, ganz ohne Screen:

code:
InitRastPort_ rp.RastPort
  AskFont_ rp,ta
  *font = OpenDiskFont_(ta)


Das ist aber nicht die Screen Font des WB Screens.

Da AGSzabo ein GUI Toolkit schreibt so wie ich, kann ich empfehlen:

Das Toolkit sollte seine eigene(n) Font(s) öffnen, keine Pointer-Kopie machen, da die Pointer jederzeit ungültig werden können, die Font gehört schließlich jemand anderem. Nur eine selbst geöffnete Font gehört dir selbst.
Welche Font das ist, sollte aus dem GUI Toolkit Voreinstellungen kommen.
Wenn dort nichts brauchbares eingestellt ist (Font die es nicht gibt oder keine Konfigurationsdatei), dann kann man sich die Font vom WB Screen clonen (wie gesagt clonen, nicht den Pointer kopieren.
D.h. man besorgt sich den Namen und die Größe der Font und öffnet dann selbst mit OpenDiskFont.
Das muss ja nicht der Screen sein, auf dem sich die App öffnen wird.

NTUI kennt 4 default fonts:
- normal font
- fixed font
- small font
- serif font

Die normal Font nimmt als Fallback die Workbench Screen Font.
Die fixed Font nimmt als Fallback die AmigaOS System Font.
Die small Font nimmt die normale Font mit 2/3 der Höhe.
Die serif Font nummt auch wie Workbench Font als Fallback. (ist natürlich nicht richtig, aber AmigaOS hat leider kein Konzept von Font Familien.
Aber dafür gibts ja dann den Toolkit eigenen Einsteller.

EDIT: Achja, also Layouten musst (und kannst) du ja erst, wenn du den Screen weist wo du hin willst.
Ich denke mal auch dass die TextLength() Funktion mit einem RastPort verknüfpt ist, weil u.U. sich daraus andere Größen ergeben können.
Ist in der Praxis wohl nie der Fall, aber z.B. gäbe es sowas wie Outline, Shadow oder DPI Angaben für RastPorts, dann könnten die Pixelgrößen sich durchaus ändern, je nachdem wie der RastPort konfiguriert ist.

Das heißt ja nicht, dass du nicht schon deine GUI Elemente initialisieren kannst. Aber layouted wird erst unmittelbar bevor du das Fenster öffnest.

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 18.01.2012 um 21:26 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

19.01.2012, 12:18 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
Die serif Font nummt auch wie Workbench Font als Fallback. (ist natürlich nicht richtig, aber AmigaOS hat leider kein Konzept von Font Familien.

Doch, das gibt’s, aber nur für Outline-Schriften.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

22.01.2012, 18:18 Uhr

inq
Posts: 445
Nutzer
Zitat:
Original von thomas:
@inq:

Das ist aber, wie Holger ganz richtig dargelegt hat, u.U. nicht der Font, der vom später geöffneten Screen benutzt wird.

D.h. wenn du Namen und Größe des Fonts aus einer Datei liest, anstatt aus der gesperrten Screen-Struktur, dann darfst du später auch nicht den Screen-Font benutzen, sondern musst den selbst ermittelten Font mit OpenDiskFont öffnen und nur diesen zur Darstellung der GUI heranziehen. Nicht nur beim Layout, sondern auch beim Zeichnen.


Stimmt, aber vielleicht schreibt er ein Tool, das dir sagt, warum die WB nicht so aussieht, wie sie soll?
z.B. Font ist defekt oder was auch immer.
Oder der Font ist zu groß für die WB.
Vielleicht schreibt er auch eine WB-Emu, macht schließlich jeder irgendwann mal.

Da wir den Grund für die offenbar "linke" Herangehensweise nicht wissen, sollten wir auch alle Optionen beim Namen nennen, oder?

inq

[ - Antworten - Zitieren - Direktlink - ]

23.01.2012, 17:28 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von inq:
Stimmt, aber vielleicht schreibt er ein Tool, das dir sagt, warum die WB nicht so aussieht, wie sie soll?

Nein, tut er nicht.
Zitat:
Da wir den Grund für die offenbar "linke" Herangehensweise nicht wissen, sollten wir auch alle Optionen beim Namen nennen, oder?
Guckst Du einfach mal in den ersten Beitrag dieses Threads. Da steht:
Zitat:
Original von AGSzabo:
wie kann man die Höhe und Breite eines Textes berechnen lassen, wenn man noch kein Fenster und auch keinen Screen für den RastPort hat? Das frage ich mich gerade, …


--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > TextLenght() ohne window/screen? [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.