Wie Bekomme Ich eine Scrollbar hin ?
Übersicht

tommyglockeBetreff: Wie Bekomme Ich eine Scrollbar hin ? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich versuche schon seit gestern eine Scrollbar zu coden.
aber das bekomme ich nicht so hin ! Also: ich habe einen Text und möchte das er, wenn ich die Tasten Up oder Down drücke, nach unten bzw. nach oben scrollt. Außerdem soll rechts noch ein Rechteck mitlaufen also eine Scrollbar. Welche Befele brauch ich um das am besten umzusetzen? mfg Tommy |
||
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
Befehle?
naja, zum Zeichnen wohl ql:color, ql:rect, usw. um eine Scrollbar zu machen brauchst du einige Variablen. Eine Variable z.B., die speichert, an welcher Stelle du im Dokument (oder Text) bist. |
||
tommyglocke |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke, mal sehn ob es klappt ![]() |
||
tommyglocke |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Naja so richtig klappts nicht aber ich probiere weiter.
Danke noch mal ! mfg Tommy |
||
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schau, du hast jetzt eine Var, z.B. ypos
Die speichert, wo du bist. D.h., wenn ypos 50 ist, dann bist du vom Anfang des Dokumentes 50 Pixel entfernt. Dann musst du bei allen Grafikbefehlen, die von ypos abhängig sind (also, die, die beim Scrollen verschoben werden sollen), den yWert um ypos verringern. zB.: Ich habe einen Text der auf x=0, y=50 liegt. Wenn ypos gleich 10 ist, du also schon 10 Pixel nach unten gescrollt bist, liegt der Text jetzt auf y=40 (denn 50-10=40) Code: [AUSKLAPPEN] Graphics 640,480,16,2
SetBuffer BackBuffer() Repeat Cls If KeyDown(200) Then ypos = ypos - 1 If KeyDown(208) Then ypos = ypos + 1 ;Hier steht der Text Text 0, 0-ypos, "Hallo" Text 0, 20-ypos, "mit Pfeiltaste oben oder Pfeiltaste unten," text 0, 40-ypos, "kannst du diesen Text scrollen lassen." Flip Until KeyDown(1) |
||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab mal wieder zuviel Zeit gehabt...
Ihr müsst nur euer eigenes Bild einsetzen. Und wenn es eben ein Text sein soll, so müsst ihr den Text halt vorher in einen Imagebuffer schreiben ![]() Code: [AUSKLAPPEN] ;Scrollbox von Thomas Decker - Februar 2007
Graphics 640, 480, 0, 3 SetBuffer BackBuffer() pic = LoadImage("tileset.png") xbar = 0 ybar = 0 Repeat If KeyDown(200) Then ybar = ybar - 1 If KeyDown(208) Then ybar = ybar + 1 If KeyDown(203) Then xbar = xbar - 1 If KeyDown(205) Then xbar = xbar + 1 Cls scrollBox pic, 5, 30, 200, 100, xbar, ybar Flip() Until KeyDown(1) End ;Zeigt den Ausschnitt eines Bildes an ;p - Bild ;x, y, w, h - Position und Ausmaße des Ausschnitts ;xbar, ybar - Position der Scrollleisten Function scrollBox(p, x, y, w, h, xbar, ybar) iw = ImageWidth(p) ih = ImageHeight(p) If xbar < 0 Then xbar = 0 Else If xbar > iw - w Then xbar = iw - w If ybar < 0 Then ybar = 0 Else If ybar > ih - h Then ybar = ih - h If w > iw Then xbar = 0 If h > ih Then ybar = 0 sbs = 5 ;Dicke der Scrollleisten sbx = Float(w) / ImageWidth(p) * w: sbxp = Float(xbar) / ImageWidth(p) * w sby = Float(h) / ImageHeight(p) * h: sbyp = Float(ybar) / ImageHeight(p) * h DrawImageRect p, x, y, xbar, ybar, w, h Color 255, 255, 255: Rect x, y, w, h, 0 If ImageWidth(p) > w Then Rect x, y + h - 1, w, sbs, 0: Rect x + sbxp, y + h - 1, sbx, sbs, 1 If ImageHeight(p) > h Then Rect x + w - 1, y, sbs, h, 0: Rect x + w - 1, y + sbyp, sbs, sby, 1 End Function |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
tommyglocke |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey Danke dies mal geht es ! | ||
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
@SpionAtom
lol Ich stelle mir gerade vor, wie ressourcenfreundlich dein Programm bei einem 20-seitigem Textdokument ist. "Schreib doch alles in ein 800*50000 Pixel großes Bild." ![]() |
||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Christoph An ein 20seitiges Textdokument habe ich gar nicht gedacht. Ich glaube zwar kaum, dass jemand vorhat, ein so großes Dokument in einem kleinen Fenster anzeigen zu lassen, aber wenn hier der Wille besteht, dann schreibe ich die Function extra nochmal für Text-only um. ![]() Das mit den Bildern ist aber imo die schnellste Lösung, die es gibt - auch wenn es etwas am Grafikspeicher zerrt. |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Also: ich habe einen Text und möchte das er, wenn ich die Tasten
Up oder Down drücke, nach unten bzw. nach oben scrollt. Nun ja, ich finde deinen Lösungsvorschlag ziemlich umständlich, da es sich hier eben um text-only handelt. Warum dann den Speicher zumüllen, mit Bildern??? |
||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das mit den Bildern ist halt eine universelle Lösung, um alles zu scrollen.
Hier die Text-variante. Das dumme ist nur, dass der Text zweimal eingelesen wird, da ich ihn nicht zwischenspeichern wollte (es könnte ja der Speicher zugemüllt werden ![]() Code: [AUSKLAPPEN] ;Scrollbox von Thomas Decker - Februar 2007
Graphics 640, 480, 0, 3 SetBuffer BackBuffer() txt$ = "text.txt" xbar = 0 ybar = 0 Repeat If KeyDown(200) Then ybar = ybar - 1 If KeyDown(208) Then ybar = ybar + 1 If KeyDown(203) Then xbar = xbar - 1 If KeyDown(205) Then xbar = xbar + 1 Cls scrollTextBox txt$, 5, 30, 200, 100, xbar, ybar Flip() Until KeyDown(1) End ;Zeigt den Ausschnitt eines Bildes an ;txt - Textdatei ;x, y, w, h - Position und Ausmaße des Ausschnitts ;xbar, ybar - Position der Scrollleisten Function scrollTextBox(txt$, x, y, w, h, xbar, ybar) f = ReadFile(txt$) mzeilen = 0 iw = 0 While Not Eof(f) mzeilen = mzeilen + 1 zeile$ = ReadLine(f) If StringWidth(zeile$) > iw Then iw = StringWidth(zeile$) Wend CloseFile f sh = StringHeight("#") ih = mzeilen * sh If xbar < 0 Then xbar = 0 Else If xbar > iw - w Then xbar = iw - w If ybar < 0 Then ybar = 0 Else If ybar > ih - h Then ybar = ih - h If w > iw Then xbar = 0 If h > ih Then ybar = 0 sbs = 5 ;Dicke der Scrollleisten sbx = Float(w) / iw * w: sbxp = Float(xbar) / iw * w sby = Float(h) / ih * h: sbyp = Float(ybar) / ih * h Viewport x, y, w, h f = ReadFile(txt$) z = 0 While Not Eof(f) zeile$ = ReadLine(f) If y + z - ybar >= y - sh And y + z - ybar <= y + h Then Text x - xbar, y + z - ybar, zeile$ z = z + sh Wend CloseFile(f) Viewport 0, 0, GraphicsWidth(), GraphicsHeight() Color 255, 255, 255: Rect x, y, w, h, 0 If iw > w Then Rect x, y + h - 1, w, sbs, 0: Rect x + sbxp, y + h - 1, sbx, sbs, 1 If ih > h Then Rect x + w - 1, y, sbs, h, 0: Rect x + w - 1, y + sbyp, sbs, sby, 1 End Function |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
Sabber |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo bin neu hier und hab auch dierekt mal eine Frage..
Bin im Momen just for fun nen Kleines Spiel am programmieren Und hab folgendes Problem Also in meinem Menu habe ich die Einträge In einem einzige Image. Das einzige was sich bei mir bewegt ist ein Pfeil an der Seite. Nun grübel ich schon die ganze zeit wie zum Teufel ich dem Sagen soll welche y position nun meine Auswahl ist.. Als erstes dachte ich an eine array da habe ich nur das Problem das ich den namen nich als zahl definieren kann ist ja auch verständlich. Wenn man allso Up drück soll er immer eins nach oben springen ist er beim obersten angelangt dann geht es wieder runter zum letzten.... Nur irgendwo finde ich keinen Ansatzt wie zumteufel ich dem das sagen soll... ^^. Ich möchte auch keine vorgekaute Lösung (dabei lerne ich nix) vieleicht kann mir eine einen Tip geben. ![]() Sabber |
||
![]() |
the FR3AK |
![]() Antworten mit Zitat ![]() |
---|---|---|
lol...warum schreibst du in den veralteten Thread rein?Mach doch nen neuen ![]() |
||
Sabber |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Weil ich in mehreren Foren unterwegs bin, und weiß das unötiges geposte nervt.. Und es hat ja wasmit dem Thema zutun also ![]() Sabber |
||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zum Bleistift löst du das so:
Pseudocode: Code: [AUSKLAPPEN] Select auswahl
case 1 mal Pfeil an Position 50, 100 case 2 mal Pfeil an Position 50, 200 case 3 mal Pfeil an Position 50, 300 End Select Tasten fragst du am besten mit den Befehlen Keydown oder KeyHit ab. |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group