[Problem] Eigene Buttons

Anfängerfragen zum Programmieren mit PureBasic.
NathanielBlack
Beiträge: 63
Registriert: 25.12.2009 18:48

[Problem] Eigene Buttons

Beitrag von NathanielBlack »

Guten Morgen!

Nachdem ich jetzt ja weiß, wie ich die Maustasten-Abfrage mache habe ich mir mal eigene Buttons für den Windowed-Screen geschrieben.
Das wahr auch nicht weiter schwer am Anfang, doch als ich auf einem Desktop mit 1280x1024px Auflösung getestet habe ging etwas schief, was ich mir nicht erklären kann.

Die roten Hover-Effekte des Buttons wollen nicht mehr verschwinden. Irgendwie scheint da was nicht zu klappen.
Hier mein Code:

Code: Alles auswählen

InitSprite()
OpenWindow(0,0,0,800,600,"Maus-Abfrage",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0,#PB_Screen_SmartSynchronization)

Global font = LoadFont(#PB_Any,"helvetica",12)
Global mx,my

Procedure Button(x,y,w,h,txt$)
   DrawingMode(#PB_2DDrawing_Outlined)
   Box(x,y,w,h,$000)
   Box(x+2,y+2,w-4,h-4,$000)
   DrawingMode(#PB_2DDrawing_Transparent)
   DrawText(x+4,y+4,txt$,$000)
   If mx >= x And mx <= x+w And my >= y And my <= y+h
      DrawingMode(#PB_2DDrawing_Outlined)
      Box(x+1,y+1,w-2,h-2,$FFF)
      Select WindowEvent()
         Case #WM_LBUTTONUP
            ProcedureReturn 1
      EndSelect
   EndIf
   
EndProcedure


Repeat 
   FlipBuffers()
   ClearScreen($FFFFFF)
   mx = WindowMouseX(0)
   my = WindowMouseY(0)
   StartDrawing(ScreenOutput())
   DrawingFont(FontID(font))   
   Select Button(0,0,100,25,"Ende")
      Case 1
         End
   EndSelect
   
   StopDrawing()
   

   
Until WindowEvent() = #PB_Event_CloseWindow
End
Habt ihr eine Ahnung was da los ist? Ich weiß nicht genau, ob es an der Auflösung liegt, doch an meinem Laptop mit 1280x800px Auflösung klappt alles Problem los.

Danke im Vorraus,
NathanielBlack
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Re: [Problem] Eigene Buttons

Beitrag von #NULL »

du fragst die events in dem If-block ab, der die koordinaten prüft. du musst es aber unabhängig davon machen, den wenn 'If mx > x ...' zu false wird, wird WindowEvent() nicht mehr aufgerufen.
my pb stuff..
Bild..jedenfalls war das mal so.
NathanielBlack
Beiträge: 63
Registriert: 25.12.2009 18:48

Re: [Problem] Eigene Buttons

Beitrag von NathanielBlack »

Danke, aber irgendwie krieg ich´s nicht hin:(

Kannst du mir oder jemand anders zeigen, wie man´s richtig macht.


Ist der WindowedScreen überhaupt für Spiele gut geeignet?


Danke im Vorraus,
NathanielBlack
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Re: [Problem] Eigene Buttons

Beitrag von #NULL »

Code: Alles auswählen

InitSprite()
OpenWindow(0,0,0,800,600,"Maus-Abfrage",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0,#PB_Screen_SmartSynchronization)

Global font = LoadFont(#PB_Any,"helvetica",12)
Global event
Global mx,my

Procedure Button(x,y,w,h,txt$)
   DrawingMode(#PB_2DDrawing_Outlined)
   Box(x,y,w,h,$000)
   Box(x+2,y+2,w-4,h-4,$000)
   DrawingMode(#PB_2DDrawing_Transparent)
   DrawText(x+4,y+4,txt$,$000)
   If mx >= x And mx <= x+w And my >= y And my <= y+h
      DrawingMode(#PB_2DDrawing_Outlined)
      Box(x+1,y+1,w-2,h-2,$FFF)
      Select event
         Case #WM_LBUTTONUP
            ProcedureReturn 1
      EndSelect
   EndIf
EndProcedure


Repeat
   FlipBuffers()
   ClearScreen($FFFFFF)
   event = WindowEvent()
   mx = WindowMouseX(0)
   my = WindowMouseY(0)
   StartDrawing(ScreenOutput())
     DrawingFont(FontID(font))   
     Select Button(10,10,100,25,"Ende")
        Case 1
           End
     EndSelect
   StopDrawing()
Until event = #PB_Event_CloseWindow
End
behandle die events genau wie mx/my, also benutze eine globale variable dafür, aktualisiere diese nur einmal in der hauptschleife und prüfe dann immer nur diesen zwischengespeicherten wert. momentan hattest du WindowEvent() an zwei stellen aufgerufen (im besagten If-block und beim Until deiner hauptschleife), und die haben sich dann gegenseitig die relevanten events geklaut.

fullscreen und windowedscreen sind beidermaßen für spiele kein problem, nur bei letzterem mußt du eben noch auf die events achten, was genausowenig ein problem ist.

für einen anfang ist deine alles-in-einem funktion Button() gar nicht schlecht. wenn dein programm komplexer wird, bietet es sich aber an deine Button-information in einer struktur-variablen zu speichern, damit du das erstellen des buttons, das prüfen des zustands und das anzeigen des buttons von einander in separate code-teile trennen kannst.
my pb stuff..
Bild..jedenfalls war das mal so.
NathanielBlack
Beiträge: 63
Registriert: 25.12.2009 18:48

Re: [Problem] Eigene Buttons

Beitrag von NathanielBlack »

Okay, danke! Jetzt habe ich das schonmal verstanden, doch das blöde Problem, dass die Hover-Effekte nicht weg gehen lebt komischerweise weiter:(

Wenn ich über den Button mit der Maus fahre, kommt die rote Box wie geplant, doch sie geht nicht mehr weg:(

Bitte um Hilfe!

Vielen Dank im Vorraus,
NathanielBlack
Benutzeravatar
Schlumpf
Beiträge: 19
Registriert: 21.03.2010 00:52
Wohnort: Der Puff von Schlumpfhausen

Re: [Problem] Eigene Buttons

Beitrag von Schlumpf »

Vor längerer Zeit hatte Kaeru Gaman mal einen Beispielcode gepostet.
http://www.purebasic.fr/german/viewtopic.php?t=11280
Vielleicht hilft der Dir weiter.
PB 4.41 - Win XP pro
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Re: [Problem] Eigene Buttons

Beitrag von #NULL »

ich kann das leider nicht reproduzieren, auch nicht bei 1280x1024 auflösung. benutze mal den 'Debug' befehl um herauszufinden was nicht stimmt. mach ein Debug in den If-block, und vieleicht auch noch ein Else-zweig mit debug damit du weißt wie dein programmfluß aussieht, debugge auch 'event' und 'mx' sowie 'my' in der hauptschleife um das problem einzukreisen, notfalls mit einem delay() in der hauptschleife, damit die debug-ausgaben überschaubar bleiben..
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: [Problem] Eigene Buttons

Beitrag von Falko »

Soweit ich weiß, hatte Einander aus dem englischen Forum einen hübschen Code
geschrieben mit den er eigene Buttons in verschiedenen Farben und Formen dargestellt hatte.

Nur ist dieser Source sehr alt, der auf ältere PB-Versionen lief und nun nicht
mehr in der aktuellen PB 4.51RC2 funktioniert.

Ich habe versucht die BTN-List dazu anzupassen was aber leider nicht geklappt hatte. Globalisieren der Structur etc. dazu hatte nicht geholfen.
Auch müssen einige PB-Funktionen wie WindowsMaus und WindowsPositions-Befehle mit der aktuellen WindowsID() als zusätzlichen Parameter ergänzt werden. Ich hoffe das hier jemand sich den Code mal anschaut und damit bessere Erfolge erzielt das Beispiel hier
zu veröffentlichen. :wink:

Hier der Link zu den damals schönen, selbstgemachten Buttons:
http://www.purebasic.fr/english/viewtop ... 022#p63022
http://www.purebasic.fr/english/viewtop ... 266#p65266

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten