ScrollAreaGadget IM Screen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

ScrollAreaGadget IM Screen

Beitrag 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.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Re: ScrollAreaGadget IM Screen

Beitrag 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)
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: ScrollAreaGadget IM Screen

Beitrag 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 :allright:
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ScrollAreaGadget IM Screen

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: ScrollAreaGadget IM Screen

Beitrag 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()?
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: ScrollAreaGadget IM Screen

Beitrag 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.
Zuletzt geändert von Bisonte am 07.11.2010 22:13, insgesamt 1-mal geändert.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: ScrollAreaGadget IM Screen

Beitrag 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.
Zuletzt geändert von PureLust am 07.11.2010 22:34, insgesamt 2-mal geändert.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: ScrollAreaGadget IM Screen

Beitrag 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.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: ScrollAreaGadget IM Screen

Beitrag 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.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: ScrollAreaGadget IM Screen

Beitrag 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...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten