Fenster bewegen II mit nur einen Klick

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
rayman1970
Beiträge: 89
Registriert: 01.09.2004 16:10
Wohnort: Troisdorf bei Bonn
Kontaktdaten:

Fenster bewegen II mit nur einen Klick

Beitrag von rayman1970 »

Code: Alles auswählen

; ************** Fenster bewegen II / Code 2005 by RayMan1970 **************

OpenWindow(0,0,0,222,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Fenster bewegen II") And CreateGadgetList(WindowID(0)) 

Repeat 
  Event = WaitWindowEvent() 
  

;{ ----------- Linke Maustaste gedrückt Fenster bewegen -------------
maus_auf_fenster = 0 
If GetAsyncKeyState_(#VK_LBUTTON)  > 0 
     If WindowMouseX() > -1   
          If WindowMouseY() > -1 
               maus_auf_fenster = 1
          EndIf
     EndIf
EndIf ;} ------------------------------------------------------------

;{ ----------- Neue Fenster Position setzen -------------
If maus_auf_fenster = 1 
     X = WindowMouseX()-PositionX 
     Y = WindowMouseY()-PositionY 
     MoveWindow(WindowX()+X,WindowY()+Y) 
EndIf ;} ------------------------------------------------

;{ ----------- Neue Fenster Position ermitteln ---------
If maus_auf_fenster = 0 
  CLICDROIT = 1 - CLICDROIT 
     If CLICDROIT 
          PositionX = WindowMouseX() 
          PositionY = WindowMouseY() 
     EndIf 
EndIf ;} -----------------------------------------------
  
  
Until Event = #PB_EventCloseWindow 

End 
Benutzeravatar
Donald
Beiträge: 307
Registriert: 03.01.2005 02:21
Wohnort: Marl

Beitrag von Donald »

Hi rayman1970,

nette Idee, aber selbst beim Klick auf ein Gadget bewegt sich Fenster.
Warum machste das nicht mit CallBack und dann nur Move wenn unter
der Maus frei ist, also kein Gadget oder sonst etwas mit Funktion
DONALD :D www.PureBasic-Donald.de gibt es im Moment nicht mehr
PureBasic - jaPBe - PureVisonXP - TailBite
Benutzeravatar
dige
Beiträge: 1241
Registriert: 08.09.2004 08:53

Beitrag von dige »

So gehts auch einfacher und man verliert das Fenster nicht bei schnellen
Mausbewegungen:

Code: Alles auswählen

; MoveWindow, DiGe 04/2004
OpenWindow(0,0,0,200,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Ins Fenster klicken")

Repeat
  Event = WaitWindowEvent()

  maus_auf_fenster = 0
  If GetAsyncKeyState_(#VK_LBUTTON)  > 0
    SetCursor_( LoadCursor_( #Null, #IDC_SIZEALL	))
    SendMessage_( WindowID(), $112, $F012, 0)
    ReleaseCapture_()
  EndIf
 
Until Event = #PB_EventCloseWindow
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Eine Message-Konstante als Hex-Wert zu senden, viel umständlicher gehts wohl kaum, oder? Wofür werden denn die Codes hier gepostet? Dann kann man die Konstanten auch verwenden. Wer jetzt wissen will welche Message da gesendet wird, darf sogesehen alle Messages debuggen und die Werte vergleichen... Keinesfalls Vorbildliche Methode. :roll:
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Viel sauberer geht das sowieso nur mit einem Callback. :wink:

Code: Alles auswählen

Global Win_Main_Close.l, Win_Main.l
Win_Main_Close = #False

Procedure WindowCallback(hWindow.l, Message.l, wParam.l, lParam.l)
  Protected Result.l
  
  Result = #PB_ProcessPureBasicEvents
  
  Select Message
    
    Case #WM_LBUTTONDOWN  ;Wenn die linke Maustaste gedrückt ist
      ReleaseCapture_()
      SendMessage_(hWindow, #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
      
    Case #WM_KEYDOWN      ;Wenn eine Taste gedrückt ist
      Select wParam
        
        Case #VK_ESCAPE   ;ESC gedrückt
          Win_Main_Close = #True
          
      EndSelect
      
  EndSelect
  
  ProcedureReturn Result
EndProcedure

Win_Main = OpenWindow(#PB_Any, 0, 0, 200, 100, #PB_Window_ScreenCentered | #PB_Window_BorderLess, "PB Borderless")
If Win_Main
  SetWindowCallback(@WindowCallback())
  Repeat
    WaitWindowEvent()
  Until Win_Main_Close
  CloseWindow(Win_Main)
EndIf
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

Das funktioniert nicht, wenn ich ein ImageGadget auf die volle Größe des Fensters skaliere. :(

Code: Alles auswählen

Global Win_Main_Close.l, Win_Main.l 
Win_Main_Close = #False 

Procedure WindowCallback(hWindow.l, Message.l, wParam.l, lParam.l) 
  Protected Result.l 
  Result = #PB_ProcessPureBasicEvents 
  Select Message 
    Case #WM_LBUTTONDOWN  ;Wenn die linke Maustaste gedrückt ist 
      ReleaseCapture_() 
      SendMessage_(hWindow, #WM_NCLBUTTONDOWN, #HTCAPTION, 0) 
    Case #WM_KEYDOWN      ;Wenn eine Taste gedrückt ist 
      Select wParam 
        Case #VK_ESCAPE   ;ESC gedrückt 
          Win_Main_Close = #True 
      EndSelect 
  EndSelect 
  
  ProcedureReturn Result 
EndProcedure 

Win_Main = OpenWindow(#PB_Any, 0, 0, 50, 50, "PB Borderless", #PB_Window_ScreenCentered | #PB_Window_BorderLess) 
If Win_Main 
  CreateGadgetList (WindowID(Win_Main))
  ImageGadget (0,0,0,50,50,CatchImage(0,?Window))

  SetWindowCallback(@WindowCallback()) 
  Repeat 
    WaitWindowEvent() 
  Until Win_Main_Close 
  CloseWindow(Win_Main) 
EndIf

DataSection
  Window: IncludeBinary "logo.bmp"
EndDataSection
Das Bitmap zum Test könnt bekommt ihr hier.
Benutzeravatar
Donald
Beiträge: 307
Registriert: 03.01.2005 02:21
Wohnort: Marl

Beitrag von Donald »

Hi real,

Code: Alles auswählen

ImageGadget (0,0,0,50,50,CatchImage(0,?Window))
DisableGadget(0,1)
wenn Du DisableGadget einfügst geht es.
DONALD :D www.PureBasic-Donald.de gibt es im Moment nicht mehr
PureBasic - jaPBe - PureVisonXP - TailBite
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

Cool... Danke :D
Antworten