Imagegadget verschieben

Für allgemeine Fragen zur Programmierung mit PureBasic.
Joern2572
Beiträge: 1
Registriert: 02.09.2025 00:02

Imagegadget verschieben

Beitrag von Joern2572 »

Hi :) ,

Ich Versuche verzweifelt ein imagegadget in einem Fenster per linker Maustaste zu verschieben... In einem canvas geht es, leider nicht über das Gadget selbst, sondern nur über das canvas . Hoffe jemand kann mir helfen.

LG Jörn
Axolotl
Beiträge: 278
Registriert: 31.12.2008 16:34

Re: Imagegadget verschieben

Beitrag von Axolotl »

Dein erster Post!
Also erstmal Hallo im Forum.
Was spricht gegen ein Canvas?
Na gut, mit dem folgenden Code kann man (alle) Gadgets mit CONTROL+LeftMouse herumschieben. Wenn man mit Windows arbeitet.
Viel Spaß beim ausprobieren.....

Code: Alles auswählen

EnableExplicit 
Global i, DragGadget, X, Y, StartX, StartY, GdtX, GdtY 

Global NewList AllMovableGadget() 

Procedure GetGadgetUnderMouseCursor(MX, MY) 
  ForEach AllMovableGadget()
    If MX > GadgetX(AllMovableGadget()) And MX < GadgetX(AllMovableGadget())+GadgetWidth(AllMovableGadget())
      If MY > GadgetY(AllMovableGadget()) And MY < GadgetY(AllMovableGadget())+GadgetHeight(AllMovableGadget()) 
        ProcedureReturn AllMovableGadget() 
      EndIf
    EndIf
  Next
  ProcedureReturn -1
EndProcedure

If OpenWindow(0,0,0,200,200,"Image Gadget Moving Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
 
  If CreateImage(0, 32, 32, 24, #White) 
    If StartDrawing(ImageOutput(0))
      Box(4,4,24,24, #Blue)
      Box(8,8,16,16, #Green)
      StopDrawing() 
    EndIf
  EndIf 

  TextGadget(0, 8, 0, 184, 18, "Move Image with CONTROL") 
  ImageGadget(1, 8, 24, 80, 32, ImageID(0)) 

; For i = <FirstGadget> To <LastGadget> 
  For i = 0 To 1 
    AddElement(AllMovableGadget())
    AllMovableGadget() = i
  Next
  
  Repeat
    Select WaitWindowEvent() 
      Case #PB_Event_CloseWindow 
        Break   ; done, leave the main loop 

      Case #PB_Event_Gadget 
        Select EventGadget() 
          Case 1 
            Debug "Click Image " 

        EndSelect

      Case #WM_MOUSEMOVE 
        If IsGadget(DragGadget) And (GetAsyncKeyState_(#VK_CONTROL) & $8000)  
          X = WindowMouseX(0) - StartX + GdtX 
          Y = WindowMouseY(0) - StartY + GdtY          ;: Debug "Drag X,Y == " + X + ", " + Y 
          SetGadgetText(0, "Move Image to " + Str(X) + ", " + Str(Y)) 
          If X >= 0 And Y >= 0 
            ResizeGadget(DragGadget, X, Y, #PB_Ignore, #PB_Ignore) 
          EndIf
        EndIf

      Case #WM_LBUTTONUP  
        If IsGadget(DragGadget) And (GetAsyncKeyState_(#VK_CONTROL) & $8000) 
          DragGadget = -1   ; release the DragGadget 
          SetGadgetText(0, "Move Image is done. ") 
        EndIf 

      Case #WM_LBUTTONDOWN  
        If (GetAsyncKeyState_(#VK_CONTROL) & $8000) 
          StartX = WindowMouseX(0) 
          StartY = WindowMouseY(0)                                        : Debug "Start X,Y == " + StartX + ", " + StartY 
          DragGadget = GetGadgetUnderMouseCursor(StartX, StartY) 

          If IsGadget(DragGadget) 
            GdtX = GadgetX(DragGadget) 
            GdtY = GadgetY(DragGadget) 
            SetGadgetText(0, "Move Image to " + Str(GdtX) + ", " + Str(GdtY)) 
          EndIf
        EndIf
    EndSelect
  ForEver 
EndIf 
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Antworten