Seite 1 von 1

Button per Maus Bewegen-vergrößern wie beim Visual Designer

Verfasst: 13.04.2005 14:36
von Thatsanee
Hi,

gibt es vom Visual Designer auch irgendwo den Source ?
Oder irgendwelche Beispiel wie das geht:
z.B. ein Button ins Fenster setzen und dann verschieben
und die größe ändern.

Wäre echt klasse wann ich darüber infos bekommen
könnte.

--------------------------------------------
Thatsanee

Verfasst: 13.04.2005 20:22
von FGK
Hallo Leute,


ich schließe mich diesem Wunsch ebenfalls an. Die Quellen könnten interessant sein.
Ich würde zusätzlich gerne erfahren wie man diese Größenänderungs-Punkte am besten erzeugt um die Gadgets schön komfortabel zu "resizen"


Gruß

FGK

Verfasst: 17.04.2005 20:31
von benpicco
Naja, wer weiß ob der Visual designer überhaupt mit PureBásic programmiert wurde, villeicht wurde dafür C++ benutzt...

Verfasst: 17.04.2005 20:52
von ts-soft
benpicco hat geschrieben:Naja, wer weiß ob der Visual designer überhaupt mit PureBásic programmiert wurde, villeicht wurde dafür C++ benutzt...
Der VisualDesigner ist in PureBasic geschrieben. Im Source wird nur minimal WinAPI verwendet. Für eine der ersten Versionen wurde auch mal der Source Veröffentlicht. Hab leider keinen link mehr dazu.

Gruß
Thomas

Verfasst: 24.04.2005 03:53
von Donald
ts-soft hat geschrieben: Der VisualDesigner ist in PureBasic geschrieben. Im Source wird nur minimal WinAPI verwendet. Für eine der ersten Versionen wurde auch mal der Source Veröffentlicht. Hab leider keinen link mehr dazu.
Schade, würde mich auch interessieren.
Vielleicht hat es sich ja einer damals geladen und stellt
es mal zum download bereit.

länge?

Verfasst: 24.04.2005 20:56
von Green Snake
wisst ihr, wie lange der source vom vd ist?
das intressiert mich irgendwie. :allright:

Verfasst: 30.11.2005 23:13
von Thatsanee
Hi zusammen,

das Thema ist zwar schon eine weile her.

Sollte ich wirklich ein Thema getroffen haben was einige interessiert
und KEINER hat eine Umsetzung / Lösung dafür ? :cry:

Das kann ich kaum Glauben !!!

Verfasst: 30.11.2005 23:35
von Hroudtwolf

Verfasst: 01.12.2005 14:06
von Thatsanee
Hroudtwolf hat geschrieben:Bitte sehr....
Hallo Hroudtwolf,
danke, aber es ist noch nicht das was ich Suche.

Hast Du auch noch eine "demo" mit der man mehrere Buttons
benutzen kann und auch die GRÖSSE verändern kann ?

Hab zwar selbst schon das eine oder andere ausprobiert,
aber so richtig klappt es nicht.

Verfasst: 02.12.2005 17:50
von DarkDragon
Hab mal etwas zusammengekritzelt, was unter Windows und Linux funzt.

Code: Alles auswählen

#MB_DOWN = 2
#MB_UP   = 4

#RESIZEBOX_WIDTH = 6
#RESIZEBOX_HEIGHT = 6

Structure SArea_Area
  ;Identifiers:
  ID.l
  
  ;Positions:
  X.l
  Y.l
  Width.l
  Height.l
EndStructure

Structure SArea_Box
  X.l
  Y.l
EndStructure


NewList Area_Area.SArea_Area()
Dim Area_Box.SArea_Box(7)

