Fenster bewegen *erledigt*

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Michael

Betreff: Fenster bewegen *erledigt*

BeitragDi, Apr 19, 2005 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich baue derzeit eine kleine GUI im Stil eines Pseudo Betriebssystems. Wie kann ich es hinbekommen das wenn ich ein Fenster (Das als Bild vorher geladen wurde) anklicke, bewegen kann mit der Maus?

Ein bisschen Code habe ich schon aber komme nicht weiter.

Code: [AUSKLAPPEN]
If ImagesOverlap(Mauszeiger,MouseX(),MouseY(),Fenster,100,100)= 1 And MouseDown(1)= 1 Then
DrawImage Fenster ,MouseX(),MouseY()


Hier nochmal zum verdeutlichen ein Bild:

http://www.bluescreen-security.com/fenster.gif
  • Zuletzt bearbeitet von Michael am Mi, Apr 20, 2005 13:48, insgesamt einmal bearbeitet

skey-z

BeitragMi, Apr 20, 2005 0:04
Antworten mit Zitat
Benutzer-Profile anzeigen
die koordinaten des Fensters müssen in ner variablen gespeichert werden

zb
BlitzBasic: [AUSKLAPPEN]

If ImagesOverlap(Mauszeiger,MouseX(),MouseY(),Fenster,100,100)= 1 And MouseDown(1)= 1 Then
winx=MouseX()
winy=MouseY()
EndIf

DrawImage Fenster, winx, winy


wenn mein tipp so klappt, bin ich selbst von mir überrascht, es soll aber auch nur ein kleiner denkanstoss sein.

für ein schnellere abfrage, solltest du vlt

BlitzBasic: [AUSKLAPPEN]

If RectsOverlap(MouseX(),MouseY(),1,1,,winx,winy,200,20)= 1 And MouseDown(1)= 1 Then
 

Michael

BeitragMi, Apr 20, 2005 0:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm irgendwie klappt garnix mehr. Ich poste mal dne ganzen code. Wäre toll wenn mir das mal einer logisch einbauen könnte das ich das besser verstehe.

BlitzBasic: [AUSKLAPPEN]
Graphics 800, 600, 32, 1
SetBuffer BackBuffer()

