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: 7718 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 flagsTUIF_BOLD Then style | #FSF_BOLD If flagsTUIF_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" tata_Name = &fontname tata_YSize = size ;/* height of the font */ tata_Style = style ;/* intrinsic font style */ tata_Flags = #FPF_DISKFONT ;|#FPF_PROPORTIONAL ;/* font preferences and flags */ *font = OpenDiskFont_(ta) End If If (*font=#NULL) AND ((flagsTUIF_FIX)=0) ;/* if font cannot be opened, try the screen font */ If *scr><#NULL size = *scrFontta_YSize If (flagsTUIF_SMALL) Then size*2/3 : If size<6 Then size=6 tata_Name = *scrFontta_Name tata_YSize = size tata_Style = style tata_Flags = *scrFontta_Flags *font = OpenDiskFont_(ta) End If End If If (*font=#NULL) AND ((flagsTUIF_FIX)=0);/* if font cannot be opened, try the screen font wihtout styles*/ If *scr><#NULL *font = OpenDiskFont_(*scrFont) 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 = *gfxbaseDefaultFont ; 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 tata_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: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:Na, wenn Du es besser weißt, brauchst Du uns ja nicht zu fragen Zitat: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: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: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: 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: 7718 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: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: 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:Nein, tut er nicht. Zitat:Guckst Du einfach mal in den ersten Beitrag dieses Threads. Da steht: Zitat: -- 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. |