TextField (Eigene Gui)
Übersicht

![]() |
Mathias-KwiatkowskiBetreff: TextField (Eigene Gui) |
![]() Antworten mit Zitat ![]() |
---|---|---|
also, nach dem langen slider problemen habe ich nun ein neues.
meine fenster werden gemalt, danach setz ich ein viewport in grösse des benutzbaren fensters. nun lass ich alles kommen labels, buttons und eben auch textfelder. und da fängt das problem an. den auch im textfeld setz ich ein viewport. allerdings weiss ich nicht wie ich es berechnen soll. hier ein bild dazu. Edit: das textfeld hat ein scrol bereich der im minus geht ( das funktioniert auch ) sonst würde die schwarze schrift nicht im fenster dargestellt werden. die schwarze schrift geht logischerweise auch nich aus dem fenster raus (dank viewport ) aber naja wie gesagt ich weiss nich wie ich es berechnen soll ( das neue viewport für den text ) |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo!
Da ich, aufgrund deines sliders, auch ne gui angefangen habe, kann ich dir vielleicht mit meinem ansatz helfen. Zuersteinmal: Um viewports zu realisieren, habe ich einen kleinen Type geschrieben, TViewport. Dieser hat x,y,w,h als "bereich" sowie felder für die "alten" viewport daten. Mit der methode "apply()" werden die alten viewportdaten mit GetViewport() geholt und gespeichert. Heißt: Fenster will sich zeichnen. Krams drumrum wird gemalt, dann der viewport mit viewport.apply() gesetzt und die childs kommen dran. Sprich elemente wie Textfelder etc ![]() Ist alles fertig, führe ich viewport.restore() aus. Dieses setzt den ursprünglichen viewport, der vorher aktiv war. Soweit mitgekommen? Gut. Was haben wir also? Wir können beliebig viele viewports nacheinander setzen und immer wieder zum letzten zurückkehren. Hier könntest du nun für dein Textfield eine weitere methode einführen: applyWithIntersect() odersowas. Das sieht etwa wie folgt aus (habs nicht getestet, nur in mein type reingeschrieben!) BlitzMax: [AUSKLAPPEN] Type TViewport Als viewport breite/höhe würde ich die des Textfeldes nehmen. Sollte sich deine frage auf die schriftgrößenberechnung beziehen, hab ich dich falsch verstanden^^ |
||
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
das is ja weniger mien probelem, wie gesagt alte daten speichere ich auch.
bzw übermittel sie. setvieport win.x,win.y,win.w,win.h textfield.draw(win.x,win.y,win.w,win.h) im draw(ox,oy,ow,oh) dann das gadget wird gezeichnet setviewport self.x,self.y,sel.w,self.h nun der text aber naja das viewport ist ja nun unabhängig vom alten vll ausser range. und ich weiss nicht wie ich es genau rechnen soll. eine möglichkeit wäre self.x-ox usw... aber ... naja das funtzt net ^^ |
||
- Zuletzt bearbeitet von Mathias-Kwiatkowski am Mi, Jan 02, 2013 0:02, insgesamt 2-mal bearbeitet
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ähm.
Entschuldige, ich steig nicht ganz durch. In meinen augen liegt hier kein problem vor. Bedenke allerdings, das dein Viewport sich auf bildschirmpositionen bezieht. Wahrscheinlich haben deine Guielemente eine relative position im bezug auf das Fenster. Heißt: Ein textfield bei x= 0, y= 0 liegt oben links in der ecke des fensters, nicht der grafischen oberfläche. Wenn dem so ist, musst du für das Textfield viewport simpel SetViewport(self.x + ox, self.y + oy, self.w, self.h) nutzen. Hast du allerdings totale positionen für deine elemente, hast du es falsch durchdacht ;D Stelle sicher, das du aus dem lokalen, objektbezogenen lokalen positionen die Globalen positionen errechnen kannst. Kommt nun drauf an, wie deine lokalen positionen aussehen^^ Kleiner tipp: Wenn du globale positionen für deine guielemente nutzt, wird es mit verschiebbaren fenstern schwerer. Meine aufrufe sind wie folgt: *hauptelement kriegt draw aufforderung* -> Geht alle unterelemente durch und ruft Draw(self.x,self.y) auf. --> Unterelment: zeichnet sich selbst mit offsetx + self.x, offsety + self.y, geht dann alle unterelemente durch und ruft dort Draw(self.x+offsetx, self.y+offsetY) auf.. Diesen baum kann man theoretisch unendlich weit forsetzen. OffsetX / OffsetY sind die parameter, die die methode erhält. Siehts bei dir ähnlich aus? Addiere einfach den offset auf die textfield.x bzw textfield.y variablen und die landest bei globalen positionen, welche du für das viewport brauchst. |
||
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
also du verstehst mein problem nicht, vll drück ich mich schlecht aus...
ich weiss das viewport sich auf (den bereich konzentriert...) es geht um die rechnung wenn ich ein viewport 50,50,100,100 gebe und darunter ein 100,100,100,100 überschneidet es sich ja. z.b. was schon ma funktioniert ist: Code: [AUSKLAPPEN] TempX =Window X - Scrollbereich If TempX < WindowX Then BereichX = WindowX SetViewport (BereichX, .... ) aber was wenn Textfield X + Textfield Weite > als window x + window weite ist, wie berechne ich das? |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Was spricht gegen simples min/max, wie ich es schon vorgeschlagen hatte?
Immernoch: In meinen augen ist da kein problem ![]() Wenn etwas über das "fenster" hinaus ragt, nimm einfach den rand vom fenster. Anyways, etwas breiter gefasst: BlitzMax: [AUSKLAPPEN]
Hier mal 2 wege, um die positionen zu beschränken. Obige rechnugn ist aus dem kopf geschrieben und nicht getestet, sollte aber soweit hinhaun. Im endeffekt werden tmpx = 100, tmpy = 100, tmpw = 50, tmph = 50 werden. Die rechnung lässt sich beliebig vereinfachen, min / max könnte man auch verschachteln.. aber so sollte es erstmal ausreichen ![]() Hoffentlich hauts bei dir nun hin ![]() |
||
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
ja klingt logisch, bis der scrollbereich hinzukommt^^
also habs nun so wie du aber naja es funtktioniert einfach nich. Code: [AUSKLAPPEN] If TextFieldX < WindowX Then ZeigeX = WindowX If TextFieldX + TextFieldW > WindowX + WindowW Then MaxBereich = ((WindowX + WindowW) - (TextFieldX + TextFieldW)) und hier der aufruf des fensters Code: [AUSKLAPPEN] Global TestFenster:TWindow = TWindow.Create("Fenster fsdjkhkfjjsdfhskhdfjhsdkfjsj", 50, 50, 300, 500, "Scale | Close | Maximize | SetTask")
Global Text:TTextField = ttextfield.Create(600, 900, 300, Testfenster) Global TestButton:TButton = tbutton.Create("LOL", 3200, 3300, 150, 20, Testfenster) also wenn noch nicht gescrollt worden ist, steht der text immernoch dort (ausserhalb des fensters) sobald ich scrolle wird er kleiner^^ keine ahnung ... |
||
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich habe nun eine lösung gefunden ... endlich.
Code: [AUSKLAPPEN] If tx < wx Then SX = wx
If tx < wx Then Temp:Float = wx - tx sw = Self.w - temp EndIf If tx + Self.w > wx + ww Then Temp:Float = (tx + Self.w) - (wx + ww) sw = Self.w - temp Print Temp EndIf muss ergänzen. TX = textfield X TW= Textfield W WX =window x WW =window w SW = Offsetz für die weite des viewport's |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
da kann ich euch nur nochmal raten, sich durch mein GUI Gadget Tutorial zu arbeiten. Da stehen schon im Kapitel 2 genau solche Dinge drin: wie verschachtelnde Viewports aus Mother und Child zu handlen sind.
Das Kapitel über Scrolling gibts leider momentan nur in der Syntax eines Monkey Tutorial. Läst sich aber problemlos auf BMax übetragen. An sich ändert sich aber durch Scrolling gar nix an der Viewport Logik, wenn man die korrekt implementiert hat. Der Phillip ist da schon auf dem richtigen Weg, dass jedes Gadget einen eigenen Viewport verwaltet. Allerdings muss der "alte" gar nicht gesichtert werden. Durch das rekursive Iterieren durch alle Childs wird er sowieso wieder richtig zurückgestellt, wenn man aus einem Child in die Mother zurückspringt. |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Naja, in welcher richtung verschachtelt wird, ist mmn. geschmackssache.
Aber verwirrts bin ich trotzdem: Wieso genau brauchst du den scrolling bereich für deinen Viewport? Für mich schleierhaft. Beim scrolling ändert sich nur der startpunkt des zeichnens für den text. Die tatsächliche onscreen-clippingwerte bleiben unangetastet! Je nachdem wie du scrollst, kannst du SetOrigin() verwenden: BlitzMax: [AUSKLAPPEN] Local textbreite:Int = TextWidth( _string) Du siehst, das viewport bleibt unangetastet. Durch SetOrigin() wird eine art offset auf alle zeichenoperationen geadded. Das Viewport bleibt aber von den originwerten verschont: Es hat immernoch die selbe position auf dem bildschirm. Heißt im klartext: Wir schieben den text ein wenig nach links, wodurch der vordere teil "ausserhalb" des viewports landet und wir einen scrollingeffekt haben. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group