Fenster verschieben

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

N0X

Betreff: Fenster verschieben

BeitragMo, Feb 01, 2010 12:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Ich habe eigene Fenster erstellt (mit Rect's).
Diese möchte ich verschieben, aber so, dass das Fenster dort "angepackt" wird wo die Maus gerade gedrückt hat.

Vielleicht versteht das jemand mit dem Code besser:
Code: [AUSKLAPPEN]
Global x_pos%,y_pos%
Global x_size%,y_size%

While Not KeyHit(1)
   If MouseDown(1) Then
      mx = MouseX()
      my = MouseY()
      If ImageRectCollide(cursor,mx,my,0,x_pos%,y_pos%,x_size%,y_size%) Then
         x_pos% = mx
         y_pos% = my
      EndIf
   EndIf
Wend
End


So ist es nämlich nicht so gut (finde ich), weil die Fenster-Startkoordinaten immer zu den Mauskoordinaten gesetzt werden.

Wie kann ich das besser lösen?

Mfg,
N0X Smile
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

D2006

Administrator

BeitragMo, Feb 01, 2010 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst im Moment des Maus-Klicks (MouseHit) ermitteln und merken, wo auf dem Fenster die Maus ist (also Mauskoordinaten minus Fensterkoordinaten). Dieses "Offset" subtrahierst du dann beim neusetzen der Fensterkoordinaten, solange die Maus gedrückt bleibt.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
  • Zuletzt bearbeitet von D2006 am Mo, Feb 01, 2010 12:17, insgesamt einmal bearbeitet

Midimaster

BeitragMo, Feb 01, 2010 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst dir einfach im Moment des ersten Klicks den Abstand der Mauskoordinaten vom Image-Ursprung in AbstandX% merken und dann das Bild immer auf MouseX()-AbstandX, etc.. zeichnen

N0X

BeitragMo, Feb 01, 2010 12:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, so?

Code: [AUSKLAPPEN]
Global x_pos%,y_pos%
Global x_size%,y_size%

While Not KeyHit(1)
   If MouseDown(1) Then
      mx = MouseX()-x_pos%
      my = MouseY()-y_pos%
      If ImageRectCollide(cursor,mx,my,0,x_pos%,y_pos%,x_size%,y_size%) Then
         x_pos% = mx
         y_pos% = my
      EndIf
   EndIf
Wend
End


Geht nicht.
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Midimaster

BeitragMo, Feb 01, 2010 12:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier ein Beispiel:


BlitzBasic: [AUSKLAPPEN]
Graphics 800,600
Color 255,0,0
Rect 100,100,100,100
Global Rx,Ry
Repeat
Cls
If MouseDown(1) Then
If MouseHit(1) Then
MX=MouseX()-Rx
My=MouseY()-Ry
Else
Rx= MouseX()-Mx
Ry=MouseY()-My
EndIf
EndIf
Rect Rx,Ry,100,100

Flip 1
Until KeyHit(1)

N0X

BeitragMo, Feb 01, 2010 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe das in einer Funktion, dürfte doch aber keine Probleme machen, oder?

Tut's aber.

Code: [AUSKLAPPEN]
Function createMap()
   If MouseDown(1) Then
      If MouseHit(1) Then
         mx = MouseX()-rx
         my = MouseY()-ry
      Else
         rx = MouseX()-mx
         ry = MouseY()-my
      EndIf
   EndIf
   
   Color 0,255,0
   Rect rx%,ry%,x_size2%,y_size2%
   Color 255,255,255
End Function
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Midimaster

BeitragMo, Feb 01, 2010 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
naja, du willst es ja nicht mit dem RECT machen, sondern mit Deinem Image, oder? Das ImageCollide muss natürlich auch wieder rein.

Und wahrscheinlich wird das Malen des Fenster-Bildes ja nicht innerhalb der Funktion sein. Daher müssen die Variablen Mx% und My% GLOBAL definiert sein.

N0X

BeitragMo, Feb 01, 2010 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, jetzt wo ich mx und my global deklariert habe, läufts! Razz
Aber ab und zu "springt" mir das Fenster weg Shocked warum das?
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Midimaster

BeitragMo, Feb 01, 2010 13:05
Antworten mit Zitat
Benutzer-Profile anzeigen
code?

N0X

BeitragMo, Feb 01, 2010 13:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Global rx,ry,mx,my

While Not KeyHit(1)
   createMap()
Wend
End

Function createMap()
   If MouseDown(1) Then
      If MouseHit(1) Then
         mx = MouseX()-rx
         my = MouseY()-ry
      Else
         rx = MouseX()-mx
         ry = MouseY()-my
      EndIf
   EndIf
   
   Color 0,255,0
   Rect rx,ry,x_size2%,y_size2%
   Color 255,255,255
End Function
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

SpionAtom

BeitragMo, Feb 01, 2010 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
https://www.blitzforum.de/foru...972#119972 Cool
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Midimaster

BeitragMo, Feb 01, 2010 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
@nox:

das kann ja nicht der ganze code sein... da ist keine Hauptschleife dabei...

bei mir springt nix weg. wie meinst du das genau: springt weg und bleibt auch weg oder "flackert" nur kurz, um dann doch wieder bei der Maus zu sein? Wann springt es weg? Mitten im Ziehen oder in einer Stillstandphase?

"springt weg" würde ja heißem, RX und RY erhalten plötzlich irgendwoher ganz andere Werte..

außerdem hießen die Koordinaten in deinem ersten Beispiel doch eigentlich x_pos% und y_pos%, oder? Hast du da vielleicht versehentlich was aus meinem Beispiel mit deinem Code vermischt?

N0X

BeitragMo, Feb 01, 2010 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Nene, das mit x_pos2% und y_pos2% hat schon seine Richtigkeit so.
Ich habe jetzt einfach mal den Beispielcode von SpionAtom genommen.
Klappt.
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group