Procedure WindowMouseButton(Wnd, ButtonNr)
  
  CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  ;Linux Version
  
  Protected gdkWnd.l, x.l, y.l, mask.l
  
  If Wnd
    *Window.GTKWindow = Wnd
    gdkWnd = *Window\bin\child\window
    gdk_window_get_pointer_(gdkWnd, @x, @y, @mask)
    
    Select ButtonNr
      Case 0
        If (mask & #GDK_BUTTON1_MASK)
          ProcedureReturn 1
        EndIf
      Case 1
        If (mask & #GDK_BUTTON3_MASK)
          ProcedureReturn 1
        EndIf
      Case 2
        If (mask & #GDK_BUTTON2_MASK)
          ProcedureReturn 1
        EndIf
    EndSelect
  EndIf
  
  CompilerElse
  ;Windows Version
  
  If Wnd And GetForegroundWindow_() = Wnd
    Select ButtonNr
      Case 0
        If GetAsyncKeyState_(#VK_LBUTTON) > 0
          ProcedureReturn 1
        EndIf
      Case 1
        If GetAsyncKeyState_(#VK_RBUTTON) > 0
          ProcedureReturn 1
        EndIf
      Case 2
        If GetAsyncKeyState_(#VK_MBUTTON) > 0
          ProcedureReturn 1
        EndIf
    EndSelect
  EndIf
  
  CompilerEndIf
  
  ProcedureReturn 0
EndProcedure

Procedure.l IsCoordOnArea(X.l, Y.l, AX.l, AY.l, AWidth.l, AHeight.l)
  If X >= AX And Y >= AY And (AX+AWidth) >= X And (AY+AHeight) >= Y
    ProcedureReturn 1
  EndIf
  ProcedureReturn 0
EndProcedure

Procedure.l CreateArea(x, y, width, height)
  Static CurrentID.l
  
  If width  < 0 : x + width  : width  * -1 : EndIf
  If height < 0 : y + height : height * -1 : EndIf
  
  CurrentID + 1
  
  AddElement(Area_Area())
  Area_Area()\ID = CurrentID.l
  Area_Area()\X  = x
  Area_Area()\Y  = y
  Area_Area()\Width  = width
  Area_Area()\height = height
  
  ProcedureReturn CurrentID
EndProcedure

Procedure.l DeleteArea(ID)
  ForEach Area_Area()
    If Area_Area()\ID = ID
      DeleteElement(Area_Area())
      Result = 1
      Break
    EndIf
  Next
  
  ProcedureReturn Result
EndProcedure

Procedure.l DrawAreas(WindowID, *Callback)
  Static MouseX.l, MouseY.l, oMouseX.l, oMouseY.l
  Static oLMouseButton.l, LMouseButton.l
  Static CurAreaSelected.l, CurBoxSelected.l
  Protected DeltaMouseX.l, DeltaMouseY.l, LMEvent.l
  
  oLMouseButton = LMouseButton
  LMouseButton = WindowMouseButton(WindowID, 0)
  
  oMouseX = MouseX
  oMouseY = MouseY
  MouseX = WindowMouseX()
  MouseY = WindowMouseY()
  DeltaMouseX = MouseX-oMouseX
  DeltaMouseY = MouseY-oMouseY
  
  If oLMouseButton <> 0 And LMouseButton = 0
    LMEvent = #MB_UP
  ElseIf oLMouseButton = 0 And LMouseButton <> 0
    LMEvent = #MB_DOWN
  EndIf
  
  If LMEvent = #MB_UP
    CurAreaSelected = 0
    CurBoxSelected = 0
    If Area_Area()\Width   < 0 : Area_Area()\X + Area_Area()\Width  : Area_Area()\Width  * -1 : EndIf
    If Area_Area()\Height  < 0 : Area_Area()\Y + Area_Area()\Height : Area_Area()\Height * -1 : EndIf
  EndIf
  
  ForEach Area_Area()
;     If Area_Area()\Width  < 0
;       Area_Area()\X + Area_Area()\Width
;       Area_Area()\Width  * -1
;       If CurBoxSelected <> 0
;         If CurBoxSelected <= 2 Or (CurBoxSelected <= 6 And CurBoxSelected >= 5)
;           CurBoxSelected + 2
;         Else
;           CurBoxSelected - 2
;         EndIf
;       EndIf
;     EndIf
;     If Area_Area()\Height  < 0
;       Area_Area()\Y + Area_Area()\Height
;       Area_Area()\Height  * -1
;       If CurBoxSelected <> 0
;         If CurBoxSelected <= 2 Or (CurBoxSelected <= 6 And CurBoxSelected >= 5)
;           CurBoxSelected + 2
;         Else
;           CurBoxSelected - 2
;         EndIf
;       EndIf
;     EndIf
    
    If *Callback
      x = Area_Area()\X
      y = Area_Area()\Y
      w = Area_Area()\Width
      h = Area_Area()\Height
      If w < 0 : x + w  : w  * -1 : EndIf
      If h < 0 : y + h  : h  * -1 : EndIf
      CallFunctionFast(*Callback, Area_Area()\ID, x, y, w, h)
    EndIf
    
    ;Border
    DrawingMode(2|4)
    Box(Area_Area()\X, Area_Area()\Y, Area_Area()\Width, Area_Area()\Height)
    
    DrawingMode(2)
    ;Cornerpoints
    Area_Box(0)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH  * 0.5))
    Area_Box(0)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5))
    Area_Box(1)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH  * 0.5)) + Area_Area()\Width
    Area_Box(1)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5))
    Area_Box(2)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH  * 0.5)) + Area_Area()\Width
    Area_Box(2)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5)) + Area_Area()\Height
    Area_Box(3)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH  * 0.5))
    Area_Box(3)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5)) + Area_Area()\Height
    
    Area_Box(4)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH  * 0.5)) + Area_Area()\Width  * 0.5
    Area_Box(4)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5))
    Area_Box(5)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH  * 0.5)) + Area_Area()\Width
    Area_Box(5)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5)) + Area_Area()\Height * 0.5
    Area_Box(6)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH  * 0.5)) + Area_Area()\Width  * 0.5
    Area_Box(6)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5)) + Area_Area()\Height
    Area_Box(7)\X = (Area_Area()\X - Int(#RESIZEBOX_WIDTH  * 0.5))
    Area_Box(7)\Y = (Area_Area()\Y - Int(#RESIZEBOX_HEIGHT * 0.5)) + Area_Area()\Height * 0.5
    
    ;Movement of the area
    If LMEvent = #MB_DOWN And IsCoordOnArea(MouseX, MouseY, Area_Area()\X+Int(#RESIZEBOX_WIDTH*0.5), Area_Area()\Y+Int(#RESIZEBOX_HEIGHT*0.5), Area_Area()\Width-#RESIZEBOX_WIDTH, Area_Area()\Height-#RESIZEBOX_HEIGHT) = 1
      
      If CurAreaSelected = 0 And CurBoxSelected = 0
        CurAreaSelected = Area_Area()\ID
        CurBoxSelected = 0
      EndIf
      
    ElseIf CurAreaSelected = Area_Area()\ID And CurBoxSelected = 0
      
      Area_Area()\X + DeltaMouseX
      Area_Area()\Y + DeltaMouseY
      
    EndIf
    
    ;Draw and check the resizeboxes
    For k=0 To 7
      Box(Area_Box(k)\X, Area_Box(k)\Y, #RESIZEBOX_WIDTH, #RESIZEBOX_HEIGHT)
      If LMEvent = #MB_DOWN And IsCoordOnArea(MouseX, MouseY, Area_Box(k)\X, Area_Box(k)\Y, #RESIZEBOX_WIDTH, #RESIZEBOX_HEIGHT) = 1
        
        If CurAreaSelected = 0 And CurBoxSelected = 0
          CurAreaSelected = Area_Area()\ID
          CurBoxSelected = k+1
        EndIf
        
      ElseIf CurAreaSelected = Area_Area()\ID And CurBoxSelected = k+1
        
        Select k
          Case 0 ;Left-Top
            Area_Area()\Width + (Area_Area()\X-MouseX)
            Area_Area()\X = MouseX
            Area_Area()\Height + (Area_Area()\Y-MouseY)
            Area_Area()\Y = MouseY
            
          Case 1 ;Right-Top
            Area_Area()\Width = (MouseX-Area_Area()\X)
            Area_Area()\Height + (Area_Area()\Y-MouseY)
            Area_Area()\Y = MouseY
            
          Case 2 ;Right-Bottom
            Area_Area()\Width = (MouseX-Area_Area()\X)
            Area_Area()\Height = (MouseY-Area_Area()\Y)
            
          Case 3 ;Left-Bottom
            Area_Area()\Width + (Area_Area()\X-MouseX)
            Area_Area()\X = MouseX
            Area_Area()\Height = (MouseY-Area_Area()\Y)
            
            
          Case 4 ;Top
            Area_Area()\Height + (Area_Area()\Y-MouseY)
            Area_Area()\Y = MouseY
            
          Case 5 ;Right
            Area_Area()\Width = (MouseX-Area_Area()\X)
            
          Case 6 ;Bottom
            Area_Area()\Height = (MouseY-Area_Area()\Y)
            
          Case 7 ;Left
            Area_Area()\Width + (Area_Area()\X-MouseX)
            Area_Area()\X = MouseX
        EndSelect
        
      EndIf
    Next
  Next
EndProcedure

;-Example:
Procedure TheCallback(ID, X, Y, Width, Height)
  Box(X, Y, Width, Height, RGB(255-ID*10, 0, 0))
EndProcedure

OpenWindow(0, 0, 0, 640, 480, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Test")

ID = CreateArea(100, 100, 320, 200)

CreateImage(0, 640, 480)

Repeat
  ;Backbuffer:
  ResizeImage(0, WindowWidth(), WindowHeight())
  StartDrawing(ImageOutput())
  Box(0, 0, ImageWidth(), ImageHeight(), RGB(255, 255, 255))
  DrawAreas(WindowID(), @TheCallback())
  StopDrawing()
  
  ;Flip it:
  StartDrawing(WindowOutput())
  DrawImage(ImageID(), 0, 0)
  StopDrawing()
  Event = WindowEvent()
  Delay(30)
Until Event = #PB_Event_CloseWindow
End