Eigene GUI Slider?
Übersicht

![]() |
Mathias-KwiatkowskiBetreff: Eigene GUI Slider? |
![]() Antworten mit Zitat ![]() |
---|---|---|
wollte slider programmieren , also falls in meinen fenstern etwas enthalten ist was über der fensterposition ist, und das fenster aktiv ist, taucht ein slider auf. das is auch nich mein problem, mein grosses problem ist ehr die X achse zu setzen.
sprich wenn sich die Cam im fenster vergrössert, schiebt man den inhalt somit nach links weg. fazit : CamX=CamX+1 hier der codeausschnitt der benötigt wird. (um nicht gleich die ganze gui zu posten xD Code: [AUSKLAPPEN] If Self.ScrollX > 0 Then
If Self.Activ = 1 Then TTT:Float = 0 If Self.ScrollY > 0 Then TTT:Float = 15 SichtW:Float = Self.W - TTT BereichW:Float = -ttt + Self.ScrollX MaxLeng:Float = Float(SichtW) / Float(BereichW) SetColor 255, 255, 255 DrawRect Self.X + 1 + MaxLeng * Self.CamX / BereichW, Self.Y + Self.H - 15, Self.W - 1, 14 SliderMaxLeng:Float = Float(Self.W - 1) * maxleng / 100.0 SetScale SliderMaxLeng, 1 SetColor 0, 0, 255 CC:Float = SliderMaxLeng * Self.CamX '<- Die Rechnung um den slider in der X achse nach rechts zu schieben. wenn dort folgende rechnung steht, funktioniert gar nichts : SliderMaxLeng * Self.CamX / BereichW DrawRect Self.X + 1 + CC, Self.Y + Self.H - 15, 100, 14 SetScale 1, 1 SetColor 255, 0, 0 If BaseMouseX > Self.X + 2 And BaseMouseX < Self.X + 2 + TextWidth("<-") And BaseMouseY > Self.Y + Self.H - TextHeight("W") - 1 And BaseMouseY < Self.Y + Self.H - 1 Then SetColor 255, 255, 0 If BaseMouseButtonLeft = 2 Or BaseMouseButtonLeft = 5 Then BaseMouseButtonLeft = 5 Self.CamX = Self.CamX - 1 If Self.CamX < 0 Then Self.CamX = 0 End If EndIf DrawText "<-", Self.X + 2, Self.Y + Self.H - TextHeight("W") - 1 SetColor 255, 0, 0 If BaseMouseX > Self.X + Self.W - TextWidth("->") - 2 And BaseMouseX < Self.X + Self.W - 2 And BaseMouseY > Self.Y + Self.H - TextHeight("W") - 1 And BaseMouseY < Self.Y + Self.H - 1 Then SetColor 255, 255, 0 If BaseMouseButtonLeft = 2 Or BaseMouseButtonLeft = 5 Then BaseMouseButtonLeft = 5 Self.CamX = Self.CamX + 1 If Self.CamX > BereichW - SichtW Then Self.CamX = BereichW - SichtW End If EndIf DrawText "->", Self.X + Self.W - TextWidth("->") - 2, Self.Y + Self.H - TextHeight("W") - 1 EndIf Else Self.CamX = 0 EndIf |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
hast du ein problem beim slider oder beim bildausschnitt?
slider am beispiel x-achse der slider hat zwei größen: die breite, die ihm zum sliden zur verfügung steht (fensterbreite) sagen wir mal 800 pix die breite des zu großen bildes (sagen wir mal 1000pix) daraus ergibt sich, dass die 800pix die 1000pix repräsentieren müssen. der sichtbare teil des bildes sind 800 von 1000pix also 80% der slider selbst ist 800pix lang seine sliderbar darf aber nur 80% von 800 = 640 pix lang sein und kann nur 160pix bewegt werden. also von 0 bis 160. dies repräsentiert einen scrollbaren bildbereich von 0 bis 160/0.8 also von 0 bis 200. Wird der slider also um 80 pixel bewegt, dann bewegt sich das image um 100pix negativ |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: dies repräsentiert einen scrollbaren bildbereich von 0 bis 160/0.8 also von 0 bis 200. Wird der slider also um 80 pixel bewegt, dann bewegt sich das image um 100pix negativ
wie komme ich auf die 160/0.8 also auf 160 weiss ich wie aber wie auf die 0.8? rechenweg? EDIT: ah die 80% / 100 alles kla^^ fals ich falsch liegt sags^^ Edit: Nein es funktioniert rein gar nich, also folgendes: In SichtW=1000 In BereichW=800 damit wir bei dem beispiel bleiben 1000 zu 800 meine rechnung is dort ja genaustens zu verfolgen. Code: [AUSKLAPPEN] SichtW:Float = Self.W - 16
BereichW:Float = Self.ScrollX MaxLeng:Float = Float(SichtW) / Float(BereichW) SetColor 192, 192, 192 DrawRect Self.X + 1, Self.Y + Self.H - 15, SichtW, 15 SetColor 0, 0, 0 DrawRect Self.X + 1 + 1, Self.Y + Self.H - 15 + 1, SichtW - 2, 15 - 2 BereichProzent:Float =BereichW/100 SichtbarProzent:Float = SichtW / 100 ProzentSumme = BereichProzent * SichtbarProzent Mov:Float = SichtW / 100 * ProzentSumme MaxMov:Float = (SichtW - Mov) / (ProzentSumme / 100) und nun kommt die sache mit der cam Code: [AUSKLAPPEN] Self.CamX = Self.CamX + 1
If Self.CamX > MaxMov Then Self.CamX = MaxMov der balken fährt voll aus der leiste raus. und ein ende gibt es somit denk ich auch nich. rückgabe wert von BisMov = 1.#INF0000 mache ich es aber so: Code: [AUSKLAPPEN] Self.CamX = Self.CamX + 1
If Self.CamX > MaxMov Then Self.CamX = MaxMov verhält sich der balken völlig richtig, aber man sieht nich den gesammten inhalt des fensters. der button der bis 1000 geht erscheint nicht. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich blick nicht ganz mit deinen variablennamen durch, aber hier mein Beispiel:
BlitzMax: [AUSKLAPPEN] SuperStrict |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
jop nichts anderes habe ich ausser das man bei mir auf buttons klicken muss. und dennoch wird der komplette inhalt nicht angezeigt,. warum auch immer
meine abfrage muss so lauten, damit der komplette inhalt im fenster angezeigt wird If Self.CamX > Self.ScrollX - SichtW Then Self.CamX = Self.ScrollX - SichtW aber dann stimmt die slider Grösse nicht mehr und des ding fährt bedenkenslos aus dem fenster raus |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
aber das eine hat doch nichts mit dem anderen zu tun.... die Slidergröße ist doch immer FensterGröße*Fenstergröße/BildGröße und unabhängig vom ScrollX | ||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
darauf kam ich auch
beachte nur die X zeichnung Code: [AUSKLAPPEN] Method Draw(XW:Float = 0, YW:Int = 0)
For BGUI:TBaseGui = EachIn BaseGuiList If bgui.Window = Self.Win Then XX:Float = bgui.Window.CamX / bgui.Window.FaktorX YY:Float = bgui.Window.Camy EndIf Next XW = XW + Self.X - xx YW = YW + Self.Y - yy SetColor 192, 192, 192 DrawRect XW + 1, YW + 1, Self.W - 1, Self.H - 1 SetColor Self.Color[0], Self.Color[0], Self.Color[0] DrawLine XW, YW, XW + Self.W, YW DrawLine XW, YW, XW, YW + Self.H SetColor Self.Color[1], Self.Color[1], Self.Color[1] DrawLine XW + Self.W, YW, XW + Self.W, YW + Self.H DrawLine XW, YW + Self.H, XW + Self.W, YW + Self.H SetColor Self.Color[1], Self.Color[1], Self.Color[1] DrawText Self.Text, XW + Self.W / 2 - TextWidth(Self.Text) / 2, YW + Self.H / 2 - TextHeight("W") / 2 SetColor Self.Color[0], Self.Color[0], Self.Color[0] DrawText Self.Text, XW + Self.W / 2 - TextWidth(Self.Text) / 2 + 1, YW + Self.H / 2 - TextHeight("W") / 2 + 1 For BGUI:TBaseGui = EachIn BaseGuiList If bgui.Window = Self.Win Then 'Auf dem Button Fahren und Klicken, wenn fenster activ ist If bgui.Window.Activ = 1 Then If BaseMouseX > bgui.Window.X And BaseMouseX < bgui.Window.X + bgui.Window.W And BaseMouseY > bgui.Window.Y + 2 + TextHeight("W") And BaseMouseY < bgui.Window.Y + bgui.Window.H Then If BaseMouseX > XW And BaseMouseX < XW + Self.W And BaseMouseY > YW And BaseMouseY < YW + Self.H Then Self.Activ = 1 Else Self.Activ = 0 End If If BaseMouseButtonLeft = 2 And Self.Activ = 1 Then Self.ButtonActiv = 1 Else Self.ButtonActiv = 0 EndIf Else Self.Activ = 0 Self.ButtonActiv = 0 EndIf End If 'Errechnen ob buttonweite grösser als window weite ist If Self.X + Self.W > bgui.Window.W - 2 Then If Self.X + Self.W > bgui.Window.ScrollX Then bgui.Window.ScrollX = Self.X + Self.W + 2 EndIf If Self.Y + Self.H > bgui.Window.H - TextHeight("W") - 2 Then If Self.Y + Self.H > bgui.Window.ScrollY Then bgui.Window.Scrolly = Self.Y + Self.H + TextHeight("W") + 2 EndIf End If Next If Self.Activ = 1 Then Self.Color[0] = Self.Color[0] - 4 If Self.Color[0] < 0 Then Self.Color[0] = 0 Self.Color[1] = Self.Color[1] + 4 If Self.Color[1] > 255 Then Self.Color[1] = 255 End If If Self.Activ = 0 Then Self.Color[0] = Self.Color[0] + 4 If Self.Color[0] > 255 Then Self.Color[0] = 255 Self.Color[1] = Self.Color[1] - 4 If Self.Color[1] < 0 Then Self.Color[1] = 0 End If SetColor 255, 255, 255 End Method |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sei mir nicht böse... aber ich habe keine Ahnung, was dein Code hier tut. Ungenaue Variablennamen und fehlende Kommentierung in Kombination mit "nur Teil-Code" statt eines lauffähigen Beispiels machen es für Dritte nahezu unmöglich dir zu helfen.
Auch sind deine Beschreibungen, was noch nicht zufriedenstellend läuft so kurz, dass man nicht wirklich erfährt, wo Du nun beraten werden willst.... Ich werde ja demnächst ein GUI-Tutorial hier schreiben. Da wird der Slider einfach aus 2 Gadgets bestehen. Das eine ist die umgebende Mutter und darin als zweites Gadget ein Rechteck, dass sich nur innerhalb der Mutter bewegen darf. Dieses Gadget hat dann die Eigenschaft ScrollEnable=YES und BorderTyp=IN_BORDER, was bedeutet, das der Slider sich innerhalb der Mutter bewegen darf aber nicht darüber hinaus. Ein Fenster, in dem damit ein zu großes Bild bewegt werden kann, wären wieder zwei solche Gadgets. Das Fenster wäre die Mutter, das bild wäre das Child mit den Eigenschaften ScrollEnable=YES und BorderTyp=OUT_BORDER, was dann wiederum bedeutet, dass man das innere Objekt nur soweit bewegen kann das seine AußenKanten nie im Fenster zu sehen sein dürfen. |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
hi nach langer zeit kann ich vieleicht weitermachen ^^...
also das problem des sliders ist immernoch aktuell. mein problem sind die angaben. ich habe 3 ("Weiten") um es bildlich zu machen so: erst mal fenster weite dann im fenster die sliderweite und dann noch das gesammte was man ja nicht sieht aber das gescrollt werden muss. in meinem programm möchte ich es gern so machen Slider.Set (Bis) Slider.Get() das heisst, mit slider.set möchte ich dem slider nun mitteilen das er z.b. 200 pixel scrollen soll mit slider.get möchte ich erfragen an welcher position sich nun der lustige schieberegler befindet. ich habe mir nun mehrfach alles durchgelesen und auch mehrfach durchgearbeitet, was von dir (Midmaster) kam. aber alles passt nicht wirklich. dein bsp. funktioniert natürlich, hat ja auch eine angabe weniger. und wenn ich nun sag der slider muss 200 pix scrollen dann darf er auch nur 200. mit dem bsp funktioniert es nicht so wirklich ganz. ok meine probleme, sind: herrauszufinden wie ich den scrollbalken vom slider eine maximale weite gebe ( so das er z.b. auch nur 200 pix weit scrollt.) die richtige positionsabfrage (wo steht der slider) vieleicht weiss nun jemand ein rat den ich nun befolgen kann. oder ein rechenweg. da es eigentlich nur eine rechnerei ist. |
||
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
hi nach langer zeit kann ich vieleicht weitermachen ^^...
also das problem des sliders ist immernoch aktuell. mein problem sind die angaben. ich habe 3 ("Weiten") um es bildlich zu machen so: erst mal fenster weite dann im fenster die sliderweite und dann noch das gesammte was man ja nicht sieht aber das gescrollt werden muss. in meinem programm möchte ich es gern so machen Slider.Set (Bis) Slider.Get() das heisst, mit slider.set möchte ich dem slider nun mitteilen das er z.b. 200 pixel scrollen soll mit slider.get möchte ich erfragen an welcher position sich nun der lustige schieberegler befindet. ich habe mir nun mehrfach alles durchgelesen und auch mehrfach durchgearbeitet, was von dir (Midmaster) kam. aber alles passt nicht wirklich. dein bsp. funktioniert natürlich, hat ja auch eine angabe weniger. und wenn ich nun sag der slider muss 200 pix scrollen dann darf er auch nur 200. mit dem bsp funktioniert es nicht so wirklich ganz. ok meine probleme, sind: herrauszufinden wie ich den scrollbalken vom slider eine maximale weite gebe ( so das er z.b. auch nur 200 pix weit scrollt.) die richtige positionsabfrage (wo steht der slider) vieleicht weiss nun jemand ein rat den ich nun befolgen kann. oder ein rechenweg. da es eigentlich nur eine rechnerei ist. EDIT doppelpost. aus unerklärlichen gründen wurde mein beitrag 2 mal gesand. ich möchte mich für den doppelpost entschuldigen. |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das ist ne reine logiksache, gelle?
Ich würde das ganze mit Floatzahlen regeln (alternativ double) 1) Du brauchst die Breite vom Slider-Pin (dat ding was gezogen wird) 2) Du brauchst die breite vom Slider generell (dat ding, wo der pin drauf läuft) 3) Nun rechnest du widht - pin_width als "slider breite" 4) Wenn du den wert abfragst, gib eine zahl zwischen 0.0 und 1.0 zurück: startpunkt_des_pins / double(bei_3_errechnete_breite) 5) Beim setzen musst du lediglich drauf aufpassen, das der wert zwischen 0 und der von 3) errechneten breite leigt, ansonsten auf 0 bzw auf MaxBreite setzen ![]() Um nun den fensterinhalt zu verschieben, könntest du SetOrigin() nutzen. als wert für x nimmst du: (Breite_gesamtzeugs - Breite_sichtbares) * Slider.get() Eventuell noch mit den vorzeichen spielen, dafür bin ich immer zu blöde *g* Sinn dahinter ist, das du eine gleit-breite hast (die differenz zwischen sichtbaren und gesamt) und diesen mit der Sliderposition verrechnet. Bei 1 gibt es logischerweise die volle verschiebung, was darin resultiert, das du den letzten sichtbaren teil siehst. Bei 0 gibt es den anfangsbereich, wie in deiner skizze dargestellt =) Und nochmal zur erinnerung: Bei beidem, sliderbreite und slider-pin-breite, sowie Sichtbaren und Totales,mögliches, sichtbare brauchst du die Differenz. Arbeitest du mit den ganzen werten, wird es verzerrt aussehen ![]() Okay ich merke, ich hab mal wieder nicht das zeug, zu erklären. Ich schaue gleich mal, das ich meine idee umsetze, schön abgepackt als Type =) (editiere ich dann hier rien) |
||
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Ich würde das ganze mit Floatzahlen regeln (alternativ double)
1) Du brauchst die Breite vom Slider-Pin (dat ding was gezogen wird) 2) Du brauchst die breite vom Slider generell (dat ding, wo der pin drauf läuft) genau das is ja das problem alleine herrauszufinden wie gross der slider sein darf... je mehr inhalt desto kleiner wird ja laut logig der balken, ... das das ganze in float sein sollte ist an sich schon kla. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mathias....
deinem Beispielbild fehlt eine Rahmenbox... nämlich, die worin sich der Slider bewegen darf. Die ist aber wichtig für die Berechnungen. Soll die in dem Beispielbild ebenfalls 500 breit sein? und darin der Slider mit 300? Oder meinst du mit den 300 den Sliderrahmen und darin soll der (dann kleinere) Silder nur richtig verschoben werden? Wenn Dein Originalbild 1000 breit ist und das Fenster 500, dann folgt daraus, dass der Sliderrahmen 500 und der Slider 250 sein muss! und eben nicht 300!!! Das kann du probieren wie du willst das geht nie auf! Slider zu SliderRahmen immer wie Bild zu Fenster!!! Einen Slider von 250 in einem Rahmen von 500 kannst du um 250 bewegen. Und das entspricht genau dem was sich das Original-Bild in seinem Fesnter bewegen kann, nämlich ein 1000er Bild um 500 in einem 500er Rahmen Experimentiere in meinem Beispiel noch mal mit den beiden Werten bei ... Global FensterBreite#=... Global BildBreite#=.... ....rum, und du wirst sehe es geht immer, egal welche Werte du reinschreibst! |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
- Zuletzt bearbeitet von Midimaster am Mo, Dez 17, 2012 20:31, insgesamt einmal bearbeitet
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
also die rahmenbox is vorhanden, da ich ja nicht weiss wie gross der slider sein darf fehlt also der slider.
aber was is wenn der sliderrahmen nunmal 300 ist? ich kann ja angeben wo der slider ist also x,y,w,h start x (x) start y (y) ende width (w) ende height (h) so der rahmen ist nun 300 wie gross der slider ist weiss der hund ^^ und das fenster ist 500 gross. aber das bild 1000 |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
na, wenn der sliderrahmen nur 300 ist, dann darf der slider nur 150 sein. | ||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
das heisst also
sliderboxweite / ( fenster / gesammtbild ) dieses müsste dann ja die richtige rechnung sein oder? |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
so hier jetzt ein code mit variablem sliderrahmen
BlitzMax: [AUSKLAPPEN]
|
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
wenn ich es so mache so wie du dein code verwendest, funktioniert es eben nicht.
ich habe nun in meinem type die variabeln umgetippert, so wie du sie genutzt hast. aber es geht einfach nicht ^^ das resultat ist das hier: ich gebe ja zu das dein testprog funktioniert. das habe ich auch zahlreiche male geschafft. aber sobald es umgesetzt wird. is einfach ende.... und mal abgesehen davon scrollen kann man das nich nenn. schau mal wie klein die balken werden. der balken auf dem desktop is nur 50 schritte lang ^^ und im fenster selber sieht man das nich durchgescrollt wird. also bis zum ende. nur so nebenbei. von wegen uhrheberecht, es geht um die eigene gui entwicklung das hintergrundsbild ist variabel und stammt vom amiga os 3.0 . . . EDIT: Code: [AUSKLAPPEN] so benannte ich nun die felder im type Field ScrollBarFaktor:Float Field RahmenBreite:Float Field SizeFaktor:Float Field FensterBreite:Float Field BildBreite:Float und das ist nun die rechenformel Self.FensterBreite = Self.Haben 'weite des fensters Self.RahmenBreite = Self.WH - 2 'weite des rahmens vom slider Self.BildBreite = Self.Brauchen 'bildweite Self.SizeFaktor = Self.FensterBreite / Self.RahmenBreite Self.ScrollBarFaktor = Self.FensterBreite / Self.BildBreite hier die angaben die gemacht werden können Method SetRange(von:Float, Bis:Float) Self.Haben = von Self.Brauchen = Bis End Method Method GetSlider:Float() Return Self.Pos / Self.ScrollBarFaktor * Self.SizeFaktor End Method lustig ist das jeder slider sich anders verhällt. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
jedesmal, wenn du haben und brauchen neu festlegst, musst du auch die sliderbreite neu berechnen lassen. der Sliderrahmen bleibt ja immer gleich groß, doch der darin befindliche Slider wird größer oder kleiner.
Schließlich repäsentiert er das Verhältnis von Fenster zu OriginalBild. Ist das Originalbild 10x so groß wie das zur Verfügung stehende Fenster, dann nimmt auch der Slider nur 1/10tel des Sliderrahmens ein. der Restplatz sind dann die 9/10tel, die auch die 9/10 des verdeckten Teils des Originalbildes repräsentieren. Ist Self.WH wirklich die SliderRahmenbreite in Pixeln? tipp: printe doch mal alle Vorgabenzahlen und daraus errechnete Variablenwerte eines konkreten Beispiels in das Consolenfenster und sende uns diese Werte. Man müsste schon an den Zahlen sehen, wo es hakt! |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
- Zuletzt bearbeitet von Midimaster am Mo, Dez 17, 2012 21:42, insgesamt 2-mal bearbeitet
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Okay tut mir leid, ich steige durch die namen der variablen nicht ganz so durch ![]() Du schreibst, das du ein type hast, was die scrollbar regelt? Sicherheitskopie und direkt weg. Dann leg das Type in einer Testumgebung neu an, ähnlich minimalistisch wie midimaster's code. Ich mach das (jetzt endlich) auch einmal: Ein kleines absolutes mini-type schreiben, was nur 3 methoden und eine funktion hat: SetSlider(), GetSlider(), Draw() und als funktion : Create ![]() Das draw spielt hier die wichtigste rolle, deshalb die testumgebung: Es soll absolut nix anderes machen, wie einen fixwert Breite und Höhe entgegen nehmen (das, was später durch den slider verändert werden soll) und eine Diagonale Linie darstellen. Schwer? Nein. Grund ist ganz einfach: Sollte dein slidercode korrekt sein und das drawen verzogen, ist es schwer festzustellen. Wenn sich alles gleich verhält, ist es vielleicht auch nurn minibug.. irgendwo ne Globale statt lokale angesprochen. Egal - neu machen, austesten. Ist ja nicht viel code =) EDIT: Hui, ich muss sagen, dafür das die rechnungen recht simpel sind, verfranze ich mich auch ständig. Hab nun ein kleines type angelegt, was über einen Viewport und Origin ein "fenster" simuliert und einen inhalt dort anzeigt. Ich bastel das grade noch ein wenig aus und entferne diverse fix-werte, damit das ganze nachvollziehbar bleibt. Grafisch HOCH AUFWENDIG, es stellt immerhin ein vollwertiges fenster und einen fullhd-guislider dar :> (4 lines als rahmen, 2 rects, einer ist der anfasser, einer der slider...) EDIT 2: Herzlichen glückwunsch, phillip ![]() Hab doch glatt meinen eigenen bday vergessen, weil mich das problem grade so gefesselt hat ![]() Hier mal mein code. Enthalten sind ein TSlider Type, welches ein paar schnittstellen zum ansteuern und zeichnen enthält. Ein paar wichtige sachen wirst du für dich ändern müssen, zb musste mein Slider wissen, wie breit das fenster / der inhalt ist (zur berechnung) und ausserdem wie hoch ein fenster ist (zum zeichnen) Obwohl ich versucht habe, das ganze einfach zu halten, ist es doch ne ecke komplexer geworden. Anyways, ich hab viele kommentare reingebombt, vielleicht hilft es dir ja ![]() Anmerkung: Ich habe differenziert zwischen *beispiel* SetPosition und SetTotalPosition. Die GetPos, SetPos dinger etc beziehen sich auf double werte zwischen 0 und 1. Halt "wie weit" der pin auf dem slider gewandert ist. Der Total-krams bezieht sich auf pixeleinheiten auf Slider-breite gebracht. NICHT auf die Mitte des Pins! Oder ums besser zu sagen: Total = normal * breite. Ist eher ne persöhnliche vorliebe.. Kick die dinger raus, wenn du sie nicht brauchst - sonst killt das die übersichtlichkeit ![]() Die Draw-Schnittstelle musst du selber einbauen und eventuell auch ganz woanders einbauen. Hier stört zb, das der Slider Breite (höhe?) vom INHALT (Bild, text, etc) wissen muss. Ebenso das ich überall zumindest die Fensterbreite brauche. Um dir die möglichkeit des nachvollziehens zu geben, habe ich recht eindeutige namen gewählt und alles brav als Fields abgepackt. CODE: BlitzMax: [AUSKLAPPEN] SuperStrict Kurz die goodies: isPointInside: BlitzMax: [AUSKLAPPEN] 'Abfrage, ob maus auf dem slider ist. Returnt 0, wenn nicht, 1 wenn die maus NUR auf dem Slider ist und 2, wenn die maus auf dem Slider-Pin (Anfasser) ist. Resize: BlitzMax: [AUSKLAPPEN] 'Updatet den Slider. Braucht Fensterbreite, Inhaltbreite (um die breite des Sliders zu berechnen), sowie die fensterhöhe (nur für zeichnung intressant. Musste ich mit reinnehmen :3 Getter / Setter: SetPosition( x:double ) - Setzt die position anhand eines Skalierungswertes (von 0 bis 1) GetPosition( x:double ) - Gibt den aktuellen positionswert. doStep: (zum vereinfachten bewegen des pins) BlitzMax: [AUSKLAPPEN] 'doStep ist mit Translate aus 3d engines zu vergleichen. es nimmt zb -1 oder 1 als wert. Der wert entspricht (je nach gleitzahlen ungenauigkeit) etwa einer anzahl pixeln ( wert: -1 = ungefähr -1 pixel bewegung auf den slider) calcPosition: BlitzMax: [AUSKLAPPEN] 'Berechnet den nötigen pos-wert, um den Slider mittig zu platzieren. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group