Mauszeiger=LoadImage(\"pointer.bmp\")
MaskImage Mauszeiger,255,255,255

Hintergrund=LoadImage(\"haxor.bmp\")

Fenster=LoadImage(\"window.bmp\")

Toolbar=LoadImage(\"toolbar.bmp\")
MaskImage Fenster,255,0,255

DrawImage Fenster, 100, 100



Repeat
Cls
DrawBlock Hintergrund,0,0

DrawImage Fenster, 100, 100
DrawImage Mauszeiger, MouseX(), MouseY()
DrawImage Toolbar,0,0
Flip


Until KeyHit(1)

End
[/code]

simi

BeitragMi, Apr 20, 2005 10:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, so GUI mässig sieht das noch nicht aus, aber es kann ja noch werden.... Wink

Also, du brauchst eine Varaibel für die X und eine für die Y-Position des Fensters.... Wenn du jetzt mit der Maus auf den Fensterrahmen klickst, dann veränderst du die Position des Fensters entsprechend......:
BlitzBasic: [AUSKLAPPEN]

Global FensterX=100,FensterY=100

Repeat
Cls
DrawBlock Hintergrund,0,0

If RectsOverlap(MouseX(),MouseY(),1,1,Fenster,FensterY,200,20)= 1 And MouseDown(1)= 1 Then
FensterY=FensterY+MouseYSpeed()
FensterX=FensterX+MouseXSpeed()
End If

DrawImage Fenster,FensterX, FensterY
DrawImage Mauszeiger, MouseX(), MouseY()
DrawImage Toolbar,0,0
Flip


Until KeyHit(1)


Warum brauche ich MouseSpeed und nicht einfach Mousex()?? - Weil man das Fenster an jeder stelle anklicken und verschieben kann, bei MouseX würde sonst das Fenster im an die Position der Maus springen, und das wäre nicht so konfortabel.....
 

Michael

BeitragMi, Apr 20, 2005 11:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Also erstmal vielen Dank. Ich habe das gerade eingebaut aber ich kann trotzdem nichts bewegen oder anklicken. genauso wie vorher.
 

Michael

BeitragMi, Apr 20, 2005 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
OK ich habs jetz geschafft das ich etwas bewegt nach deiner Methode. Nur springt dann das Fenster immer 100 pixel weit davon Smile und das Fenster sringt immer mit der obersten linken Kante auf den Mauszeiger

SpionAtom

BeitragMi, Apr 20, 2005 13:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab zwar vorher mich noch nie mit Drag&Drop beschäftigt, bastelte mir aber nun mal sowas:

Code: [AUSKLAPPEN]

Graphics 800, 600, 16, 2
SetBuffer BackBuffer()



   DragStart = False

   Repeat
         
      If MouseDown(1)  And mouseInRect( wx, wy, wx + 200, wy + 200) And (Not DragStart) Then
         DragStart = True
         mxold = MouseX()
         myold = MouseY()
         wxold = wx
         wyold =wy
      End If
      
      If DragStart Then
         wx =  wxold - (mxold - MouseX())
         wy =  wyold - (myold - MouseY())
         If Not MouseDown(1) Then DragStart = False
      End If
      
      Cls            
      Text 0, 0, MouseX()
      Text 0, 10, MouseY()
      Text 0, 20, wx
      Text 0, 30, wy

      
      DrawWindow(wx, wy)
      Flip()
   
   
   
   Until KeyDown(1)


Function DrawWindow(x, y, w = 200, h = 200)

   Rect x, y, w, h, 0
   Rect x + 5, y + 5, w - 10, h - 10, 0
   
   Return mouseInRect (x, y, x + w, y + w)   
End Function


Function mouseInRect (x1, y1, x2, y2)
   mx = MouseX()
   my = MouseY()
   
   If mx < x1 Then Return False
   If mx > x2 Then Return False
   If my < y1 Then Return False
   If my > y2 Then Return False
   Return True
End Function
   


Wie euch vielleicht auffällt, ist das noch sehr verbesserungs- und ausbaufähig. Neben der einen Tatsache, dass man jetzt nur immer ein Fenster verschieben kann, gibt es noch die andere, dass man bei zwei sich üpperlappenden Fenstern schon seine Probleme bekommt. Da muss man sich noch was entsprechendes ausdenken. Confused
 

Michael

BeitragMi, Apr 20, 2005 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank. Der Code ist super. Darauus kann ich einiges lernen. Danke für eure Bemühungen. Der Thread kann geschlossen werden

SpionAtom

BeitragMi, Apr 20, 2005 16:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Bestimmt habt Ihr euch gefreagt, was ich sonst so mache:
Ich schreibe Beispielprogramme!!! 8)

Hier das Programm
Code: [AUSKLAPPEN]

;Beispiel von SpionAtom 20.4.2005

;Standardzeugs am Anfang
Const xr = 800, yr = 600
Graphics xr, yr, 16, 2
SetBuffer BackBuffer()
AppTitle("Drag&Drop (nur ohne Drop)- Beispiel von SpionAtom")
Global mouse_x, mouse_y


;Das Fenster bestehen aus...
Type fenster
   Field x      ;..X-Position
   Field y      ;..Y-Position
   Field w      ;..Breite (Width)
   Field h      ;..Höhe (Height)
   Field n      ;..und Typ (ich habe 3 Typen)
End Type

Global f.fenster

;Ich erschaffe einige neue Fenster
f.fenster = New fenster
f\x = 100
f\y = 200
f\w = 50
f\h = 20
f\n = 0

f.fenster = New fenster
f\x = 200
f\y = 200
f\w = 200
f\h = 200
f\n = 1

f.fenster = New fenster
f\x = 50
f\y = 500
f\w = 100
f\h = 80
f\n = 2

For i = 1 To 10
f.fenster = New fenster
f\x = 600 - i * 12
f\y = 100 + i * 20
f\w = i * 30
f\h = 10
f\n = 0
If i <= 5 Then
f.fenster = New fenster
f\x = 500 + i * 10
f\y = 500
f\w = 8
f\h = 80
f\n = 1
End If
Next




;******************************************************************
   dragStart = False
   Repeat
   
      ;Mauskoordinaten aktualisieren
      mouse_x = MouseX()
      mouse_y = MouseY()
      
      ;Prüfen, ob ein Dragvorgang gestartet wird
      If (MouseDown(1)) And (Not dragStart) Then
         For f = Each fenster
            If mouseInRect(f\x, f\y, f\x + f\w, f\y + f\h) Then
               af.fenster = f
               dragStart = True
               oldmx = mouse_x
               oldmy = mouse_y
               oldfx = f\x
               oldfy = f\y
            End If
         Next
      End If
      
      ;Das entsprechende Fenster Draggen und Droppen
      If dragStart Then
         af\x = oldfx - oldmx + mouse_x
         af\y = oldfy - oldmy +  mouse_y
         If Not MouseDown(1) Then dragStart = False
      End If         
            
   
      ;Alles zeichnen
      Cls
      drawAllFenster()
      Flip()
   
   Until KeyDown(1)
   End
;******************************************************************





;Diese Funktion zeichnet alle Fenster in der Reihenfolge, in der sie in der Type-Liste stehen (also in der
;Reihenfolge, in der sie erschaffen sind)
Function drawAllFenster()
   For f = Each fenster
      drawFenster f\x, f\y, f\w, f\h, f\n
   Next
End Function

;Diese Funktion malt ein Fenster. Sie benötigt Position(x,y), Ausmaße(w,h) sowie den Typ(n)
Function drawFenster(x, y, w, h, n = 0)
   Select n
      Case 1:
         Color 0, 255, 0
         Rect x, y, w, h, 1
         Color 255, 0, 0
         Rect x + 2, y + 2, w - 4, h - 4, 1
         Color 255, 255, 255
         Rect x, y, w, h, 0
         Rect x + 2, y + 2, w - 4, h - 4, 0
      Case 2
         Color 255, 255, 0
         Rect x, y, w, h, 1
         Color 0, 255, 255
         Oval x, y, w, h, 1
         Color 255, 255, 255
         Rect x, y, w, h, 0
         Oval x, y, w, h, 0
      Default:
         Color 255, 0, 255
         Rect x, y, w, h, 1
         Color 255, 255, 255
         Rect x, y, w, h, 0
   End Select
End Function

;Diese Funktion prüft, ob die Maus sich innerhalb des angegebenen Rechtecks befindet und liefert
;entsprechend true oder false zurück
Function mouseInRect (x1, y1, x2, y2)
   If mouse_x < x1 Then Return False
   If mouse_x > x2 Then Return False
   If mouse_y < y1 Then Return False
   If mouse_y > y2 Then Return False
   Return True
End Function



Und ich habe es sogar geschafft einen Roboter aus den Rechtecken zu machen . Schade, wenn ich Webspace hätte wrde ich es euch zeigen. Razz

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group