Seite 1 von 2
ScrollAreaGadget IM Screen
Verfasst: 07.11.2010 20:34
von Bisonte
Hallo.
Nun hab ich da mal ein kleines Problem und die Suche hat mir nicht wirklich geholfen.
Ich möchte gerne ein ScrollAreaGadget IN einem (per OpenWindowedScreen()) Screen machen.
Um z.B. einen Textblock (auf einem Sprite gezeichnet) in einem bestimmten Bereich des Screens
anzeigen zu können. (Mit Scrollbalken)
Ich steh da absolut auf dem Schlauch, hab noch nicht einmal eine Ahnung wie ich an das ganze herangehen soll...
Bitte um Hilfe.
Re: ScrollAreaGadget IM Screen
Verfasst: 07.11.2010 20:52
von #NULL
ich habe hier nen kleinen demo-code in meinem archiv, der zumindest schonmal das clipping zeigt. einen simplen scrollbar zu programmieren, der dann die koordinaten steuert ist auch nicht sehr kompliziert
Code: Alles auswählen
InitSprite()
InitMouse()
InitKeyboard()
ww=1024
wh=768
;OpenWindowedScreen(OpenWindow(0,0,0,ww,wh,"..", #PB_Window_BorderLess|#PB_Window_ScreenCentered), 0,0,ww,wh,0,0,0)
OpenScreen(1024,768,32,"fllscrn")
sprw=300
sprh=300
spr=CreateSprite(#PB_Any, sprw,sprh)
StartDrawing(SpriteOutput(spr)) :: DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent)
For i=0 To 200
Circle(Random(sprw),Random(sprh),Random(32),Random($ffffff))
Next
Box(0,0,8,8,$0000ff)
StopDrawing()
rx1 = 300
ry1 = 250
rx2 = rx1+450
ry2 = ry1+150
Repeat
ems=ElapsedMilliseconds()
If timer < ems
timer=ems+300
fps$=Str(fps)
EndIf
ExamineMouse()
mx=MouseX()
my=MouseY()
; get left clipping border
If mx<rx1
x=rx1-mx
Else
x=0
EndIf
; get top clipping border
If my<ry1
y=ry1-my
Else
y=0
EndIf
; get right clipping border
If mx<rx2
If mx>rx1
w=rx2-mx
Else
w=rx2-rx1
EndIf
Else
w=0
EndIf
; get left clipping border
If my<ry2
If my>ry1
h=ry2-my
Else
h=ry2-ry1
EndIf
Else
h=0
EndIf
ClipSprite(spr,x,y,w,h)
ExamineKeyboard()
StartDrawing( ScreenOutput() )
DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent)
Circle(mx,my,10,$00aa00)
Box(mx,my,sprw,sprh)
Box(rx1,ry1,rx2-rx1,ry2-ry1)
StopDrawing()
DisplayTransparentSprite(spr, mx+x, my+y)
FlipBuffers()
ClearScreen($333333)
;Delay(10)
Until KeyboardPushed(#PB_Key_Escape) Or (IsWindow(0) And WindowEvent()=#PB_Event_CloseWindow)
Re: ScrollAreaGadget IM Screen
Verfasst: 07.11.2010 21:11
von Bisonte
Danke schonmal... aber genau dieser bucklige Scrollbalken macht mir die meisten Kopfschmerzen
Die Berechnungen der Koordinaten des Clipbereiches, Scrollbalkenposition
und die "Mausbedienung".
Aber diese kleine Demo ist sehr nett anzuschauen

Re: ScrollAreaGadget IM Screen
Verfasst: 07.11.2010 21:50
von STARGÅTE
Du brauchst doch nur mit relativen Werten Spielen:
Anzeigebereich / Gesamtbereich = Balkenhöhe / Gesamtscrollhöhe
Anzeigeposition / Gesamtbereich = Balkenposition / Gesamtscrollhöhe
Dann noch n paar Mausfunktionen wie: Erster Anschalg, und loslassen um das ziehen zu ermöglichen ...
Re: ScrollAreaGadget IM Screen
Verfasst: 07.11.2010 21:57
von PureLust
Bisonte hat geschrieben:Ich möchte gerne ein ScrollAreaGadget IN einem (per OpenWindowedScreen()) Screen machen.
Um z.B. einen Textblock (auf einem Sprite gezeichnet) in einem bestimmten Bereich des Screens
anzeigen zu können. (Mit Scrollbalken)
Hmmm .... hab' ich da was in Deiner Anfrage überlesen, oder was spricht gegen ein ScrollAreaGadget3D()?
Re: ScrollAreaGadget IM Screen
Verfasst: 07.11.2010 22:09
von Bisonte
PureLust hat geschrieben:Bisonte hat geschrieben:Ich möchte gerne ein ScrollAreaGadget IN einem (per OpenWindowedScreen()) Screen machen.
Um z.B. einen Textblock (auf einem Sprite gezeichnet) in einem bestimmten Bereich des Screens
anzeigen zu können. (Mit Scrollbalken)
Hmmm .... hab' ich da was in Deiner Anfrage überlesen, oder warum benutzt Du nicht einfach ein ScrollAreaGadget3D()?
Das würde ja die ganze 3D Maschinerie nach sich ziehen, oder nicht ?... und von dem ganzen 3D Krams mit Enti... oder wie das alles heisst hab ich nun überhaupt keinen blassen Schimmer.
Edit: Und soviel ich weiss bin ich dann an das CEGUI gebunden,
wobei ich weniger grafische Gestaltungsmöglichkeiten habe, wenn ich das richtig gelesen habe.
Re: ScrollAreaGadget IM Screen
Verfasst: 07.11.2010 22:12
von PureLust
Bisonte hat geschrieben:Das würde ja die ganze 3D Maschinerie nach sich ziehen, oder nicht ?... und von dem ganzen 3D Krams mit Enti... oder wie das alles heisst hab ich nun überhaupt keinen blassen Schimmer.
Hab da auch noch nie was mit gemacht, aber hier mal das lauffähige Beispiel aus der PB-Hilfe.
(Müsstest dann halt einfach mal ein ScrollAreaGadget3D() einfügen.)
Code: Alles auswählen
#CameraSpeed = 10
#MainWindow = 0
#CloseButton = 0
Define.f KeyX, KeyY, MouseX, MouseY
If InitEngine3D()
Add3DArchive("Data/", #PB_3DArchive_FileSystem)
Add3DArchive("GUI/", #PB_3DArchive_FileSystem)
Add3DArchive("Data/skybox.zip", #PB_3DArchive_Zip)
InitSprite()
InitKeyboard()
InitMouse()
If OpenWindow(0,0,0,800,600,"3D GUI-Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If OpenWindowedScreen(WindowID(0),0,0,800, 600, 0,0,0)
SkyBox("desert07.jpg")
CreateCamera(0, 0, 0, 100, 100) ; Front camera
CameraLocate(0,0,100,100)
OpenWindow3D(#MainWindow, 100, 100, 300, 300, "Hello in 3D !")
ButtonGadget3D(#CloseButton, 10, 260, 120, 25, "Close")
ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor
Repeat
Event = WindowEvent()
If ExamineKeyboard()
Input$ = KeyboardInkey()
EndIf
If ExamineMouse()
MouseX = -(MouseDeltaX()/10)*#CameraSpeed
MouseY = -(MouseDeltaY()/10)*#CameraSpeed
InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left), Input$)
EndIf
; Handle the GUI 3D events, it's similar to regular GUI events
;
Repeat
Event = WindowEvent3D()
Select Event
Case #PB_Event3D_Gadget
If EventGadget3D() = #CloseButton
CloseWindow3D(#MainWindow)
EndIf
EndSelect
Until Event = 0
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
EndIf
Else
MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
EndIf
Gruß, PL.
[EDIt:] Hab den Code mal ein wenig von unnötigem Ballast bereinigt.
Re: ScrollAreaGadget IM Screen
Verfasst: 07.11.2010 22:20
von Bisonte
Ich sach ja... irgendwas ist bei mir nicht zu sowas fähig
Bei dem Code bekomme ich einen "Assertion failed!" Error...
Expression: !ms_Singleton
Was dass heisst ? Keine Ahnung. Aber diese 3D Windowgeschichten hab ich noch nie wirklich zum laufen bekommen.
Re: ScrollAreaGadget IM Screen
Verfasst: 07.11.2010 22:30
von PureLust
Bisonte hat geschrieben:Ich sach ja... irgendwas ist bei mir nicht zu sowas fähig
Bei dem Code bekomme ich einen "Assertion failed!" Error...
Expression: !ms_Singleton
Was dass heisst ? Keine Ahnung. Aber diese 3D Windowgeschichten hab ich noch nie wirklich zum laufen bekommen.
Hatte ich eben auch bei meinem ersten Test.
DIESER THREAD hat mir weiter geholfen.
(Im Grunde hab ich nur in den "PB-Einstellungen => Compiler => Standards" das "Aktuelle Verzeichnis" auf das PB-Verzeichnis ("D:\Programme\PureBasic_x64\Examples\Sources\") gesetzt und dann PB nochmal neu gestartet.
Danach hatte es dann auf Anhieb geklappt.)
Hinweis: Habe das vorherige Beispiel inzwischen noch ein wenig reduziert.
Re: ScrollAreaGadget IM Screen
Verfasst: 07.11.2010 23:10
von Bisonte
Jo so funktioniert das beispiel... Aber wie bereits erwähnt, ist das 3D Zeugs nicht wirklich was für mich...
Ist ja nochmehr Mathematik drin
Das muss ja vor dem Windows3D Zeug auch funktioniert haben. Ich probier es mit Stargates "Formeln" grade,
obwohl ich noch nich so ganz rausgefunden hab wie er das meint...