Page 4 sur 5

Re: Rendre transparent une couleur dans une imagegadget

Publié : jeu. 18/févr./2010 22:28
par cederavic
Je pense etre sur une bonne piste... Je voulais te donner quelque chose de fonctionnel ce soir mais je n'ai pas pu avancer comme je le voulais. C'est mon annif aurjou'dhui alors entre la famille, les potes etc j'ai pas eu vraiment le temps. Je te ferais ça pour ce weekend :)

Re: Rendre transparent une couleur dans une imagegadget

Publié : jeu. 18/févr./2010 22:58
par Kwai chang caine
Merci beaucoup CEDERAVIC.....
Te casse pas la tete, y'a pas le feu au lac non plus....c'est super gentil

Avec ton talent...tu va me faire regretter d'avoir commencé mon programme sans te demander comment m'y prendre avant :?

En tout cas bon anniversaire...c'est important un anniversaire...surtout si tu as noir de gens pour te le feter 8)
Et pis 20 ans...ça se fete pas tous les jours :mrgreen:

Re: Rendre transparent une couleur dans une imagegadget

Publié : ven. 19/févr./2010 0:14
par Backup
bon anniversaire alors !! :D

Image

Re: Rendre transparent une couleur dans une imagegadget

Publié : sam. 20/févr./2010 11:28
par cederavic
Bah le forum ne m'a pas dit qu'il y avait de nouveaux message ici :x
Merci :)

Bon voila un truc "à peut pret" présentable... c'est très loin d'être terminé et c'est "sale" mais c'est pour te donner une idée de mon idée (ça me fait byzard cette phrase :| )
C'est tout simple, click au milieux de la flèche pour la déplacer, et sur les bouts pour la euh... tu verra :P
Je ferais de belles flèches plus tard, je vais d'abord finir la partie fonctionnelle!

Code : Tout sélectionner

Structure ArrowData
  IsArrow.b

  GadgetID.l
  hGdt.l
  
  ImageID.l
  hBmp.l
  SnapImg.l
  
  x.l
  y.l
  Size.b
  Width.l
  Height.l
  
  Locked.b
  
  StartMove.point
  Moving.b
  
  AnchorA.point
  AnchorA_Moving.b
  
  AnchorB.point
  AnchorB_Moving.b
EndStructure

Structure MSLLHOOKSTRUCT
  pt.point
  mouseData.l
  flags.l
  time.l
  dwExtraInfo.l
EndStructure

Enumeration
  #ArrowType_Direct
  #ArrowType_Kneed
  #ArrowType_Rounded
EndEnumeration

Declare.l ArrowGadget(GadgetID.l, x.l, y.l, width.l, height.l, type.b = #ArrowType_Direct)
Declare.b UpdateArrowGadget(GadgetID.l)
Declare.l DrawArrow(Image.l, x1.l, y1.l, x2.l, y2.l, size.l, BorderlColor.l, GradientColor1.l, GradientColor2.l, GradientColor3.l)
Declare.l MouseHookCallback(nCode.l, wParam.l, lParam.l)
Declare.l WindowCallback(hWnd.l, Msg.l, lParam.l, wParam.l)

#WND_Main = 0

#TB_Main = 0

Enumeration
  #GDT_Arrow = 12
EndEnumeration

Global hMouseHook.l, *CurrentArrow.ArrowData

hWnd = OpenWindow(0, 0, 0, 800, 600, "ArrowGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_Invisible)
  ArrowGadget(#GDT_Arrow, 10, 10, 100, 100)

  ButtonGadget(20, 200, 200, 150, 30, "test")
  
  SetWindowCallback(@WindowCallback())
 
  TextGadget(21, 300, 10, 110, 20, "yoooooo")
  CreateImage(1, 20, 20)
  ImageGadget(22, 400, 400, 20, 20, ImageID(1))
  
  hMouseHook = SetWindowsHookEx_(#WH_MOUSE_LL, @MouseHookCallback(), GetModuleHandle_(0), 0)
  
  CreateImage(2, 800, 600)
  StartDrawing(ImageOutput(2))
    a = 1
    For x = 0 To 800 Step 10
      For y = 0 To 600 Step 10
        a * -1
        If a = 1 : Color = RGB(80, 80, 80) : Else : Color = #White : EndIf
        Box(x, y, 10, 10, Color)
      Next
    Next
  StopDrawing()
  
  HideWindow(#WND_Main, 0)
  
Repeat

  Select WaitWindowEvent(2)
  
    Case #WM_CLOSE
      Quit = #True
      
    Case #PB_Event_Gadget
      Debug EventGadget()
      
  
  EndSelect

Until Quit = #True


Procedure.l MouseHookCallback(nCode.l, wParam.l, lParam.l)
Shared MouseX.l, MouseY.l
  *MouseInfo.MSLLHOOKSTRUCT = lParam
  *UserData.ArrowData
  
  GadgetID.l = GetDlgCtrlID_(WindowFromPoint_(*MouseInfo\pt\x | (*MouseInfo\pt\y << 32)))
  If IsGadget(GadgetID)
    *UserData = GetGadgetData(GadgetID)
    If *UserData <> #Null
      If *UserData\IsArrow = #True And *UserData\Locked = #False
        *CurrentArrow = *UserData
        If nCode >= 0
          
          hWndParent.l  = GetParent_(*UserData\hGdt)
          GetWindowInfo_(hWndParent, @WndInfo.WINDOWINFO)
          oldMouseX = MouseX : oldMouseY = MouseY
          MouseX.l = *MouseInfo\pt\x - WndInfo\rcClient\left
          MouseY.l = *MouseInfo\pt\y - WndInfo\rcClient\top
          MouseDeltaX = MouseX - oldMouseX : MouseDeltaY = MouseY - oldMouseY
         
          Select wParam
            
            Case #WM_LBUTTONDOWN
              rc1.Rect
                rc1\left   = *UserData\x + *UserData\AnchorA\x - *UserData\Size / 2
                rc1\top    = *UserData\y + *UserData\AnchorA\y - *UserData\Size / 2
                rc1\right  = *UserData\x + *UserData\AnchorA\x + *UserData\Size / 2
                rc1\bottom = *UserData\y + *UserData\AnchorA\y + *UserData\Size / 2
              rc2.Rect
                rc2\left   = *UserData\x + *UserData\AnchorB\x - *UserData\Size / 2
                rc2\top    = *UserData\y + *UserData\AnchorB\y - *UserData\Size / 2
                rc2\right  = *UserData\x + *UserData\AnchorB\x + *UserData\Size / 2
                rc2\bottom = *UserData\y + *UserData\AnchorB\y + *UserData\Size / 2
              rc3.Rect
                rc3\left   = *UserData\x 
                rc3\top    = *UserData\y 
                rc3\right  = *UserData\x + *UserData\Width 
                rc3\bottom = *UserData\y + *UserData\Height 
              If PtInRect_(@rc1, MouseX | (MouseY << 32))
                *UserData\AnchorA_Moving = #True
              ElseIf PtInRect_(@rc2, MouseX | (MouseY << 32))
                *UserData\AnchorB_Moving = #True
              ElseIf PtInRect_(@rc3, MouseX | (MouseY << 32))
                *UserData\Moving = #True
                *UserData\StartMove\x = MouseX - *UserData\x
                *UserData\StartMove\y = MouseY - *UserData\y
              Else
                *UserData\AnchorA_Moving = #False
                *UserData\AnchorB_Moving = #False
                *UserData\Moving = #False
              EndIf
              
              If (*UserData\Moving = #True Or *UserData\AnchorA_Moving = #True Or *UserData\AnchorB_Moving = #True)
                HideGadget(*UserData\GadgetID, 1)
                UpdateWindow_(hWndParent)

                hDC = GetDC_(hWndParent)
                  *UserData\SnapImg = CreateImage(#PB_Any, WndInfo\rcClient\right, WndInfo\rcClient\bottom)
                  hDC2 = StartDrawing(ImageOutput(*UserData\SnapImg))
                  BitBlt_(hDC2, 0, 0, WndInfo\rcClient\right, WndInfo\rcClient\bottom, hDC, 0, 0, #SRCPAINT | $40000000)
                  StopDrawing()
                ReleaseDC_(hWndParent, hDC) 
              EndIf

            Case #WM_LBUTTONUP
              *UserData\AnchorA_Moving = #False
              *UserData\AnchorB_Moving = #False
              *UserData\Moving = #False
              
              UpdateArrowGadget(GadgetID)
              
              HideGadget(*UserData\GadgetID, 0)
              UpdateWindow_(hWndParent)

            
            Case #WM_MOUSEMOVE
              If (*UserData\Moving = #True Or *UserData\AnchorA_Moving = #True Or *UserData\AnchorB_Moving = #True)
              StartDrawing(WindowOutput(GetDlgCtrlID_(hWndParent)))
                DrawImage(ImageID(*UserData\SnapImg), 0, 0)
                Circle(*UserData\x + *UserData\AnchorA\x, *UserData\y + *UserData\AnchorA\y, *UserData\Size / 2, #Green)
                Circle(*UserData\x + *UserData\AnchorB\x, *UserData\y + *UserData\AnchorB\y, *UserData\Size / 2, #Green)
                LineXY(*UserData\x + *UserData\AnchorA\x, *UserData\y + *UserData\AnchorA\y, *UserData\x + *UserData\AnchorB\x, *UserData\y + *UserData\AnchorB\y, #Green)
              StopDrawing()
              EndIf
            
              If *UserData\AnchorA_Moving = #True
                *UserData\AnchorA\x = MouseX - *UserData\x
                *UserData\AnchorA\y = MouseY - *UserData\y
              EndIf
              If  *UserData\AnchorB_Moving = #True
                *UserData\AnchorB\x = MouseX - *UserData\x
                *UserData\AnchorB\y = MouseY - *UserData\y
              EndIf
              If  *UserData\Moving = #True
                *UserData\AnchorA\x + MouseDeltaX
                *UserData\AnchorA\y + MouseDeltaY
                *UserData\AnchorB\x + MouseDeltaX
                *UserData\AnchorB\y + MouseDeltaY
              EndIf
              
            Case #WM_MOUSEWHEEL
            
            Case #WM_RBUTTONDOWN
            
            Case #WM_RBUTTONUP
      
          EndSelect
        
        EndIf
      EndIf
    EndIf
  Else
    If nCode >= 0
      
      If *CurrentArrow <> #Null
        hWndParent.l  = GetParent_(*CurrentArrow\hGdt)
        GetWindowInfo_(hWndParent, @WndInfo.WINDOWINFO)

        oldMouseX = MouseX : oldMouseY = MouseY
        MouseX.l = *MouseInfo\pt\x - WndInfo\rcClient\left
        MouseY.l = *MouseInfo\pt\y - WndInfo\rcClient\top
        MouseDeltaX = MouseX - oldMouseX : MouseDeltaY = MouseY - oldMouseY
      EndIf

      Select wParam
        
        Case #WM_LBUTTONUP
   
          If *CurrentArrow <> #Null
            *CurrentArrow\AnchorA_Moving = #False
            *CurrentArrow\AnchorB_Moving = #False
            *CurrentArrow\Moving = #False
            UpdateArrowGadget(*CurrentArrow\GadgetID)

            HideGadget(*CurrentArrow\GadgetID, 0)
            UpdateWindow_(hWndParent)
          EndIf
        
        Case #WM_MOUSEMOVE
          If *CurrentArrow <> #Null And (*CurrentArrow\Moving = #True Or *CurrentArrow\AnchorA_Moving = #True Or *CurrentArrow\AnchorB_Moving = #True)
            StartDrawing(WindowOutput(GetDlgCtrlID_(hWndParent)))
              DrawImage(ImageID(*CurrentArrow\SnapImg), 0, 0)
              Circle(*CurrentArrow\x + *CurrentArrow\AnchorA\x, *CurrentArrow\y + *CurrentArrow\AnchorA\y, *CurrentArrow\Size / 2, #Green)
              Circle(*CurrentArrow\x + *CurrentArrow\AnchorB\x, *CurrentArrow\y + *CurrentArrow\AnchorB\y, *CurrentArrow\Size / 2, #Green)
              LineXY(*CurrentArrow\x + *CurrentArrow\AnchorA\x, *CurrentArrow\y + *CurrentArrow\AnchorA\y, *CurrentArrow\x + *CurrentArrow\AnchorB\x, *CurrentArrow\y + *CurrentArrow\AnchorB\y, #Green)
            StopDrawing()

            If *CurrentArrow\AnchorA_Moving = #True
              *CurrentArrow\AnchorA\x = MouseX - *CurrentArrow\x
              *CurrentArrow\AnchorA\y = MouseY - *CurrentArrow\y
            EndIf
            If *CurrentArrow\AnchorB_Moving = #True
              *CurrentArrow\AnchorB\x = MouseX - *CurrentArrow\x
              *CurrentArrow\AnchorB\y = MouseY - *CurrentArrow\y
            EndIf
            If *CurrentArrow\Moving = #True
              *CurrentArrow\AnchorA\x + MouseDeltaX
                *CurrentArrow\AnchorA\y + MouseDeltaY
                *CurrentArrow\AnchorB\x + MouseDeltaX
                *CurrentArrow\AnchorB\y + MouseDeltaY
            EndIf
            
          EndIf
 
      EndSelect
    EndIf
  EndIf
  

  ProcedureReturn CallNextHookEx_(hMouseHook, nCode, wParam, lParam)

EndProcedure

Procedure.b UpdateArrowGadget(GadgetID.l)
  If IsGadget(GadgetID)
    *UserData.ArrowData = GetGadgetData(GadgetID)
    
    ; Redefine Sizes
    If *UserData\AnchorA\x < *UserData\AnchorB\x
      MinX = *UserData\AnchorA\x
      MaxX = *UserData\AnchorB\x
      newWidth  = Abs(MaxX - MinX) + *UserData\Size
      
      *UserData\x = *UserData\x + MinX - *UserData\Size / 2
      
      *UserData\AnchorA\x = *UserData\Size / 2
      *UserData\AnchorB\x = newWidth - *UserData\Size / 2
      
      *UserData\Width = newWidth
    Else
      MinX = *UserData\AnchorB\x
      MaxX = *UserData\AnchorA\x
      newWidth  = Abs(MaxX - MinX) + *UserData\Size
      
      *UserData\x = *UserData\x + MinX - *UserData\Size / 2
      
      *UserData\AnchorB\x = *UserData\Size / 2
      *UserData\AnchorA\x = newWidth - *UserData\Size / 2
      *UserData\Width = newWidth
    EndIf
    
    If *UserData\AnchorA\y < *UserData\AnchorB\y
      MinY = *UserData\AnchorA\y
      MaxY = *UserData\AnchorB\y
      newHeight = Abs(MaxY - MinY) + *UserData\Size
      
      *UserData\y = *UserData\y + MinY - *UserData\Size / 2
      
      *UserData\AnchorA\y = *UserData\Size / 2
      *UserData\AnchorB\y = newHeight - *UserData\Size / 2
      *UserData\Height = newHeight
    Else
      MinY = *UserData\AnchorB\y
      MaxY = *UserData\AnchorA\y
      newHeight = Abs(MaxY - MinY) + *UserData\Size
      
      *UserData\y = *UserData\y + MinY - *UserData\Size / 2
      
      *UserData\AnchorB\y = *UserData\Size / 2
      *UserData\AnchorA\y = newHeight - *UserData\Size / 2
      *UserData\Height = newHeight
    EndIf
    
    FreeImage(*UserData\ImageID)
    *UserData\ImageID = CreateImage(#PB_Any, *UserData\Width, *UserData\Height, 32)
    *UserData\hBmp = ImageID(*UserData\ImageID)
    
    StartDrawing(ImageOutput(*UserData\ImageID))

      Box(*UserData\AnchorA\x - *UserData\Size / 2, *UserData\AnchorA\y - *UserData\Size / 2, *UserData\Size, *UserData\Size, RGBA(255, 0, 0, 255))
      Circle(*UserData\AnchorB\x, *UserData\AnchorB\y,  2, RGBA(255, 0, 0, 255))
      If *UserData\AnchorA\x <= *UserData\AnchorB\x And *UserData\AnchorA\y <= *UserData\AnchorB\y
        LineXY(*UserData\AnchorA\x + *UserData\Size / 2, *UserData\AnchorA\y - *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y - 2, RGBA(255, 0, 0, 255))
        LineXY(*UserData\AnchorA\x - *UserData\Size / 2, *UserData\AnchorA\y + *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y + 2, RGBA(255, 0, 0, 255))
      ElseIf *UserData\AnchorA\x <= *UserData\AnchorB\x And *UserData\AnchorA\y >= *UserData\AnchorB\y
        LineXY(*UserData\AnchorA\x - *UserData\Size / 2, *UserData\AnchorA\y - *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y - 2, RGBA(255, 0, 0, 255))
        LineXY(*UserData\AnchorA\x + *UserData\Size / 2, *UserData\AnchorA\y + *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y + 2, RGBA(255, 0, 0, 255))
      ElseIf *UserData\AnchorA\x >= *UserData\AnchorB\x And *UserData\AnchorA\y <= *UserData\AnchorB\y
        LineXY(*UserData\AnchorA\x - *UserData\Size / 2, *UserData\AnchorA\y - *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y - 2, RGBA(255, 0, 0, 255))
        LineXY(*UserData\AnchorA\x + *UserData\Size / 2, *UserData\AnchorA\y + *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y + 2, RGBA(255, 0, 0, 255))
      ElseIf*UserData\AnchorA\x >= *UserData\AnchorB\x And *UserData\AnchorA\y >= *UserData\AnchorB\y
        LineXY(*UserData\AnchorA\x - *UserData\Size / 2, *UserData\AnchorA\y + *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y + 2, RGBA(255, 0, 0, 255))
        LineXY(*UserData\AnchorA\x + *UserData\Size / 2, *UserData\AnchorA\y - *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y - 2, RGBA(255, 0, 0, 255))
      EndIf
      FillArea(*UserData\Width / 2 , *UserData\Height / 2, -1, RGBA(255, 0, 0, 255))
      
      DrawingMode(#PB_2DDrawing_AlphaChannel)
      Box(0, 0, *UserData\Width, *UserData\Height, RGBA(0, 0, 0, 0))
      
      Box(*UserData\AnchorA\x - *UserData\Size / 2, *UserData\AnchorA\y - *UserData\Size / 2, *UserData\Size, *UserData\Size, RGBA(255, 0, 0, 255))
      Circle(*UserData\AnchorB\x, *UserData\AnchorB\y, 2, RGBA(255, 0, 0, 255))
      If *UserData\AnchorA\x <= *UserData\AnchorB\x And *UserData\AnchorA\y <= *UserData\AnchorB\y
        LineXY(*UserData\AnchorA\x + *UserData\Size / 2, *UserData\AnchorA\y - *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y - 2, RGBA(255, 0, 0, 255))
        LineXY(*UserData\AnchorA\x - *UserData\Size / 2, *UserData\AnchorA\y + *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y + 2, RGBA(255, 0, 0, 255))
      ElseIf *UserData\AnchorA\x <= *UserData\AnchorB\x And *UserData\AnchorA\y >= *UserData\AnchorB\y
        LineXY(*UserData\AnchorA\x - *UserData\Size / 2, *UserData\AnchorA\y - *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y - 2, RGBA(255, 0, 0, 255))
        LineXY(*UserData\AnchorA\x + *UserData\Size / 2, *UserData\AnchorA\y + *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y + 2, RGBA(255, 0, 0, 255))
      ElseIf *UserData\AnchorA\x >= *UserData\AnchorB\x And *UserData\AnchorA\y <= *UserData\AnchorB\y
        LineXY(*UserData\AnchorA\x - *UserData\Size / 2, *UserData\AnchorA\y - *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y - 2, RGBA(255, 0, 0, 255))
        LineXY(*UserData\AnchorA\x + *UserData\Size / 2, *UserData\AnchorA\y + *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y + 2, RGBA(255, 0, 0, 255))
      ElseIf*UserData\AnchorA\x >= *UserData\AnchorB\x And *UserData\AnchorA\y >= *UserData\AnchorB\y
        LineXY(*UserData\AnchorA\x - *UserData\Size / 2, *UserData\AnchorA\y + *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y + 2, RGBA(255, 0, 0, 255))
        LineXY(*UserData\AnchorA\x + *UserData\Size / 2, *UserData\AnchorA\y - *UserData\Size / 2, *UserData\AnchorB\x, *UserData\AnchorB\y - 2, RGBA(255, 0, 0, 255))
      EndIf
      FillArea(*UserData\Width / 2 , *UserData\Height / 2, -1, RGBA(255, 0, 0, 255))
      
            
      DrawingMode(#PB_2DDrawing_Gradient)
      LinearGradient(*UserData\AnchorA\x, *UserData\AnchorA\y, *UserData\AnchorB\x, *UserData\AnchorB\y)
      FrontColor(#Red) : GradientColor(0.80, #Blue) : BackColor(#Green)
      Box(0, 0, *UserData\Width, *UserData\Height)
      
    StopDrawing()
    
    ResizeGadget(GadgetID, *UserData\x, *UserData\y, *UserData\Width, *UserData\Height)
    SetGadgetState(GadgetID, *UserData\hBmp)
    
  Else
    ProcedureReturn #False
  EndIf
  
  ProcedureReturn #True
EndProcedure

Procedure.l ArrowGadget(GadgetID.l, x.l, y.l, width.l, height.l, type.b = #ArrowType_Direct)
  
  *UserData.ArrowData = AllocateMemory(SizeOf(ArrowData))
  
  *UserData\IsArrow = #True
  *UserData\GadgetID = GadgetID
  
  *UserData\ImageID = CreateImage(#PB_Any, width, height, 32)
  *UserData\hBmp = ImageID(*UserData\ImageID)
  
  *UserData\Size = 24
  *UserData\x = x
  *UserData\y = y
  *UserData\Width = width
  *UserData\Height = height
  
  *UserData\AnchorA\x = *UserData\Size / 2
  *UserData\AnchorA\y = height / 2
  
  *UserData\AnchorB\x = Width - *UserData\Size / 2
  *UserData\AnchorB\y = height / 2

  Result.l = ImageGadget(GadgetID, x, y, width, height, *UserData\hBmp)
  
  If GadgetID = #PB_Any
    *UserData\hGdt = GadgetID(Result)
  Else
    *UserData\hGdt = GadgetID(GadgetID)
  EndIf
  
  SetGadgetData(*UserData\GadgetID, *UserData)
  
  UpdateArrowGadget(GadgetID)

  ProcedureReturn Result
EndProcedure

Procedure.l WindowCallback(hWnd.l, Msg.l, wParam.l, lParam.l)

  Result.l = #PB_ProcessPureBasicEvents
  
  Select Msg
    Case #WM_PAINT
      hBmp = ImageID(2)
      hDC = BeginPaint_(hWnd, @ps.PAINTSTRUCT)
     
        hDC2 = CreateCompatibleDC_(hDC)
       
          SelectObject_ (hDC2, hBmp)
          BitBlt_(hDC, 0, 0, WindowWidth(#WND_Main), WindowHeight(#WND_Main), hDC2, 0, 0, #SRCCOPY)
          ReleaseDC_(hWnd, hDC)
         
        DeleteDC_(hDC2)
      EndPaint_(hWnd, @ps)
      ProcedureReturn #True
      
    Result = #True
      
  EndSelect

  ProcedureReturn Result

EndProcedure

Procedure.l DrawArrow(Image.l, x1.l, y1.l, x2.l, y2.l, size.l, BorderlColor.l, GradientColor1.l, GradientColor2.l, GradientColor3.l)

   width = Abs(x2 - x1) 
   height = Abs(y2 - y1)
   If width <= 0 : width = 1 : EndIf : If height <= 0 : height = 1 : EndIf
   
   ResizeImage(Image, width, height, 32)
   StartDrawing(ImageOutput(Image))

      DrawingMode(#PB_2DDrawing_Gradient)
      LinearGradient(0, size, 0, height - size - 1)
      FrontColor(GradientColor1) : GradientColor(0.80, GradientColor2) : BackColor(GradientColor3)
      Box(0, 0, width, height)
      
      DrawingMode(#PB_2DDrawing_Default)
      LineXY(size * 2 + 1, 1, 2, size * 2, BorderlColor)
      LineXY(size * 2 , 1, size * 4 - 1, size * 2, BorderlColor)
      LineXY(0, size * 2 + 1, size * 1.5 - 1, size * 2 + 1, BorderlColor)
      LineXY(size * 2.5, size * 2 + 1, size * 4, size * 2 + 1, BorderlColor)
      LineXY(size * 1.5, size * 2 + 1, size * 1.5, height - size / 2, BorderlColor)
      LineXY(size * 2.5 - 1, size * 2 + 1, size * 2.5 - 1, height - size * 1.5, BorderlColor)
      LineXY(size * 1.5, height - size / 2 - 1, width, height - size / 2 - 1, BorderlColor)
      LineXY(size * 2.5 - 1, height - size * 1.5, width, height - size * 1.5, BorderlColor)
      LineXY( width - 1, height - size * 1.5, width - 1, height - size / 2 - 1, BorderlColor)
      
      DrawingMode(#PB_2DDrawing_AlphaChannel)
      Box(0, 0, width, height, RGBA(0, 0, 0, 0))
     
      Box(size * 1.5, height - size - size / 2, width - size, size, RGBA(0, 0, 0, 255))
      Box(size * 1.5, size, size, height - size - size / 2, RGBA(0, 0, 0, 255))
      
      For ty = 0 To size * 2
        LineXY(size * 2 - ty +1, ty + 1, size * 2 + ty, ty + 1, RGBA(0, 0, 0, 255))
      Next
      
      LineXY(0, 1, width, 1, RGBA(0, 0, 0, 0))
      
  StopDrawing()
      
      
  hDC = StartDrawing(ImageOutput(Image))
    
    If width < size * 4 Or height < size * 4
      DrawingMode(#PB_2DDrawing_AlphaChannel)
      Box(0, 0, width, height, RGBA(0, 0, 0, 0))
    ElseIf x1 < x2  And y1  > y2 
      StretchBlt_(hDC, width, 0, -width, height, hDC, 0, 0, width, height, #SRCCOPY)
    ElseIf x1 < x2 And y1 < y2 
      StretchBlt_(hDC, width, height, -width, -height, hDC, 0, 0, width, height, #SRCCOPY)
    ElseIf x1   > x2 And y1 < y2  
      StretchBlt_(hDC, 0, height, width, -height, hDC, 0, 0, width, height, #SRCCOPY)
    EndIf
    
  StopDrawing()

EndProcedure
Edit : tu utilisais tres mal ton Hook pour la sourie, regarde comment je fais 8)

Re: Rendre transparent une couleur dans une imagegadget

Publié : sam. 20/févr./2010 19:45
par Kwai chang caine
La on commence le Karl lagarfeld de la programmation...Callback, Structure, API, Hook....
C'est de la hautre couture....heureusement que tu m'as dit que c'etait sale...j'm'en serais pas apperçu 8)

Si tu veux un jour, je te montrerais des codes que j'ai fait .....qui sont "sales"...ou plutot comment dirais je....a chier partout serait plus juste et encore un doux euphemisme :oops:

Cool le mode de deplacement..... 8)
Par contre ta fleche elle a trop visité la haute couture...elle est tout en couleur :lol:
Moi je preferais de loin ta splendide fleche a angle droit precedente que j'ai commencé à incorporer dans mon code mercredi... :wink:
Car bon celle la....c'est pas vraiment une fleche..si ????

D'un autre coté, ça m'a donné une idée, si tu arrivais par un moyen magique, je ne sais pas lequel, à faire une fleche super bien nette comme celle d'avant, qui peut etre droite ET en angle droit....bah je pourrais laisser tomber mes petites fleches bleue en PNG toutes "pourites" qui ne sont pas resizable...et donc bien moins jolies que les tiennes...
Comme ça je pourrais faire ça =====> ça <===== et aussi en verticale, et selon un procédé pouvoir si on le désire les "casser" en angle droit, pour pouvoir faire comme celle que tu m'avais faites.

En tout cas merci beaucoup de continuer a m'aider 8)

Re: Rendre transparent une couleur dans une imagegadget

Publié : dim. 21/févr./2010 12:27
par cederavic
La fleche est moche oui, tres moche! Mais comme je l'ai dit, je boss essentielement sur la partie fonctionnelle pour l'instant (pas le graphisme quoi)... Mais je vois que la fleche en elle meme te tient à coeur, alors la voila :P

Code : Tout sélectionner

Structure ArrowData
  IsArrow.b
  Type.b

  GadgetID.l
  hGdt.l
  
  ImageID.l
  hBmp.l
  SnapImg.l
  
  x.l
  y.l
  Size.b
  Width.l
  Height.l
  
  Locked.b
  
  StartMove.point
  Moving.b
  
  AnchorA.point
  AnchorA_Moving.b
  
  AnchorB.point
  AnchorB_Moving.b
EndStructure

Structure MSLLHOOKSTRUCT
  pt.point
  mouseData.l
  flags.l
  time.l
  dwExtraInfo.l
EndStructure

Enumeration
  #ArrowType_Direct
  #ArrowType_Kneed
  #ArrowType_Rounded
EndEnumeration

Declare.l ArrowGadget(GadgetID.l, x.l, y.l, width.l, height.l, type.b = #ArrowType_Direct)
Declare.b UpdateArrowGadget(GadgetID.l)
Declare.l DrawArrow(Image.l, x1.l, y1.l, x2.l, y2.l, size.l, BorderlColor.l, GradientColor1.l, GradientColor2.l, GradientColor3.l)
Declare.f GetAngle(x1, y1, x2, y2)

Declare.l MouseHookCallback(nCode.l, wParam.l, lParam.l)
Declare.l WindowCallback(hWnd.l, Msg.l, lParam.l, wParam.l)

#WND_Main = 0

#TB_Main = 0

Enumeration
  #GDT_Arrow = 12
EndEnumeration

Global hMouseHook.l, *CurrentArrow.ArrowData

hWnd = OpenWindow(0, 0, 0, 800, 600, "ArrowGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_Invisible)
  ArrowGadget(#GDT_Arrow, 10, 10, 100, 100)

  ButtonGadget(20, 200, 200, 150, 30, "test")
  
  SetWindowCallback(@WindowCallback())
 
  TextGadget(21, 300, 10, 110, 20, "yoooooo")
  CreateImage(1, 20, 20)
  ImageGadget(22, 400, 400, 20, 20, ImageID(1))
  
  hMouseHook = SetWindowsHookEx_(#WH_MOUSE_LL, @MouseHookCallback(), GetModuleHandle_(0), 0)
  
  CreateImage(2, 800, 600)
  StartDrawing(ImageOutput(2))
    a = 1
    For x = 0 To 800 Step 10
      For y = 0 To 600 Step 10
        a * -1
        If a = 1 : Color = RGB(80, 80, 80) : Else : Color = #White : EndIf
        Box(x, y, 10, 10, Color)
      Next
    Next
  StopDrawing()
  
  HideWindow(#WND_Main, 0)
  
Repeat

  Select WaitWindowEvent(2)
  
    Case #WM_CLOSE
      Quit = #True
      
    Case #PB_Event_Gadget
      Debug EventGadget()
      
  
  EndSelect

Until Quit = #True


Procedure.l MouseHookCallback(nCode.l, wParam.l, lParam.l)
Shared MouseX.l, MouseY.l
  *MouseInfo.MSLLHOOKSTRUCT = lParam
  *UserData.ArrowData
  
  GadgetID.l = GetDlgCtrlID_(WindowFromPoint_(*MouseInfo\pt\x | (*MouseInfo\pt\y << 32)))
  If IsGadget(GadgetID)
    *UserData = GetGadgetData(GadgetID)
    If *UserData <> #Null
      If *UserData\IsArrow = #True And *UserData\Locked = #False
        *CurrentArrow = *UserData
        If nCode >= 0
          
          hWndParent.l  = GetParent_(*UserData\hGdt)
          GetWindowInfo_(hWndParent, @WndInfo.WINDOWINFO)
          oldMouseX = MouseX : oldMouseY = MouseY
          MouseX.l = *MouseInfo\pt\x - WndInfo\rcClient\left
          MouseY.l = *MouseInfo\pt\y - WndInfo\rcClient\top
          MouseDeltaX = MouseX - oldMouseX : MouseDeltaY = MouseY - oldMouseY
         
          Select wParam
            
            Case #WM_LBUTTONDOWN
              rc1.Rect
                rc1\left   = *UserData\x + *UserData\AnchorA\x - *UserData\Size / 2
                rc1\top    = *UserData\y + *UserData\AnchorA\y - *UserData\Size / 2
                rc1\right  = *UserData\x + *UserData\AnchorA\x + *UserData\Size / 2
                rc1\bottom = *UserData\y + *UserData\AnchorA\y + *UserData\Size / 2
              rc2.Rect
                rc2\left   = *UserData\x + *UserData\AnchorB\x - *UserData\Size / 2
                rc2\top    = *UserData\y + *UserData\AnchorB\y - *UserData\Size / 2
                rc2\right  = *UserData\x + *UserData\AnchorB\x + *UserData\Size / 2
                rc2\bottom = *UserData\y + *UserData\AnchorB\y + *UserData\Size / 2
              rc3.Rect
                rc3\left   = *UserData\x 
                rc3\top    = *UserData\y 
                rc3\right  = *UserData\x + *UserData\Width 
                rc3\bottom = *UserData\y + *UserData\Height 
              If PtInRect_(@rc1, MouseX | (MouseY << 32))
                *UserData\AnchorA_Moving = #True
              ElseIf PtInRect_(@rc2, MouseX | (MouseY << 32))
                *UserData\AnchorB_Moving = #True
              ElseIf PtInRect_(@rc3, MouseX | (MouseY << 32))
                *UserData\Moving = #True
                *UserData\StartMove\x = MouseX - *UserData\x
                *UserData\StartMove\y = MouseY - *UserData\y
              Else
                *UserData\AnchorA_Moving = #False
                *UserData\AnchorB_Moving = #False
                *UserData\Moving = #False
              EndIf
              
              If (*UserData\Moving = #True Or *UserData\AnchorA_Moving = #True Or *UserData\AnchorB_Moving = #True)
                HideGadget(*UserData\GadgetID, 1)
                UpdateWindow_(hWndParent)

                hDC = GetDC_(hWndParent)
                  *UserData\SnapImg = CreateImage(#PB_Any, WndInfo\rcClient\right, WndInfo\rcClient\bottom)
                  hDC2 = StartDrawing(ImageOutput(*UserData\SnapImg))
                  BitBlt_(hDC2, 0, 0, WndInfo\rcClient\right, WndInfo\rcClient\bottom, hDC, 0, 0, #SRCPAINT | $40000000)
                  StopDrawing()
                ReleaseDC_(hWndParent, hDC) 
              EndIf

            Case #WM_LBUTTONUP
              *UserData\AnchorA_Moving = #False
              *UserData\AnchorB_Moving = #False
              *UserData\Moving = #False
              
              UpdateArrowGadget(GadgetID)
              
              HideGadget(*UserData\GadgetID, 0)
              UpdateWindow_(hWndParent)

            
            Case #WM_MOUSEMOVE
              If (*UserData\Moving = #True Or *UserData\AnchorA_Moving = #True Or *UserData\AnchorB_Moving = #True)
              StartDrawing(WindowOutput(GetDlgCtrlID_(hWndParent)))
                DrawingMode(#PB_2DDrawing_Default)
                DrawImage(ImageID(*UserData\SnapImg), 0, 0)
                LineXY(*UserData\x + *UserData\AnchorA\x, *UserData\y + *UserData\AnchorA\y, *UserData\x + *UserData\AnchorB\x, *UserData\y + *UserData\AnchorB\y, 255)
                DrawingMode(#PB_2DDrawing_Transparent )
                DrawText(*UserData\x + *UserData\AnchorA\x, *UserData\y + *UserData\AnchorA\y, "FROM", 255)
                DrawText(*UserData\x + *UserData\AnchorB\x, *UserData\y + *UserData\AnchorB\y, "TO", 255)
                
              StopDrawing()
              EndIf
            
              If *UserData\AnchorA_Moving = #True
                *UserData\AnchorA\x = MouseX - *UserData\x
                *UserData\AnchorA\y = MouseY - *UserData\y
              EndIf
              If  *UserData\AnchorB_Moving = #True
                *UserData\AnchorB\x = MouseX - *UserData\x
                *UserData\AnchorB\y = MouseY - *UserData\y
              EndIf
              If  *UserData\Moving = #True
                *UserData\AnchorA\x + MouseDeltaX
                *UserData\AnchorA\y + MouseDeltaY
                *UserData\AnchorB\x + MouseDeltaX
                *UserData\AnchorB\y + MouseDeltaY
              EndIf
              
            Case #WM_MOUSEWHEEL
            
            Case #WM_RBUTTONDOWN
            
            Case #WM_RBUTTONUP
      
          EndSelect
        
        EndIf
      EndIf
    EndIf
  Else
    If nCode >= 0
      
      If *CurrentArrow <> #Null
        hWndParent.l  = GetParent_(*CurrentArrow\hGdt)
        GetWindowInfo_(hWndParent, @WndInfo.WINDOWINFO)

        oldMouseX = MouseX : oldMouseY = MouseY
        MouseX.l = *MouseInfo\pt\x - WndInfo\rcClient\left
        MouseY.l = *MouseInfo\pt\y - WndInfo\rcClient\top
        MouseDeltaX = MouseX - oldMouseX : MouseDeltaY = MouseY - oldMouseY
      EndIf

      Select wParam
        
        Case #WM_LBUTTONUP
   
          If *CurrentArrow <> #Null
            *CurrentArrow\AnchorA_Moving = #False
            *CurrentArrow\AnchorB_Moving = #False
            *CurrentArrow\Moving = #False
            UpdateArrowGadget(*CurrentArrow\GadgetID)

            HideGadget(*CurrentArrow\GadgetID, 0)
            UpdateWindow_(hWndParent)
          EndIf
        
        Case #WM_MOUSEMOVE
          If *CurrentArrow <> #Null And (*CurrentArrow\Moving = #True Or *CurrentArrow\AnchorA_Moving = #True Or *CurrentArrow\AnchorB_Moving = #True)
            StartDrawing(WindowOutput(GetDlgCtrlID_(hWndParent)))
                DrawingMode(#PB_2DDrawing_Default)
                DrawImage(ImageID(*CurrentArrow\SnapImg), 0, 0)
                LineXY(*CurrentArrow\x + *CurrentArrow\AnchorA\x, *CurrentArrow\y + *CurrentArrow\AnchorA\y, *CurrentArrow\x + *CurrentArrow\AnchorB\x, *CurrentArrow\y + *CurrentArrow\AnchorB\y, 255)
                DrawingMode(#PB_2DDrawing_Transparent )
                DrawText(*CurrentArrow\x + *CurrentArrow\AnchorA\x, *CurrentArrow\y + *CurrentArrow\AnchorA\y, "FROM", 255)
                DrawText(*CurrentArrow\x + *CurrentArrow\AnchorB\x, *CurrentArrow\y + *CurrentArrow\AnchorB\y, "TO", 255)
                
              StopDrawing()

            If *CurrentArrow\AnchorA_Moving = #True
              *CurrentArrow\AnchorA\x = MouseX - *CurrentArrow\x
              *CurrentArrow\AnchorA\y = MouseY - *CurrentArrow\y
            EndIf
            If *CurrentArrow\AnchorB_Moving = #True
              *CurrentArrow\AnchorB\x = MouseX - *CurrentArrow\x
              *CurrentArrow\AnchorB\y = MouseY - *CurrentArrow\y
            EndIf
            If *CurrentArrow\Moving = #True
              *CurrentArrow\AnchorA\x + MouseDeltaX
                *CurrentArrow\AnchorA\y + MouseDeltaY
                *CurrentArrow\AnchorB\x + MouseDeltaX
                *CurrentArrow\AnchorB\y + MouseDeltaY
            EndIf
            
          EndIf
 
      EndSelect
    EndIf
  EndIf
  

  ProcedureReturn CallNextHookEx_(hMouseHook, nCode, wParam, lParam)

EndProcedure

Procedure.b UpdateArrowGadget(GadgetID.l)
  If IsGadget(GadgetID)
    *UserData.ArrowData = GetGadgetData(GadgetID)
    
    ; Redefine Sizes
    If *UserData\AnchorA\x < *UserData\AnchorB\x
      MinX = *UserData\AnchorA\x
      MaxX = *UserData\AnchorB\x
      newWidth  = Abs(MaxX - MinX) + *UserData\Size
      
      *UserData\x = *UserData\x + MinX - *UserData\Size / 2
      
      *UserData\AnchorA\x = *UserData\Size / 2
      *UserData\AnchorB\x = newWidth - *UserData\Size / 2
      
      *UserData\Width = newWidth
    Else
      MinX = *UserData\AnchorB\x
      MaxX = *UserData\AnchorA\x
      newWidth  = Abs(MaxX - MinX) + *UserData\Size
      
      *UserData\x = *UserData\x + MinX - *UserData\Size / 2
      
      *UserData\AnchorB\x = *UserData\Size / 2
      *UserData\AnchorA\x = newWidth - *UserData\Size / 2
      *UserData\Width = newWidth
    EndIf
    
    If *UserData\AnchorA\y < *UserData\AnchorB\y
      MinY = *UserData\AnchorA\y
      MaxY = *UserData\AnchorB\y
      newHeight = Abs(MaxY - MinY) + *UserData\Size
      
      *UserData\y = *UserData\y + MinY - *UserData\Size / 2
      
      *UserData\AnchorA\y = *UserData\Size / 2
      *UserData\AnchorB\y = newHeight - *UserData\Size / 2
      *UserData\Height = newHeight
    Else
      MinY = *UserData\AnchorB\y
      MaxY = *UserData\AnchorA\y
      newHeight = Abs(MaxY - MinY) + *UserData\Size
      
      *UserData\y = *UserData\y + MinY - *UserData\Size / 2
      
      *UserData\AnchorB\y = *UserData\Size / 2
      *UserData\AnchorA\y = newHeight - *UserData\Size / 2
      *UserData\Height = newHeight
    EndIf
    
    FreeImage(*UserData\ImageID)
    *UserData\ImageID = CreateImage(#PB_Any, *UserData\Width, *UserData\Height, 32)
    *UserData\hBmp = ImageID(*UserData\ImageID)
    
    StartDrawing(ImageOutput(*UserData\ImageID))
      
      Select *UserData\Type
        Case #ArrowType_Direct
          BorderColor    = RGBA(32, 32, 32, 255)
          GradientColor1 = RGB(230, 230, 250)
          GradientColor2 = RGB(128, 140, 128)
          GradientColor3 = RGB(75, 64, 64)
            
          DrawingMode(#PB_2DDrawing_Default)
            Box(0, 0, *UserData\Width, *UserData\Height, 0)
          
          DrawingMode(#PB_2DDrawing_Default)
            Box(0, 0, *UserData\Width, *UserData\Height, RGBA(0, 0, 0, 0))
            a.f = GetAngle(*UserData\AnchorA\x, *UserData\AnchorA\y, *UserData\AnchorB\x, *UserData\AnchorB\y)
            x1 = *UserData\AnchorA\x + Cos(a - #PI / 2) * *UserData\Size / 3
            y1 = *UserData\AnchorA\y + Sin(a - #PI / 2) * *UserData\Size / 3
            x2 = *UserData\AnchorB\x + Cos(a - #PI / 2) * *UserData\Size / 4
            y2 = *UserData\AnchorB\y + Sin(a - #PI / 2) * *UserData\Size / 4
            
            x3 = *UserData\AnchorA\x + Cos(a + #PI / 2) * *UserData\Size / 3
            y3 = *UserData\AnchorA\y + Sin(a + #PI / 2) * *UserData\Size / 3
            x4 = *UserData\AnchorB\x + Cos(a + #PI / 2) * *UserData\Size / 4
            y4 = *UserData\AnchorB\y + Sin(a + #PI / 2) * *UserData\Size / 4
            
            x5 = *UserData\AnchorB\x + Cos(a - #PI / 2) * *UserData\Size / 2
            y5 = *UserData\AnchorB\y + Sin(a - #PI / 2) * *UserData\Size / 2
            x6 = *UserData\AnchorB\x + Cos(a + #PI / 2) * *UserData\Size / 2
            y6 = *UserData\AnchorB\y + Sin(a + #PI / 2) * *UserData\Size / 2
            If *UserData\AnchorA\y > *UserData\AnchorB\y
              x7 = *UserData\AnchorB\x + Cos(a + #PI) * *UserData\Size / 2
              y7 = *UserData\AnchorB\y + Sin(a + #PI) * *UserData\Size / 2
            Else
              x7 = *UserData\AnchorB\x + Cos(a) * *UserData\Size / 2
              y7 = *UserData\AnchorB\y + Sin(a) * *UserData\Size / 2
            EndIf
            LineXY(x1, y1, x2, y2, BorderColor)
            LineXY(x3, y3, x4, y4, BorderColor)
            LineXY(x1, y1, x3, y3, BorderColor)
            LineXY(x2, y2, x5, y5, BorderColor)
            LineXY(x4, y4, x6, y6, BorderColor)
            LineXY(x5, y5, x7, y7, BorderColor)
            LineXY(x6, y6, x7, y7, BorderColor)
            
            FillArea(*UserData\Width / 2 , *UserData\Height / 2, -1, BorderColor)
          
          DrawingMode(#PB_2DDrawing_AlphaChannel)
            Box(0, 0, *UserData\Width, *UserData\Height, RGBA(0, 0, 0, 0))
            a.f = GetAngle(*UserData\AnchorA\x, *UserData\AnchorA\y, *UserData\AnchorB\x, *UserData\AnchorB\y)
            x1 = *UserData\AnchorA\x + Cos(a - #PI / 2) * *UserData\Size / 3
            y1 = *UserData\AnchorA\y + Sin(a - #PI / 2) * *UserData\Size / 3
            x2 = *UserData\AnchorB\x + Cos(a - #PI / 2) * *UserData\Size / 4
            y2 = *UserData\AnchorB\y + Sin(a - #PI / 2) * *UserData\Size / 4
            
            x3 = *UserData\AnchorA\x + Cos(a + #PI / 2) * *UserData\Size / 3
            y3 = *UserData\AnchorA\y + Sin(a + #PI / 2) * *UserData\Size / 3
            x4 = *UserData\AnchorB\x + Cos(a + #PI / 2) * *UserData\Size / 4
            y4 = *UserData\AnchorB\y + Sin(a + #PI / 2) * *UserData\Size / 4
            
            x5 = *UserData\AnchorB\x + Cos(a - #PI / 2) * *UserData\Size / 2
            y5 = *UserData\AnchorB\y + Sin(a - #PI / 2) * *UserData\Size / 2
            x6 = *UserData\AnchorB\x + Cos(a + #PI / 2) * *UserData\Size / 2
            y6 = *UserData\AnchorB\y + Sin(a + #PI / 2) * *UserData\Size / 2
            If *UserData\AnchorA\y > *UserData\AnchorB\y
              x7 = *UserData\AnchorB\x + Cos(a + #PI) * *UserData\Size / 2
              y7 = *UserData\AnchorB\y + Sin(a + #PI) * *UserData\Size / 2
            Else
              x7 = *UserData\AnchorB\x + Cos(a) * *UserData\Size / 2
              y7 = *UserData\AnchorB\y + Sin(a) * *UserData\Size / 2
            EndIf
            LineXY(x1, y1, x2, y2, BorderColor)
            LineXY(x3, y3, x4, y4, BorderColor)
            LineXY(x1, y1, x3, y3, BorderColor)
            LineXY(x2, y2, x5, y5, BorderColor)
            LineXY(x4, y4, x6, y6, BorderColor)
            LineXY(x5, y5, x7, y7, BorderColor)
            LineXY(x6, y6, x7, y7, BorderColor)
            
            FillArea(*UserData\Width / 2 , *UserData\Height / 2, -1, BorderColor)
          
          DrawingMode(#PB_2DDrawing_Gradient)
            LinearGradient(*UserData\AnchorA\x, *UserData\AnchorA\y, *UserData\AnchorB\x, *UserData\AnchorB\y)
            FrontColor(GradientColor1) : GradientColor(0.80, GradientColor2) : BackColor(GradientColor3)
            Box(0, 0, *UserData\Width, *UserData\Height)
            
          DrawingMode(#PB_2DDrawing_Default)
            a.f = GetAngle(*UserData\AnchorA\x, *UserData\AnchorA\y, *UserData\AnchorB\x, *UserData\AnchorB\y)
            x1 = *UserData\AnchorA\x + Cos(a - #PI / 2) * *UserData\Size / 3
            y1 = *UserData\AnchorA\y + Sin(a - #PI / 2) * *UserData\Size / 3
            x2 = *UserData\AnchorB\x + Cos(a - #PI / 2) * *UserData\Size / 4
            y2 = *UserData\AnchorB\y + Sin(a - #PI / 2) * *UserData\Size / 4
            
            x3 = *UserData\AnchorA\x + Cos(a + #PI / 2) * *UserData\Size / 3
            y3 = *UserData\AnchorA\y + Sin(a + #PI / 2) * *UserData\Size / 3
            x4 = *UserData\AnchorB\x + Cos(a + #PI / 2) * *UserData\Size / 4
            y4 = *UserData\AnchorB\y + Sin(a + #PI / 2) * *UserData\Size / 4
            
            x5 = *UserData\AnchorB\x + Cos(a - #PI / 2) * *UserData\Size / 2
            y5 = *UserData\AnchorB\y + Sin(a - #PI / 2) * *UserData\Size / 2
            x6 = *UserData\AnchorB\x + Cos(a + #PI / 2) * *UserData\Size / 2
            y6 = *UserData\AnchorB\y + Sin(a + #PI / 2) * *UserData\Size / 2
            If *UserData\AnchorA\y > *UserData\AnchorB\y
              x7 = *UserData\AnchorB\x + Cos(a + #PI) * *UserData\Size / 2
              y7 = *UserData\AnchorB\y + Sin(a + #PI) * *UserData\Size / 2
            Else
              x7 = *UserData\AnchorB\x + Cos(a) * *UserData\Size / 2
              y7 = *UserData\AnchorB\y + Sin(a) * *UserData\Size / 2
            EndIf
            LineXY(x1, y1, x2, y2, BorderColor)
            LineXY(x3, y3, x4, y4, BorderColor)
            LineXY(x1, y1, x3, y3, BorderColor)
            LineXY(x2, y2, x5, y5, BorderColor)
            LineXY(x4, y4, x6, y6, BorderColor)
            LineXY(x5, y5, x7, y7, BorderColor)
            LineXY(x6, y6, x7, y7, BorderColor)
          
      EndSelect
    StopDrawing()
    
    ResizeGadget(GadgetID, *UserData\x, *UserData\y, *UserData\Width, *UserData\Height)
    SetGadgetState(GadgetID, *UserData\hBmp)
    
  Else
    ProcedureReturn #False
  EndIf
  
  ProcedureReturn #True
EndProcedure

Procedure.l ArrowGadget(GadgetID.l, x.l, y.l, width.l, height.l, type.b = #ArrowType_Direct)
  
  *UserData.ArrowData = AllocateMemory(SizeOf(ArrowData))
  
  *UserData\IsArrow = #True
  *UserData\Type = #ArrowType_Direct
  *UserData\GadgetID = GadgetID
  
  *UserData\ImageID = CreateImage(#PB_Any, width, height, 32)
  *UserData\hBmp = ImageID(*UserData\ImageID)
  
  *UserData\Size = 64
  *UserData\x = x
  *UserData\y = y
  *UserData\Width = width
  *UserData\Height = height
  
  *UserData\AnchorA\x = *UserData\Size / 2
  *UserData\AnchorA\y = height / 2
  
  *UserData\AnchorB\x = Width - *UserData\Size / 2
  *UserData\AnchorB\y = height / 2

  Result.l = ImageGadget(GadgetID, x, y, width, height, *UserData\hBmp)
  
  If GadgetID = #PB_Any
    *UserData\hGdt = GadgetID(Result)
  Else
    *UserData\hGdt = GadgetID(GadgetID)
  EndIf
  
  SetGadgetData(*UserData\GadgetID, *UserData)
  
  UpdateArrowGadget(GadgetID)

  ProcedureReturn Result
EndProcedure

Procedure.l WindowCallback(hWnd.l, Msg.l, wParam.l, lParam.l)

  Result.l = #PB_ProcessPureBasicEvents
  
  Select Msg
    Case #WM_PAINT
      hBmp = ImageID(2)
      hDC = BeginPaint_(hWnd, @ps.PAINTSTRUCT)
     
        hDC2 = CreateCompatibleDC_(hDC)
       
          SelectObject_ (hDC2, hBmp)
          BitBlt_(hDC, 0, 0, WindowWidth(#WND_Main), WindowHeight(#WND_Main), hDC2, 0, 0, #SRCCOPY)
          ReleaseDC_(hWnd, hDC)
         
        DeleteDC_(hDC2)
      EndPaint_(hWnd, @ps)
      ProcedureReturn #True
      
    Result = #True
      
  EndSelect

  ProcedureReturn Result

EndProcedure

Procedure.f GetAngle(x1, y1, x2, y2)
  If y1 > y2
    tmp = y1
    y1 = y2
    y2 = tmp
    
    tmp = x1
    x1 = x2
    x2 = tmp
  EndIf
  x.f = x2 - x1
  y.f = y2 - y1
  n.f = Sqr(x * x + y * y)
  If n : x / n : EndIf
  ProcedureReturn ACos(x)
EndProcedure
D'un autre coté, ça m'a donné une idée, si tu arrivais par un moyen magique, je ne sais pas lequel, à faire une fleche super bien nette comme celle d'avant, qui peut etre droite ET en angle droit....bah je pourrais laisser tomber mes petites fleches bleue en PNG toutes "pourites" qui ne sont pas resizable...et donc bien moins jolies que les tiennes...
Comme ça je pourrais faire ça =====> ça <===== et aussi en verticale, et selon un procédé pouvoir si on le désire les "casser" en angle droit, pour pouvoir faire comme celle que tu m'avais faites.
C'est justement mon but, il y aura 3 type de fleche : #ArrowType_Direct = fleche direct comme actuelement, #ArrowType_Kneed = fleche coudée comme avant et #ArrowType_Rounded = fleche arrondie

Re: Rendre transparent une couleur dans une imagegadget

Publié : dim. 21/févr./2010 21:52
par kernadec
bonsoir Kcc , Cederavic

@Cederavic merci pour ce code, Vraiment trop fort.

@Kcc C'est noël pour toi aussi une deuxième fois...

Voila un truc diffèrent mais pour le fun.. celui-çi utilise le mode DrawRotatedText.
Et on a tous remarqué que tu aime Fantaisie Software, alors ça devrait te plaire…

j’ai mis l’adresse du site pour télécharger les fontes freeware en début du code

Avec ce mode, on peut zoomer(roulette), déplacer faire une rotation drawtext de façon indépendante grâce aux clics sur les boutons.
Il faudra mieux un listicongadget pour régler les interférences des clics buttongadget avec les drawtexts.

Bonne Soirée et merci.

Code : Tout sélectionner

; #####################################################
;     kernadec en janvier 2010 PB441(DrawRotatedText)##
;     sur l'idée de fleche du projet KCC             ##
;     flèche avec fontes zoom molette                ##
;     deplacement clic gauche, rotation clic droit   ##
; #####################################################
; ####      Destination "c:\windows\fonts"        ####
;http://www.fontfreak.com/charactermaps/s/Squareheads.htm
;http://www.fontfreak.com/charactermaps/p/Pointers.htm
;http://www.fontfreak.com/charactermaps/h/Hots.htm
;http://www.fontfreak.com/charactermaps/t/ToonsOne.htm
;http://www.fontfreak.com/charactermaps/f/Fred.htm
#WM_MOUSEWHEEL = $20A 
Enumeration
#Fenetre
#Image_0
#Image_1
#Image_2
#StringGadget_1
#ImageGadget
#ImageGadget_2
#boutonGadget_0
#boutonGadget_1
#boutonGadget_2
#boutonGadget_3
#boutonGadget_4
EndEnumeration
Structure tx
 x0.l:y0.l:taille.d:ft.l:Angle.l
EndStructure 
Global Dim pos.tx(4) 
Global dc.l,epais.l,fleche.l,px.l,bm.l,fl.l,fonte$
winl.l=800
winh.l=600
Posx.l=0
Posy.l=0
Posl.l=300
Posh.l=300
epais=5
Px=30

fonte$="FRED"           ;??
;fonte$="POINTERS"      ;fleche
;fonte$="Squareheads"   ; caricature
;fonte$="toons One"     ; caricature2
;fonte$="HOTS"          ;pin up

Procedure.w MouseWheelDelta() 
			z.w=((EventwParam()>>16)&$FFFF) 
			ProcedureReturn -(z/100) 
EndProcedure 
Procedure Ligne(x,y,x1,y1,Width,color) 
pen=CreatePen_(#PS_SOLID,Width,color) 
penOld=SelectObject_(DC,pen) 
MoveToEx_(DC,x,y,0):LineTo_(DC,x1,y1) 
DeleteObject_(pen) 
DeleteObject_(penOld) 
EndProcedure 
Procedure dessin(Posx,Posy,Posl,Posh) 
Static MemTypeFleche
	dc=StartDrawing(ImageOutput(#Image_1))
	 DrawImage(ImageID(#Image_2),0,0,ImageWidth(#Image_2),ImageHeight(#Image_2)) 
   DrawingMode(1)
   DrawingFont(FontID(0))
   DrawRotatedText(Pos(0)\x0,Pos(0)\y0,Chr(66),Pos(0)\Angle,RGB(0,0,255))
   DrawingFont(FontID(1))
   DrawRotatedText(Pos(1)\x0,Pos(1)\y0,Chr(67),Pos(1)\Angle,RGB(100,200,100))
   DrawingFont(FontID(2))
   DrawRotatedText(Pos(2)\x0,Pos(2)\y0,Chr(70),Pos(2)\Angle,RGB(255,0,255))
   DrawingFont(FontID(3))
   DrawRotatedText(Pos(3)\x0,Pos(3)\y0,Chr(71),Pos(3)\Angle,RGB(205,205,0))
   StopDrawing()
   LoadFont(Pos(fl)\ft,fonte$, Pos(fl)\taille,#PB_Font_Bold)
   DisableGadget(#ImageGadget,1)
   SetGadgetState(#ImageGadget,ImageID(#Image_1))     
EndProcedure

Pos(0)\ft=0:Pos(0)\x0=10:Pos(0)\y0=10:Pos(0)\taille=40
Pos(1)\ft=1:Pos(1)\x0=10:Pos(1)\y0=10:Pos(1)\taille=60
Pos(2)\ft=2:Pos(2)\x0=10:Pos(2)\y0=10:Pos(2)\taille=80
Pos(3)\ft=3:Pos(3)\x0=10:Pos(3)\y0=10:Pos(3)\taille=100
LoadFont(Pos(0)\ft,fonte$,Pos(0)\taille,#PB_Font_Bold)
LoadFont(Pos(1)\ft,fonte$,Pos(1)\taille,#PB_Font_Bold)
LoadFont(Pos(2)\ft,fonte$,Pos(2)\taille,#PB_Font_Bold)
LoadFont(Pos(3)\ft,fonte$,Pos(3)\taille,#PB_Font_Bold)

hwnd.l=OpenWindow(#Fenetre, 0, 0,winl,winh, "Fleche fonte",#WS_SYSMENU|#PB_Window_ScreenCentered)
					CreateImage(#Image_0,winl,winh)
					CreateImage(#Image_1,winl,winh)
					CreateImage(#Image_2,winl-6,winh-32)
				StartDrawing(ImageOutput(#Image_0))
					Box(0,0,winl,winh,RGB(225,225,225))
				StopDrawing()
					ImageGadget(#ImageGadget,Posx,Posy,200,200,ImageID(#Image_0))
				SetGadgetState(#ImageGadget,ImageID(#Image_0))
				ButtonGadget(#boutonGadget_0, 120,80, 50, 30, "B0" )
				ButtonGadget(#boutonGadget_1, 440,180, 50, 30, "B1" )
				ButtonGadget(#boutonGadget_2, 240,390, 50, 30, "B2" )
				ButtonGadget(#boutonGadget_3, 620,290, 50, 30, "B3" )
		DC=StartDrawing(ImageOutput(#Image_2))
				For i=1 To 50:WindowEvent():Next i  ; boucle de dessin des boutons sur la fenetre avant screenshot
			  BitBlt_(DC,0,0,ImageWidth(#Image_2),ImageHeight(#Image_2),GetDC_(hwnd),0,0,#SRCCOPY)
			StopDrawing()
				dessin(Pos(fl)\x0,Pos(fl)\y0,Posl,Posh)
				bm=#False
				
Repeat
event =WaitWindowEvent()
			Select Event
						Case #PB_Event_Gadget 
						Select EventGadget() 
									Case #boutonGadget_0
									Debug "B0"
									fl=0
									SetCursorPos_(Pos(0)\x0+WindowX(#Fenetre),Pos(0)\y0+WindowY(#Fenetre))
								;	Delay(2)
									RedrawWindow_(WindowID(#Fenetre), 0, 0, #RDW_INVALIDATE|#RDW_UPDATENOW)
									Case #boutonGadget_1
									Debug "B1"
									fl=1
									SetCursorPos_(Pos(1)\x0+WindowX(#Fenetre),Pos(1)\y0+WindowY(#Fenetre))
									;Delay(2)
									RedrawWindow_(WindowID(#Fenetre), 0, 0, #RDW_INVALIDATE|#RDW_UPDATENOW)
									Case #boutonGadget_2
									Debug "B2"
									fl=2
									SetCursorPos_(Pos(2)\x0+WindowX(#Fenetre),Pos(2)\y0+WindowY(#Fenetre))
								;	Delay(2)
									RedrawWindow_(WindowID(#Fenetre), 0, 0, #RDW_INVALIDATE|#RDW_UPDATENOW)
									Case #boutonGadget_3
									Debug "B3"
									fl=3
									SetCursorPos_(Pos(3)\x0+WindowX(#Fenetre),Pos(3)\y0+WindowY(#Fenetre))
								;Delay(2)
									RedrawWindow_(WindowID(#Fenetre), 0, 0, #RDW_INVALIDATE|#RDW_UPDATENOW)
						EndSelect
								Case #PB_Event_CloseWindow
									Quit = #True  
						EndSelect
						LoadFont(Pos(fl)\ft,fonte$, Pos(fl)\taille,#PB_Font_Bold)
						If event=#WM_MOUSEWHEEL 
						Pos(fl)\taille=Pos(fl)\taille+MouseWheelDelta()*2
						LoadFont(Pos(fl)\ft,fonte$, Pos(fl)\taille,#PB_Font_Bold)
						dessin(Pos(fl)\x0,Pos(fl)\y0,Posl,Posh)
						EndIf
						If event=#WM_RBUTTONUP 
						bm=#False
						EndIf
						If event=#WM_LBUTTONUP  
						bm=#False
						EndIf
						If event=#WM_LBUTTONDOWN
						bm=#True
						 Posx1 = WindowMouseX(0)-Posx
						 Posy1 = WindowMouseY(0)-Posy
						EndIf
						If event=#WM_RBUTTONDOWN
						 Pos(fl)\Angle=Pos(fl)\Angle+90
						 Pos(fl)\Angle=Pos(fl)\Angle%360
						 dessin(Pos(fl)\x0,Pos(fl)\y0,Posl,Posh)
						If Pos(fl)\Angle=90:Pos(fl)\y0=Pos(fl)\y0+Pos(fl)\taille:EndIf
						If Pos(fl)\Angle=180:Pos(fl)\x0=Pos(fl)\x0+Pos(fl)\taille:Pos(fl)\y0=Pos(fl)\y0:EndIf
						If Pos(fl)\Angle=270:Pos(fl)\x0=Pos(fl)\x0:Pos(fl)\y0=Pos(fl)\y0-Pos(fl)\taille:EndIf
						If Pos(fl)\Angle=0:Pos(fl)\x0=Pos(fl)\x0-Pos(fl)\taille:Pos(fl)\y0=Pos(fl)\y0:EndIf
						dessin(Pos(fl)\x0,Pos(fl)\y0,Posl,Posh)
						Debug Pos(fl)\x0
						Debug Pos(fl)\y0
						Debug Pos(fl)\Angle
						bm=#True
						Posl1 = WindowMouseX(0)-Posl
						Posh1 = WindowMouseY(0)-Posh
						EndIf
						If event=#WM_MOUSEMOVE
						If bm=#True
						If GetAsyncKeyState_(#VK_LBUTTON)
						  If Pos(fl)\Angle=0:centrex.l=Pos(fl)\taille/2:centrey.l=Pos(fl)\taille/2:EndIf
						  If Pos(fl)\Angle=90:centrex.l=Pos(fl)\taille/2:centrey.l=-Pos(fl)\taille/2:EndIf
						  If Pos(fl)\Angle=180:centrex.l=-Pos(fl)\taille/2:centrey.l=-Pos(fl)\taille/2:EndIf
						  If Pos(fl)\Angle=270:centrex.l=-Pos(fl)\taille/2:centrey.l=Pos(fl)\taille/2:EndIf
						  Pos(fl)\x0=WindowMouseX(0)-centrex;-Posx1
						  Pos(fl)\y0=WindowMouseY(0)-centrey;-Posy1
							dessin(Pos(fl)\x0,Pos(fl)\y0,Posl,Posh)
						EndIf 
						EndIf 
						If GetAsyncKeyState_(#VK_RBUTTON) 
							Posl=WindowMouseX(0)-Posl1
							Posh=WindowMouseY(0)-Posh1
						;	dessin(Posx,Posy,Posl,Posh)
						EndIf
						EndIf
Until Quit = #True

Re: Rendre transparent une couleur dans une imagegadget

Publié : lun. 22/févr./2010 10:26
par Kwai chang caine
140 000 à 270 000 sont les chiffres estimatifs du nombre de mots que contiendrait la langue française

Et sans deconner...je sais...ça m'arrive pas souvent :oops:
Je reste sans voix....
J'en trouve pas un pour qualifier, premierement votre générosité, secondement votre competence 8)

Cela me touche d'autant plus que je suis désespéré de ne pas arriver a terminier ce Xieme programme, qui etait censé m'aider a terminer les autres, tout ça pour une histoire finale de fleche transparente :(

J'suis pourtant a deux metres du bol de sangria....
Enfin ....on va dire de ce que je desirais avoir.

Mais la, je sais pas si c'est les jeux olympiques qui vous motivent, mais vous etes en train de transformer mon biplan a helice, en rafale 8)

@CEDERAVIC
Deja je me serais jamais permis de dire que ta fleche elle est moche :?

Mais bon celle d'avant etait tellement belle, que quand j'ai vu cette "sucette", j'ai juste eu peur que tu abandonne l'ancienne, que j'avais adoptée et dont j'etais deja amoureux, pour me la remplacer par cette "confiserie" certe appetissante...mais j'suis au regime en ce moment :lol:

A part ça...comme je l'ai dit au dessus...y'a pas de mots
C'est rangé religieusement, pointeurs memoire, structure...militairement.
Ca donne envie de s'appeller CEDERAVIC quoi 8)

Quand au rendu...alors la on est carrément dans les giciels de dessins vectoriels.
J'ai meme été vérifié si c'etait toujours un ImageGadget qui pouvait faire ça...
J'ai cru que c'etait tout en dessin....

C'est tellement fort que ça va faire comme quand ma maman elle me faisait un joli arbre au milieu de mon dessin quand j'avais 5 ans.
Et que la prof me punissait car elle disait, qu'on devait faire le dessin tout seul :?
J'me rappelle...j'me disait mais comment elle sait la prof que l'arbre c'est pas moi qui "l'a fait" ???? 8O

@KERNADEC
Tout pareil, mille merci
T'as raison, c'est NOEL 8O
Cool..que dis je, genial cette fonction que tu apportes a mon "Daubiciel" 8)
Je vais essayer de la rajouter, ça peut etre drolement utile de mettre un caractere comme tu l'as fait

@Tous les deux
En tout cas vos codes y vont pas etre de la fete, j'espere qu'ils ont rien contre les SDF, quand y vont se retrouver a coté des miens tout "pourites"

Je vais essayer de finir d'incorporer l'ancien code de SOLDAT, car si j'ai bien compris le nouveau est pas tout a fait terminé.
Et aussi celui de KERNADEC

Excelente journée à vous deux

Re: Rendre transparent une couleur dans une imagegadget

Publié : lun. 22/févr./2010 13:30
par kernadec
Bonjour Kcc
Merci, Pour le fun je pensais que tu aller voir le clin d'oeil de fantaisie ..
chez Fontfreak.com, il y a une fonte Fred..... hihihihi

cordialement

Re: Rendre transparent une couleur dans une imagegadget

Publié : lun. 22/févr./2010 14:26
par Kwai chang caine
Bah j'ai cru que c'etait des polices un peu comme les autres...
Et comme je me suis jeté sur l'adaptation, j'ai pas été voir de suite

Mais des que tu me l'a dit, j'suis allé voir..
Un truc de guedin.... toutes ces polices elles sont a FREAK ??? 8O

Y'en a tellement....en tout cas j'en ai adoré une...geniale..
C'est une ou y'a une fifille 8O
Trop cool, j'y aurais meme pas penser...on pourrait faire un truc de guedin avec ça..

Meme pas j'essaye d'y penser..car ça va donner lieu a une 34e appli non terminée. :oops:
Mais imagine...tu pose une question et hop la "zessegon" elle s'excute :mrgreen:

On pourrait l'appeler zessegon
- Zessegon danse et hop devant nos yeux ebahis..elle fait un pas de deux
- Zessegon tourne et hop elle fait un trou dans le plancher...
- Zessegon leve la jambe.....

J'arrette...DOBRO y va etre obligé de mettre des Biiiiip a la place de mon ecriture :oops:

Ca me fait encore penser a un CD que j'avais eu...un truc avec une tres grande actrice, la grande classe...
c'est pas michelle morgan...

ni catherine deneuve...

ni sophie marceau...

attend je reflechi ............. :roll:

Ahhh j'me rappelle c'est julia channel :mrgreen:

Image

Tu lui ecrivais...tourne toi et hop...elle se tournait
Comment tu t'appelles et elle repondait
Peut tu me faire une....."camomillle"....et hop elle le faisait..

Et une pro...parce qu'elle avait toujours le sourire..
Et tout le monde le sait..la camomille ..avec le sourire..c'est pas toujours evident :?

Super pas contrariante la fille...enfin la femme parfaite, a coté une asiatique, c'est une militante du MLF :roll:
Rien a voir avec la mienne ou j'suis obligé de m'y prendre 15 jours a l'avance pour lui demander une vraie camomille :?

Qu'est ce qu'on a pu se marrer avec ce CD...tout le monde il avait noir de choses a lui demander :lol:
Dans ces cas l'imagination de la gente masculine n'a pas de limite decentes :mrgreen:

Enfin..quand on est seul devant un PC..on s'amuse comme on peut :oops:

PS...ça me fait penser a "aute" chose...
Julia elle supportait pas les "fotes dortografe".....
Car si elle comprenait pas elle te regardait comme un poisson pané qui a trainé au fond du frigo 15 jours 8O
Avec guerrier001 elle se serait pas fait de retour de reins :lol:

Ca aurait été un super apprentissage pour nos enfants...une version fille et garçon.
Et hop ....j'suis sur que nos chers bambins y connaitraient tous les mots de la langue française en 2 jours

Re: Rendre transparent une couleur dans une imagegadget

Publié : mer. 24/févr./2010 11:53
par cederavic
Sympa ton code avec les Font Kernadec, fallait y penser :)

KCC, je suis désolé mais je pense que je ne pourais pas finir ce que je voulais faire avant que tu n'ai fini toi même ton logiciel :roll: (je me suis engager à faire un logiciel de gestion devis / factures / clients pour mon patron).
Mais je t'ai tout de même fait une proc pour dessiner des fleches "directes" et "coudée", j'essaierais de te faire les "arrondies" aussi :

Code : Tout sélectionner



Enumeration
  #ArrowType_Direct
  #ArrowType_Kneed
  #ArrowType_Rounded
EndEnumeration

Enumeration
  #Way_WestToSouth
  #Way_EastToSouth
  #Way_WestToNorth
  #Way_EastToNorth
  #Way_SouthToEast
  #Way_SouthToWest
  #Way_NorthToEast
  #Way_NorthToWest
EndEnumeration

Declare.l DrawArrow(width.l, height.l, ax1.l, ay1.l, ax2.l, ay2.l, size.l, type.b, way.b = #Null)
Declare.f GetAngle(x1, y1, x2, y2)

OpenWindow(0, 0, 0, 800, 600, "DrawArrow", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  ; Fleche directe
  CreateImage(0, 200, 200, 32)
  StartDrawing(ImageOutput(0))
    DrawArrow(200, 200, 20, 20, 180, 180, 20, #ArrowType_Direct)
  StopDrawing()
  
  CreateImage(1, 200, 200, 32)
  StartDrawing(ImageOutput(1))
    DrawArrow(200, 200, 160, 20, 40, 100, 20, #ArrowType_Direct)
  StopDrawing()
  
  CreateImage(2, 200, 200, 32)
  StartDrawing(ImageOutput(2))
    DrawArrow(200, 200, 100, 180, 120, 30, 20, #ArrowType_Direct)
  StopDrawing()
  
  CreateImage(3, 200, 200, 32)
  StartDrawing(ImageOutput(3))
    DrawArrow(200, 200, 180, 180, 80, 80, 20, #ArrowType_Direct)
  StopDrawing()
  
  ImageGadget(0, 0, 0, 200, 200, ImageID(0))
  ImageGadget(1, 200, 0, 200, 200, ImageID(1))
  ImageGadget(2, 400, 0, 200, 200, ImageID(2))
  ImageGadget(3, 600, 0, 200, 200, ImageID(3))
  
  ; Fleche coudee
  CreateImage(4, 100, 100, 32)
  StartDrawing(ImageOutput(4))
    DrawArrow(100, 100, 20, 20, 80, 80, 20, #ArrowType_Kneed, #Way_WestToSouth)
  StopDrawing()
  
  CreateImage(5, 100, 100, 32)
  StartDrawing(ImageOutput(5))
    DrawArrow(100, 100, 80, 20, 20, 80, 20, #ArrowType_Kneed, #Way_EastToSouth)
  StopDrawing()
  
  CreateImage(6, 100, 100, 32)
  StartDrawing(ImageOutput(6))
    DrawArrow(100, 100, 80, 80, 20, 20, 20, #ArrowType_Kneed, #Way_EastToNorth)
  StopDrawing()
  
  CreateImage(7, 100, 100, 32)
  StartDrawing(ImageOutput(7))
    DrawArrow(100, 100, 20, 80, 80, 20, 20, #ArrowType_Kneed, #Way_WestToNorth)
  StopDrawing()
  
  CreateImage(8, 100, 100, 32)
  StartDrawing(ImageOutput(8))
    DrawArrow(100, 100, 20, 80, 80, 20, 20, #ArrowType_Kneed, #Way_SouthToEast)
  StopDrawing()
  
  CreateImage(9, 100, 100, 32)
  StartDrawing(ImageOutput(9))
    DrawArrow(100, 100, 80, 80, 20, 20, 20, #ArrowType_Kneed, #Way_SouthToWest)
  StopDrawing()
  
  CreateImage(10, 100, 100, 32)
  StartDrawing(ImageOutput(10))
    DrawArrow(100, 100, 20, 20, 80, 80, 20, #ArrowType_Kneed, #Way_NorthToEast)
  StopDrawing()
  
  CreateImage(11, 100, 100, 32)
  StartDrawing(ImageOutput(11))
    DrawArrow(100, 100, 80, 20, 20, 80, 20, #ArrowType_Kneed, #Way_NorthToWest)
  StopDrawing()

  ImageGadget(4, 0, 200, 100, 100, ImageID(4))
  ImageGadget(5, 100, 200, 100, 100, ImageID(5))
  ImageGadget(6, 200, 200, 100, 100, ImageID(6))
  ImageGadget(7, 300, 200, 100, 100, ImageID(7))
  ImageGadget(8, 400, 200, 100, 100, ImageID(8))
  ImageGadget(9, 500, 200, 100, 100, ImageID(9))
  ImageGadget(10, 600, 200, 100, 100, ImageID(10))
  ImageGadget(11, 700, 200, 100, 100, ImageID(11))

Repeat
  
  Select WaitWindowEvent(2)
  
    Case #WM_CLOSE
      Quit = #True
  
  EndSelect

Until Quit = #True
End

Procedure.l DrawArrow(width.l, height.l, ax1.l, ay1.l, ax2.l, ay2.l, size.l, type.b, way.b = #Null)
  BorderColor    = RGBA(32, 32, 32, 255)
  GradientColor1 = RGB(230, 230, 250)
  GradientColor2 = RGB(128, 140, 128)
  GradientColor3 = RGB(75, 64, 64)
  
  Select type
    Case #ArrowType_Kneed
      DrawingMode(#PB_2DDrawing_Default)
        Box(0, 0, width, height, 0)
        
        Select Way
        
          Case #Way_WestToSouth
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 - size / 2, ay1 - size / 2, ax2 + size / 3, ay1 - size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax2 - size / 3, ay1 + size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 - size / 2, ax1 - size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax2 + size / 3, ay1 - size / 3, ax2 + size / 4, ay2, BorderColor)
              LineXY(ax2 - size / 3, ay1 + size / 3, ax2 - size / 4, ay2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2, ax2 + size / 2, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2, ax2 - size / 2, ay2, BorderColor)
              
              LineXY(ax2 + size / 2, ay2, ax2, ay2 + size / 2, BorderColor)
              LineXY(ax2 - size / 2, ay2, ax2, ay2 + size / 2, BorderColor) 
              
              FillArea(ax1, ay1, -1, BorderColor)
            
            DrawingMode(#PB_2DDrawing_AlphaChannel)
              Box(0, 0, width, height, RGBA(0, 0, 0, 0))
              LineXY(ax1 - size / 2, ay1 - size / 2, ax2 + size / 3, ay1 - size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax2 - size / 3, ay1 + size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 - size / 2, ax1 - size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax2 + size / 3, ay1 - size / 3, ax2 + size / 4, ay2, BorderColor)
              LineXY(ax2 - size / 3, ay1 + size / 3, ax2 - size / 4, ay2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2, ax2 + size / 2, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2, ax2 - size / 2, ay2, BorderColor)
              
              LineXY(ax2 + size / 2, ay2, ax2, ay2 + size / 2, BorderColor)
              LineXY(ax2 - size / 2, ay2, ax2, ay2 + size / 2, BorderColor) 
              
              FillArea(ax1, ay1, -1, BorderColor)
              
            DrawingMode(#PB_2DDrawing_Gradient)
              LinearGradient(ax1, ay1, ax2, ay2)
              FrontColor(GradientColor1) : GradientColor(0.80, GradientColor2) : BackColor(GradientColor3)
              Box(0, 0, width, height)
            
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 - size / 2, ay1 - size / 2, ax2 + size / 3, ay1 - size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax2 - size / 3, ay1 + size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 - size / 2, ax1 - size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax2 + size / 3, ay1 - size / 3, ax2 + size / 4, ay2, BorderColor)
              LineXY(ax2 - size / 3, ay1 + size / 3, ax2 - size / 4, ay2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2, ax2 + size / 2, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2, ax2 - size / 2, ay2, BorderColor)
              
              LineXY(ax2 + size / 2, ay2, ax2, ay2 + size / 2, BorderColor)
              LineXY(ax2 - size / 2, ay2, ax2, ay2 + size / 2, BorderColor) 
            
          
          Case #Way_EastToSouth
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 + size / 2, ay1 - size / 2, ax2 - size / 3, ay1 - size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 + size / 2, ax2 + size / 3, ay1 + size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 - size / 2, ax1 + size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax2 - size / 3, ay1 - size / 3, ax2 - size / 4, ay2, BorderColor)
              LineXY(ax2 + size / 3, ay1 + size / 3, ax2 + size / 4, ay2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2, ax2 + size / 2, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2, ax2 - size / 2, ay2, BorderColor)
              
              LineXY(ax2 + size / 2, ay2, ax2, ay2 + size / 2, BorderColor)
              LineXY(ax2 - size / 2, ay2, ax2, ay2 + size / 2, BorderColor) 
              
              FillArea(ax2, ay2, -1, BorderColor)
            
            DrawingMode(#PB_2DDrawing_AlphaChannel)
              Box(0, 0, width, height, RGBA(0, 0, 0, 0))
              LineXY(ax1 + size / 2, ay1 - size / 2, ax2 - size / 3, ay1 - size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 + size / 2, ax2 + size / 3, ay1 + size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 - size / 2, ax1 + size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax2 - size / 3, ay1 - size / 3, ax2 - size / 4, ay2, BorderColor)
              LineXY(ax2 + size / 3, ay1 + size / 3, ax2 + size / 4, ay2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2, ax2 + size / 2, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2, ax2 - size / 2, ay2, BorderColor)
              
              LineXY(ax2 + size / 2, ay2, ax2, ay2 + size / 2, BorderColor)
              LineXY(ax2 - size / 2, ay2, ax2, ay2 + size / 2, BorderColor) 
              
              FillArea(ax2, ay2, -1, BorderColor)
              
            DrawingMode(#PB_2DDrawing_Gradient)
              LinearGradient(ax1, ay1, ax2, ay2)
              FrontColor(GradientColor1) : GradientColor(0.80, GradientColor2) : BackColor(GradientColor3)
              Box(0, 0, width, height)
            
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 + size / 2, ay1 - size / 2, ax2 - size / 3, ay1 - size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 + size / 2, ax2 + size / 3, ay1 + size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 - size / 2, ax1 + size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax2 - size / 3, ay1 - size / 3, ax2 - size / 4, ay2, BorderColor)
              LineXY(ax2 + size / 3, ay1 + size / 3, ax2 + size / 4, ay2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2, ax2 + size / 2, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2, ax2 - size / 2, ay2, BorderColor)
              
              LineXY(ax2 + size / 2, ay2, ax2, ay2 + size / 2, BorderColor)
              LineXY(ax2 - size / 2, ay2, ax2, ay2 + size / 2, BorderColor) 
          
          Case #Way_WestToNorth
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 - size / 2, ay1 - size / 2, ax2 - size / 3, ay1 - size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax2 + size / 3, ay1 + size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 - size / 2, ax1 - size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax2 - size / 3, ay1 - size / 3, ax2 - size / 4, ay2, BorderColor)
              LineXY(ax2 + size / 3, ay1 + size / 3, ax2 + size / 4, ay2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2, ax2 + size / 2, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2, ax2 - size / 2, ay2, BorderColor)
              
              LineXY(ax2 + size / 2, ay2, ax2, ay2 - size / 2, BorderColor)
              LineXY(ax2 - size / 2, ay2, ax2, ay2 - size / 2, BorderColor) 
              
              FillArea(ax2, ay2, -1, BorderColor)
            
            DrawingMode(#PB_2DDrawing_AlphaChannel)
              Box(0, 0, width, height, RGBA(0, 0, 0, 0))
              LineXY(ax1 - size / 2, ay1 - size / 2, ax2 - size / 3, ay1 - size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax2 + size / 3, ay1 + size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 - size / 2, ax1 - size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax2 - size / 3, ay1 - size / 3, ax2 - size / 4, ay2, BorderColor)
              LineXY(ax2 + size / 3, ay1 + size / 3, ax2 + size / 4, ay2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2, ax2 + size / 2, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2, ax2 - size / 2, ay2, BorderColor)
              
              LineXY(ax2 + size / 2, ay2, ax2, ay2 - size / 2, BorderColor)
              LineXY(ax2 - size / 2, ay2, ax2, ay2 - size / 2, BorderColor) 
              
              FillArea(ax2, ay2, -1, BorderColor)
              
            DrawingMode(#PB_2DDrawing_Gradient)
              LinearGradient(ax1, ay1, ax2, ay2)
              FrontColor(GradientColor1) : GradientColor(0.80, GradientColor2) : BackColor(GradientColor3)
              Box(0, 0, width, height)
            
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 - size / 2, ay1 - size / 2, ax2 - size / 3, ay1 - size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax2 + size / 3, ay1 + size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 - size / 2, ax1 - size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax2 - size / 3, ay1 - size / 3, ax2 - size / 4, ay2, BorderColor)
              LineXY(ax2 + size / 3, ay1 + size / 3, ax2 + size / 4, ay2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2, ax2 + size / 2, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2, ax2 - size / 2, ay2, BorderColor)
              
              LineXY(ax2 + size / 2, ay2, ax2, ay2 - size / 2, BorderColor)
              LineXY(ax2 - size / 2, ay2, ax2, ay2 - size / 2, BorderColor) 
              
          Case #Way_EastToNorth
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 + size / 2, ay1 - size / 2, ax2 + size / 3, ay1 - size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 + size / 2, ax2 - size / 3, ay1 + size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 - size / 2, ax1 + size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax2 + size / 3, ay1 - size / 3, ax2 + size / 4, ay2, BorderColor)
              LineXY(ax2 - size / 3, ay1 + size / 3, ax2 - size / 4, ay2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2, ax2 + size / 2, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2, ax2 - size / 2, ay2, BorderColor)
              
              LineXY(ax2 + size / 2, ay2, ax2, ay2 - size / 2, BorderColor)
              LineXY(ax2 - size / 2, ay2, ax2, ay2 - size / 2, BorderColor) 
              
              FillArea(ax2, ay2, -1, BorderColor)
            
            DrawingMode(#PB_2DDrawing_AlphaChannel)
              Box(0, 0, width, height, RGBA(0, 0, 0, 0))
              LineXY(ax1 + size / 2, ay1 - size / 2, ax2 + size / 3, ay1 - size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 + size / 2, ax2 - size / 3, ay1 + size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 - size / 2, ax1 + size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax2 + size / 3, ay1 - size / 3, ax2 + size / 4, ay2, BorderColor)
              LineXY(ax2 - size / 3, ay1 + size / 3, ax2 - size / 4, ay2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2, ax2 + size / 2, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2, ax2 - size / 2, ay2, BorderColor)
              
              LineXY(ax2 + size / 2, ay2, ax2, ay2 - size / 2, BorderColor)
              LineXY(ax2 - size / 2, ay2, ax2, ay2 - size / 2, BorderColor) 
              
              FillArea(ax2, ay2, -1, BorderColor)
              
            DrawingMode(#PB_2DDrawing_Gradient)
              LinearGradient(ax1, ay1, ax2, ay2)
              FrontColor(GradientColor1) : GradientColor(0.80, GradientColor2) : BackColor(GradientColor3)
              Box(0, 0, width, height)
            
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 + size / 2, ay1 - size / 2, ax2 + size / 3, ay1 - size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 + size / 2, ax2 - size / 3, ay1 + size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 - size / 2, ax1 + size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax2 + size / 3, ay1 - size / 3, ax2 + size / 4, ay2, BorderColor)
              LineXY(ax2 - size / 3, ay1 + size / 3, ax2 - size / 4, ay2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2, ax2 + size / 2, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2, ax2 - size / 2, ay2, BorderColor)
              
              LineXY(ax2 + size / 2, ay2, ax2, ay2 - size / 2, BorderColor)
              LineXY(ax2 - size / 2, ay2, ax2, ay2 - size / 2, BorderColor) 
          
          Case #Way_SouthToEast
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax1 - size / 3, ay2 - size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 + size / 2, ax1 + size / 3, ay2 + size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax1 + size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax1 - size / 3, ay2 - size / 3, ax2 - size / 4, ay2 - size / 4, BorderColor)
              LineXY(ax1 + size / 3, ay2 + size / 3, ax2 - size / 4, ay2 + size / 4, BorderColor)
              
              LineXY(ax2 - size / 4, ay2 - size / 4, ax2 - size / 4, ay2 - size / 2, BorderColor)
              LineXY(ax2 - size / 4, ay2 + size / 4, ax2 - size / 4, ay2 + size / 2, BorderColor)
              
              LineXY(ax2 - size / 4, ay2 - size / 2, ax2 + size / 4, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2 + size / 2, ax2 + size / 4, ay2, BorderColor) 
              
              FillArea(ax2, ay2, -1, BorderColor)
            
            DrawingMode(#PB_2DDrawing_AlphaChannel)
              Box(0, 0, width, height, RGBA(0, 0, 0, 0))
              LineXY(ax1 - size / 2, ay1 + size / 2, ax1 - size / 3, ay2 - size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 + size / 2, ax1 + size / 3, ay2 + size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax1 + size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax1 - size / 3, ay2 - size / 3, ax2 - size / 4, ay2 - size / 4, BorderColor)
              LineXY(ax1 + size / 3, ay2 + size / 3, ax2 - size / 4, ay2 + size / 4, BorderColor)
              
              LineXY(ax2 - size / 4, ay2 - size / 4, ax2 - size / 4, ay2 - size / 2, BorderColor)
              LineXY(ax2 - size / 4, ay2 + size / 4, ax2 - size / 4, ay2 + size / 2, BorderColor)
              
              LineXY(ax2 - size / 4, ay2 - size / 2, ax2 + size / 4, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2 + size / 2, ax2 + size / 4, ay2, BorderColor) 
              
              FillArea(ax2, ay2, -1, BorderColor)
              
            DrawingMode(#PB_2DDrawing_Gradient)
              LinearGradient(ax1, ay1, ax2, ay2)
              FrontColor(GradientColor1) : GradientColor(0.80, GradientColor2) : BackColor(GradientColor3)
              Box(0, 0, width, height)
            
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax1 - size / 3, ay2 - size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 + size / 2, ax1 + size / 3, ay2 + size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax1 + size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax1 - size / 3, ay2 - size / 3, ax2 - size / 4, ay2 - size / 4, BorderColor)
              LineXY(ax1 + size / 3, ay2 + size / 3, ax2 - size / 4, ay2 + size / 4, BorderColor)
              
              LineXY(ax2 - size / 4, ay2 - size / 4, ax2 - size / 4, ay2 - size / 2, BorderColor)
              LineXY(ax2 - size / 4, ay2 + size / 4, ax2 - size / 4, ay2 + size / 2, BorderColor)
              
              LineXY(ax2 - size / 4, ay2 - size / 2, ax2 + size / 4, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2 + size / 2, ax2 + size / 4, ay2, BorderColor) 
          
          Case #Way_SouthToWest
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax1 - size / 3, ay2 + size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 + size / 2, ax1 + size / 3, ay2 - size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax1 + size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax1 + size / 3, ay2 - size / 3, ax2 + size / 4, ay2 - size / 4, BorderColor)
              LineXY(ax1 - size / 3, ay2 + size / 3, ax2 + size / 4, ay2 + size / 4, BorderColor)
              
              LineXY(ax2 + size / 4, ay2 - size / 4, ax2 + size / 4, ay2 - size / 2, BorderColor)
              LineXY(ax2 + size / 4, ay2 + size / 4, ax2 + size / 4, ay2 + size / 2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2 - size / 2, ax2 - size / 4, ay2, BorderColor)
              LineXY(ax2 + size / 4, ay2 + size / 2, ax2 - size / 4, ay2, BorderColor)  
              
              FillArea(ax2, ay2, -1, BorderColor)
            
            DrawingMode(#PB_2DDrawing_AlphaChannel)
              Box(0, 0, width, height, RGBA(0, 0, 0, 0))
              LineXY(ax1 - size / 2, ay1 + size / 2, ax1 - size / 3, ay2 + size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 + size / 2, ax1 + size / 3, ay2 - size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax1 + size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax1 + size / 3, ay2 - size / 3, ax2 + size / 4, ay2 - size / 4, BorderColor)
              LineXY(ax1 - size / 3, ay2 + size / 3, ax2 + size / 4, ay2 + size / 4, BorderColor)
              
              LineXY(ax2 + size / 4, ay2 - size / 4, ax2 + size / 4, ay2 - size / 2, BorderColor)
              LineXY(ax2 + size / 4, ay2 + size / 4, ax2 + size / 4, ay2 + size / 2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2 - size / 2, ax2 - size / 4, ay2, BorderColor)
              LineXY(ax2 + size / 4, ay2 + size / 2, ax2 - size / 4, ay2, BorderColor) 
              
              FillArea(ax2, ay2, -1, BorderColor)
              
            DrawingMode(#PB_2DDrawing_Gradient)
              LinearGradient(ax1, ay1, ax2, ay2)
              FrontColor(GradientColor1) : GradientColor(0.80, GradientColor2) : BackColor(GradientColor3)
              Box(0, 0, width, height)
            
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax1 - size / 3, ay2 + size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 + size / 2, ax1 + size / 3, ay2 - size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 + size / 2, ax1 + size / 2, ay1 + size / 2, BorderColor)
              
              LineXY(ax1 + size / 3, ay2 - size / 3, ax2 + size / 4, ay2 - size / 4, BorderColor)
              LineXY(ax1 - size / 3, ay2 + size / 3, ax2 + size / 4, ay2 + size / 4, BorderColor)
              
              LineXY(ax2 + size / 4, ay2 - size / 4, ax2 + size / 4, ay2 - size / 2, BorderColor)
              LineXY(ax2 + size / 4, ay2 + size / 4, ax2 + size / 4, ay2 + size / 2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2 - size / 2, ax2 - size / 4, ay2, BorderColor)
              LineXY(ax2 + size / 4, ay2 + size / 2, ax2 - size / 4, ay2, BorderColor) 
          
          Case #Way_NorthToEast
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 - size / 2, ay1 - size / 2, ax1 - size / 3, ay2 + size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 - size / 2, ax1 + size / 3, ay2 - size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 - size / 2, ax1 + size / 2, ay1 - size / 2, BorderColor)
              
              LineXY(ax1 + size / 3, ay2 - size / 3, ax2 - size / 4, ay2 - size / 4, BorderColor)
              LineXY(ax1 - size / 3, ay2 + size / 3, ax2 - size / 4, ay2 + size / 4, BorderColor)
              
              LineXY(ax2 - size / 4, ay2 - size / 4, ax2 - size / 4, ay2 - size / 2, BorderColor)
              LineXY(ax2 - size / 4, ay2 + size / 4, ax2 - size / 4, ay2 + size / 2, BorderColor)
              
              LineXY(ax2 - size / 4, ay2 - size / 2, ax2 + size / 4, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2 + size / 2, ax2 + size / 4, ay2, BorderColor) 
              
              FillArea(ax2, ay2, -1, BorderColor)
            
            DrawingMode(#PB_2DDrawing_AlphaChannel)
              Box(0, 0, width, height, RGBA(0, 0, 0, 0))
              LineXY(ax1 - size / 2, ay1 - size / 2, ax1 - size / 3, ay2 + size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 - size / 2, ax1 + size / 3, ay2 - size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 - size / 2, ax1 + size / 2, ay1 - size / 2, BorderColor)
              
              LineXY(ax1 + size / 3, ay2 - size / 3, ax2 - size / 4, ay2 - size / 4, BorderColor)
              LineXY(ax1 - size / 3, ay2 + size / 3, ax2 - size / 4, ay2 + size / 4, BorderColor)
              
              LineXY(ax2 - size / 4, ay2 - size / 4, ax2 - size / 4, ay2 - size / 2, BorderColor)
              LineXY(ax2 - size / 4, ay2 + size / 4, ax2 - size / 4, ay2 + size / 2, BorderColor)
              
              LineXY(ax2 - size / 4, ay2 - size / 2, ax2 + size / 4, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2 + size / 2, ax2 + size / 4, ay2, BorderColor) 
              
              FillArea(ax2, ay2, -1, BorderColor)
              
            DrawingMode(#PB_2DDrawing_Gradient)
              LinearGradient(ax1, ay1, ax2, ay2)
              FrontColor(GradientColor1) : GradientColor(0.80, GradientColor2) : BackColor(GradientColor3)
              Box(0, 0, width, height)
            
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 - size / 2, ay1 - size / 2, ax1 - size / 3, ay2 + size / 3, BorderColor)
              LineXY(ax1 + size / 2, ay1 - size / 2, ax1 + size / 3, ay2 - size / 3, BorderColor)
              LineXY(ax1 - size / 2, ay1 - size / 2, ax1 + size / 2, ay1 - size / 2, BorderColor)
              
              LineXY(ax1 + size / 3, ay2 - size / 3, ax2 - size / 4, ay2 - size / 4, BorderColor)
              LineXY(ax1 - size / 3, ay2 + size / 3, ax2 - size / 4, ay2 + size / 4, BorderColor)
              
              LineXY(ax2 - size / 4, ay2 - size / 4, ax2 - size / 4, ay2 - size / 2, BorderColor)
              LineXY(ax2 - size / 4, ay2 + size / 4, ax2 - size / 4, ay2 + size / 2, BorderColor)
              
              LineXY(ax2 - size / 4, ay2 - size / 2, ax2 + size / 4, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2 + size / 2, ax2 + size / 4, ay2, BorderColor) 
          
          Case #Way_NorthToWest
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 + size / 4, ay1 - size / 2, ax2 - size / 3, ay1 - size / 3, BorderColor)
              LineXY(ax1 + size / 4, ay1 + size / 2, ax2 + size / 3, ay1 + size / 3, BorderColor)
              LineXY(ax1 + size / 4, ay1 - size / 2, ax1 + size / 4, ay1 + size / 2, BorderColor)
              
              LineXY(ax2 - size / 3, ay1 - size / 3, ax2 - size / 4, ay2, BorderColor)
              LineXY(ax2 + size / 3, ay1 + size / 3, ax2 + size / 4, ay2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2, ax2 + size / 2, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2, ax2 - size / 2, ay2, BorderColor)
              
              LineXY(ax2 + size / 2, ay2, ax2, ay2 + size / 2, BorderColor)
              LineXY(ax2 - size / 2, ay2, ax2, ay2 + size / 2, BorderColor) 
              
              FillArea(ax2, ay2, -1, BorderColor)
            
            DrawingMode(#PB_2DDrawing_AlphaChannel)
              Box(0, 0, width, height, RGBA(0, 0, 0, 0))
              LineXY(ax1 + size / 4, ay1 - size / 2, ax2 - size / 3, ay1 - size / 3, BorderColor)
              LineXY(ax1 + size / 4, ay1 + size / 2, ax2 + size / 3, ay1 + size / 3, BorderColor)
              LineXY(ax1 + size / 4, ay1 - size / 2, ax1 + size / 4, ay1 + size / 2, BorderColor)
              
              LineXY(ax2 - size / 3, ay1 - size / 3, ax2 - size / 4, ay2, BorderColor)
              LineXY(ax2 + size / 3, ay1 + size / 3, ax2 + size / 4, ay2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2, ax2 + size / 2, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2, ax2 - size / 2, ay2, BorderColor)
              
              LineXY(ax2 + size / 2, ay2, ax2, ay2 + size / 2, BorderColor)
              LineXY(ax2 - size / 2, ay2, ax2, ay2 + size / 2, BorderColor) 
              
              FillArea(ax2, ay2, -1, BorderColor)
              
            DrawingMode(#PB_2DDrawing_Gradient)
              LinearGradient(ax1, ay1, ax2, ay2)
              FrontColor(GradientColor1) : GradientColor(0.80, GradientColor2) : BackColor(GradientColor3)
              Box(0, 0, width, height)
            
            DrawingMode(#PB_2DDrawing_Default)
              LineXY(ax1 + size / 4, ay1 - size / 2, ax2 - size / 3, ay1 - size / 3, BorderColor)
              LineXY(ax1 + size / 4, ay1 + size / 2, ax2 + size / 3, ay1 + size / 3, BorderColor)
              LineXY(ax1 + size / 4, ay1 - size / 2, ax1 + size / 4, ay1 + size / 2, BorderColor)
              
              LineXY(ax2 - size / 3, ay1 - size / 3, ax2 - size / 4, ay2, BorderColor)
              LineXY(ax2 + size / 3, ay1 + size / 3, ax2 + size / 4, ay2, BorderColor)
              
              LineXY(ax2 + size / 4, ay2, ax2 + size / 2, ay2, BorderColor)
              LineXY(ax2 - size / 4, ay2, ax2 - size / 2, ay2, BorderColor)
              
              LineXY(ax2 + size / 2, ay2, ax2, ay2 + size / 2, BorderColor)
              LineXY(ax2 - size / 2, ay2, ax2, ay2 + size / 2, BorderColor) 
              
        EndSelect
        
      
    Case #ArrowType_Direct
      DrawingMode(#PB_2DDrawing_Default)
        Box(0, 0, width, height, 0)
        a.f = GetAngle(ax1, ay1, ax2, ay2)
        x1 = ax1 + Cos(a - #PI / 2) * size / 2
        y1 = ay1 + Sin(a - #PI / 2) * size / 2
        x2 = ax2 + Cos(a - #PI / 2) * size / 4
        y2 = ay2 + Sin(a - #PI / 2) * size / 4
        
        x3 = ax1 + Cos(a + #PI / 2) * size / 2
        y3 = ay1 + Sin(a + #PI / 2) * size / 2
        x4 = ax2 + Cos(a + #PI / 2) * size / 4
        y4 = ay2 + Sin(a + #PI / 2) * size / 4
        
        x5 = ax2 + Cos(a - #PI / 2) * size / 2
        y5 = ay2 + Sin(a - #PI / 2) * size / 2
        x6 = ax2 + Cos(a + #PI / 2) * size / 2
        y6 = ay2 + Sin(a + #PI / 2) * size / 2
        If ay1 > ay2
          x7 = ax2 + Cos(a + #PI) * size / 2
          y7 = ay2 + Sin(a + #PI) * size / 2
        Else
          x7 = ax2 + Cos(a) * size / 2
          y7 = ay2 + Sin(a) * size / 2
        EndIf
        LineXY(x1, y1, x2, y2, BorderColor)
        LineXY(x3, y3, x4, y4, BorderColor)
        LineXY(x1, y1, x3, y3, BorderColor)
        LineXY(x2, y2, x5, y5, BorderColor)
        LineXY(x4, y4, x6, y6, BorderColor)
        LineXY(x5, y5, x7, y7, BorderColor)
        LineXY(x6, y6, x7, y7, BorderColor)
        
        FillArea(ax2, ay2, -1, BorderColor)
      
      DrawingMode(#PB_2DDrawing_AlphaChannel)
        Box(0, 0, width, height, RGBA(0, 0, 0, 0))
        LineXY(x1, y1, x2, y2, BorderColor)
        LineXY(x3, y3, x4, y4, BorderColor)
        LineXY(x1, y1, x3, y3, BorderColor)
        LineXY(x2, y2, x5, y5, BorderColor)
        LineXY(x4, y4, x6, y6, BorderColor)
        LineXY(x5, y5, x7, y7, BorderColor)
        LineXY(x6, y6, x7, y7, BorderColor)
        
        FillArea(ax2, ay2, -1, BorderColor)
      
      DrawingMode(#PB_2DDrawing_Gradient)
        LinearGradient(ax1, ay1, ax2, ay2)
        FrontColor(GradientColor1) : GradientColor(0.80, GradientColor2) : BackColor(GradientColor3)
        Box(0, 0, width, height)
        
      DrawingMode(#PB_2DDrawing_Default)
        LineXY(x1, y1, x2, y2, BorderColor)
        LineXY(x3, y3, x4, y4, BorderColor)
        LineXY(x1, y1, x3, y3, BorderColor)
        LineXY(x2, y2, x5, y5, BorderColor)
        LineXY(x4, y4, x6, y6, BorderColor)
        LineXY(x5, y5, x7, y7, BorderColor)
        LineXY(x6, y6, x7, y7, BorderColor)
      
  EndSelect
  
EndProcedure

Procedure.f GetAngle(x1, y1, x2, y2)
  If y1 > y2
    tmp = y1
    y1 = y2
    y2 = tmp
    
    tmp = x1
    x1 = x2
    x2 = tmp
  EndIf
  x.f = x2 - x1
  y.f = y2 - y1
  n.f = Sqr(x * x + y * y)
  If n : x / n : EndIf
  ProcedureReturn ACos(x)
EndProcedure


Re: Rendre transparent une couleur dans une imagegadget

Publié : mer. 24/févr./2010 15:03
par Kwai chang caine
Merci beaucoup CEDERAVIC

Te casse pas la tete, en fin de compte je suis arrivé apres 2 jours de boulot, a mettre ta premiere fleche que j'adore dans mon code 8)
Elle est simple performante, et a meme bien plus de qualité que je n'en esperais :D
Car je ne comptais pas la faire graduée 8)

Merci aussi pour ces nouvelles fleches que je garde precieusement
Te casse pas la tete, le travail d'abord....vous avez deja tellement fait pour moi toi et KERNADEC 8)

Une question que je me suis posée...si j'etais pas parti dans les gadgets, comment vous auriez fait graphiquement, car je suppose que vous n'auriez pas utilisé les gadgets non plus...
Comment vous auriez fait, ou comment font il pour faire du dessin vectoriel. 8O
C'est vrai j'ai pas trouvé d'exemples de dessin vectoriel avec pure, j'ai tapé vectoriel et pas grand chose ne sort :(
Car quand on regarde le designer, c'est bien du vectoriel donc ça doit se faire ???? :roll:

Re: Rendre transparent une couleur dans une imagegadget

Publié : mer. 24/févr./2010 17:01
par cederavic
J'ai pas compris ta question...
Je me rappel avoir vu un code du genre "Redimensionnement des gadget avec poignee style visual designer", mais je ne sais plus de qui, a voir 8)
Sans gadget ça aurait été beaucoup plus simple je pense, dessiner directement dans la fenetre (ce que je fais dans l'avant dernier code pour l'aperçus de la fleche), mais il aurait fallu gerer les evenement "a la main".

Re: Rendre transparent une couleur dans une imagegadget

Publié : mer. 24/févr./2010 18:43
par Kwai chang caine
Oui c'est le code de patrick88 avec lequel j'ai démarré.
A la fin, j'ai été obligé d'enlever les poignées rouge, car elle me compliquait le code...comme si il en etait besoin :mrgreen:

Ma question, c'est comment y font dans un dessin, pour qu'un trait y soit vectoriel et non bitmap
C'est a dire que tu trace le trait, tu en trace un autre, puis tu clique sur le premier et il apparait deux poignées et tu peux le deplacer, l'agrandir...

Ce que je me demandais, c'est que quand un trait il est tracé, et que tu l'efface pour un tracer un autre, ou le deplacer, ça efface aussi ce qui est dessous ??? :roll:

Et le logiciel qui a noir de croisement, ça veut dire qu'il retrace toutes les lignes dessous quand tu deplace une ligne sur les autres :roll:
C'est un calcul de "guedin"....c'est pour ça que j'etait parti sur les gadgets, car eux il ne tracent rien sur la fenetre....
Donc pas de "crottes" une fois passé, comme les chevaux :?

Re: Rendre transparent une couleur dans une imagegadget

Publié : lun. 01/mars/2010 16:33
par Kwai chang caine
CEDERAVIC

Tu vas etre fier de ton eleve...enfin j'espere :roll:
Je suis arrivé a "détordre" les fleches que tu t'es fait un fion a tordre :D

J'en ai bavé...car moi j'ai pas fait couture en deuxieme matiere :(
T'as vraiment fait un boulot de malade, surtout les bordures de fleches 8O

D'ailleur a ce propos, cette condition, elle sert jamais...
Car je suis jamais tombé dedans pendant tousd mes nombreux essais :roll:

Code : Tout sélectionner

If Largeur < Epaisseur * 4 Or Hauteur < Epaisseur * 4
   DrawingMode(#PB_2DDrawing_AlphaChannel)
   Box(0, 0, Largeur, Hauteur, RGBA(0, 0, 0, 0))
Alors voila....le fruit de mon labeur, la fleche droite dans les 4 directions :mrgreen:

Code : Tout sélectionner

Enumeration
   #Fenetre
   #Fenetre_BG
   #Fleche
   #FlecheGadget
   #ButtonGadget
   #EditorGadget
EndEnumeration

Declare WinCB(hWnd, Msg, wParam, lParam)

Procedure DessineFleche(x1, y1, x2, y2, Epaisseur, BorderlColor, GradientColor1, GradientColor2, GradientColor3)
   If x1 > x2
      Depart_X = x2
      Fin_X = x1
   Else
      Depart_X = x1
      Fin_X = x2
   EndIf
   If y1 > y2
      Depart_Y = y2
      Fin_Y = y1
   Else
      Depart_Y = y1
      Fin_Y = y2
   EndIf
   Largeur = Fin_X - Depart_X 
   Hauteur = Fin_Y - Depart_Y 
   If Largeur <= 0 : Largeur = 1 : EndIf : If Hauteur <= 0 : Hauteur = 1 : EndIf
   
   CreateImage(#Fleche, Largeur, Hauteur, 32)
    StartDrawing(ImageOutput(#Fleche))
    
  DrawingMode(#PB_2DDrawing_Gradient) 
  
  If (x1 > x2 And y1 < y2) Or (x1 < x2  And y1 > y2) ; Verticale
  
   FrontColor(GradientColor1) : GradientColor(0.80, GradientColor2) : BackColor(GradientColor3)
   LinearGradient(0, Epaisseur, 0, Hauteur - Epaisseur - 1)
   Box(0, 0, Largeur, Hauteur)
   
   DrawingMode(#PB_2DDrawing_Default)
   LineXY(Epaisseur * 2 + 1, 1, 2, Epaisseur * 2, BorderlColor)
   LineXY(Epaisseur * 2 , 1, Epaisseur * 4 - 1, Epaisseur * 2, BorderlColor)
   LineXY(0, Epaisseur * 2 + 1, Epaisseur * 1.5 - 1, Epaisseur * 2 + 1, BorderlColor)
   LineXY(Epaisseur * 2.5, Epaisseur * 2 + 1, Epaisseur * 4, Epaisseur * 2 + 1, BorderlColor)
   LineXY(Epaisseur * 1.5, Epaisseur * 2 + 1, Epaisseur * 1.5, Hauteur - Epaisseur / 2, BorderlColor)
   LineXY(Epaisseur * 2.5 - 1, Epaisseur * 2 + 1, Epaisseur * 2.5 - 1, Hauteur - Epaisseur * 1.5, BorderlColor)
   LineXY(Epaisseur * 1.5, Hauteur - Epaisseur / 2 - 1, Largeur, Hauteur - Epaisseur / 2 - 1, BorderlColor)
   LineXY(Epaisseur * 2.5 - 1, Hauteur - Epaisseur * 1.5, Largeur, Hauteur - Epaisseur * 1.5, BorderlColor)
   LineXY(Largeur - 1, Hauteur - Epaisseur * 1.5, Largeur - 1, Hauteur - Epaisseur / 2 - 1, BorderlColor)
   
   DrawingMode(#PB_2DDrawing_AlphaChannel)
   Box(0, 0, Largeur, Hauteur, RGBA(0, 0, 0, 0))
      
   Box(Epaisseur * 1.5, Epaisseur, Epaisseur, Hauteur - Epaisseur - Epaisseur / 2, RGBA(0, 0, 0, 255))
     
   For ty = 0 To Epaisseur * 2
    LineXY(Epaisseur * 2 - ty + 1, ty + 1, Epaisseur * 2 + ty, ty + 1, RGBA(0, 0, 0, 255))
   Next
   
  Else ; Horizontale
   
   FrontColor(GradientColor1) : GradientColor(0.80, GradientColor2) : BackColor(GradientColor3)
   LinearGradient(0, 0, Largeur, hauteur )
   Box(0, 0, Largeur, Hauteur)
   
   DrawingMode(#PB_2DDrawing_Default)
   LineXY(0, Hauteur - Epaisseur * 1.5 + 1, Epaisseur * 1.5 + 1, Hauteur - (Epaisseur * 3) + 1, BorderlColor) ; Coté pointe fleche
   LineXY(0, Hauteur - Epaisseur * 1.5 , Epaisseur * 1.5 + 1, Hauteur + 1, BorderlColor) ; Coté pointe fleche
   LineXY(Epaisseur * 1.5 - 1, Hauteur - (Epaisseur * 3) + 1, Epaisseur * 1.5 - 1, Hauteur - (Epaisseur * 2) - 1, BorderlColor) ; Base fleche
   LineXY(Epaisseur * 1.5 - 1, Hauteur - 1, Epaisseur * 1.5 - 1, Hauteur - Epaisseur, BorderlColor) ; Base fleche
   LineXY(Epaisseur * 1.5, Hauteur - Epaisseur - 1, Largeur, Hauteur - Epaisseur - 1, BorderlColor); Horizontale bas
   LineXY(Largeur - 1, Hauteur - Epaisseur - 1, Largeur - 1, Hauteur - (Epaisseur * 2) - 1, BorderlColor) ; Cul de fleche
   LineXY(Largeur - 1, Hauteur - (Epaisseur * 2) + 1, Epaisseur * 1.5 - 1, Hauteur - (Epaisseur * 2) + 1, BorderlColor) ; Horizontale haut
       
   DrawingMode(#PB_2DDrawing_AlphaChannel)
   Box(0, 0, Largeur, Hauteur, RGBA(0, 0, 0, 0))
   Box(Epaisseur * 1.5, Hauteur - Epaisseur * 2, Largeur - Epaisseur, Epaisseur, RGBA(0, 0, 0, 255)) 
     
   For ty = 0 To Epaisseur * 3
    LineXY(0, Hauteur - Epaisseur * 1.5, Epaisseur * 1.5, Hauteur - (Epaisseur * 3) + ty , RGBA(0, 0, 0, 255))
   Next
   
  EndIf 
  
 StopDrawing()
 
 hDC = StartDrawing(ImageOutput(#Fleche))
 
  If x1 < x2 And y1 < y2 ; Bas Droit
   StretchBlt_(hDC, Largeur, Hauteur, -Largeur, -Hauteur, hDC, 0, 0, Largeur, Hauteur, #SRCCOPY)
  ElseIf x1 > x2 And y1 < y2  ; Haut gauche
   StretchBlt_(hDC, 0, Hauteur, Largeur, -Hauteur, hDC, 0, 0, Largeur, Hauteur, #SRCCOPY)
  EndIf
    
 StopDrawing()
 
 SetGadgetState(#FlecheGadget, ImageID(#Fleche))
 ResizeGadget(#FlecheGadget, Depart_X, Depart_Y, Largeur, Hauteur)
   
EndProcedure

CreateImage(#Fleche, 10, 10, 32)

OpenWindow(#Fenetre, 0, 0, 800, 600, "Fleche multidirectionnelle",  #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered| #PB_Window_Invisible)
  SmartWindowRefresh(#Fenetre, 1) 
  
  
  ButtonGadget(#ButtonGadget, 10, 10, 100, 20, "Test")
  EditorGadget(#EditorGadget, 200, 300, 200, 300)
    AddGadgetItem(#EditorGadget, -1, "Youpla boom!")
  
  ImageGadget(#FlecheGadget,0, 0, 0, 0, ImageID(#Fleche))
  
  CreateImage(#Fenetre_BG, 800, 600)
  StartDrawing(ImageOutput(#Fenetre_BG))
    a = 1
    For x = 0 To 800 Step 10
      For y = 0 To 600 Step 10
        a * -1
        If a = 1 : Color = RGB(80, 80, 80) : Else : Color = #White : EndIf
        Box(x, y, 10, 10, Color)
      Next
    Next
  StopDrawing()

  SetWindowCallback(@WinCB())

DessineFleche(112, 6, 326, 298, 12, RGB(16, 16, 16), RGB(75, 64, 64), RGB(128, 140, 128), RGB(230, 230, 250))
HideWindow(#Fenetre, 0)

Repeat
  
  Evenement = WindowEvent()
  
  Select Evenement

    Case #WM_MOUSEMOVE
      If GetAsyncKeyState_(#VK_LBUTTON)
        oldMouseX = MouseX
        oldMouseY = MouseY
        MouseX = WindowMouseX(#Fenetre)
        MouseY = WindowMouseY(#Fenetre)
        If Depart_X < 0
          Depart_X = MouseX
          Depart_Y = MouseY
        EndIf
        
        x1 = Depart_X : x2 = MouseX
        y1 = Depart_Y : y2 = MouseY
        If x1 > x2
          dx1 = x2
          dx2 = x1
        Else
          dx1 = x1
          dx2 = x2
        EndIf
        If y1 > y2
          dy1 = y2
          dy2 = y1
        Else
          dy1 = y1
          dy2 = y2
        EndIf

        hRgn = CreateRectRgn_(Depart_X, MouseY, OldMouseX, OldMouseY)
          RedrawWindow_(WindowID(#Fenetre), 0, hRgn, #RDW_INVALIDATE | #RDW_UPDATENOW | #RDW_ALLCHILDREN)
        DeleteObject_(hRgn)
        
        
        hRgn = CreateRectRgn_(MouseX, Depart_Y, OldMouseX, OldMouseY)
          RedrawWindow_(WindowID(#Fenetre), 0, hRgn, #RDW_INVALIDATE | #RDW_UPDATENOW | #RDW_ALLCHILDREN)
        DeleteObject_(hRgn)
        
        deltaX = Abs(MouseX - oldMouseX) + 2 : deltaY = Abs(MouseY - OldMouseY) + 2
        
        hRgn  = CreateRectRgn_(dx1 + 2,       dy1 + 2,      dx2 - 2,      dy2 - 2)
        hRgn2 = CreateRectRgn_(dx1 + 2,       dy1 + 2,      dx2 - 2,      dy2 - 2)
        hRgn3 = CreateRectRgn_(dx1 + deltaX,  dy1 + deltaY, dx2 - deltaX, dy2 - deltaY)
          CombineRgn_(hRgn, hRgn2, hRgn3, #RGN_XOR)
          RedrawWindow_(WindowID(#Fenetre), 0, hRgn, #RDW_INVALIDATE | #RDW_UPDATENOW | #RDW_ALLCHILDREN)
        DeleteObject_(hRgn)
        DeleteObject_(hRgn2)
        DeleteObject_(hRgn3)
        
        hDC = GetDC_(WindowID(#Fenetre))
        hBrush = CreateSolidBrush_(RGB(180, 32, 32))
        hRgn = CreateRectRgn_(dx1, dy1, dx2, dy2)
          FrameRgn_(hDC, hRgn, hBrush, 2, 2)
        DeleteObject_(hBrush)
        DeleteObject_(hRgn)

      Else
        Depart_X = -1
      EndIf   
      
    Case #WM_LBUTTONUP
      MouseX = WindowMouseX(#Fenetre)
      MouseY = WindowMouseY(#Fenetre)
      DessineFleche(Depart_X, Depart_Y, MouseX , MouseY, 16, RGB(16, 16, 16), RGB(75, 64, 64), RGB(128, 140, 128), RGB(230, 230, 250))    
      
  EndSelect

Until Evenement = #PB_Event_CloseWindow


Procedure WinCB(hWnd, Msg, wParam, lParam)

  Select Msg
    Case #WM_PAINT

      hBmp = ImageID(#Fenetre_BG)
      hDC = BeginPaint_(hWnd, @ps.PAINTSTRUCT)
     
        hDC2 = CreateCompatibleDC_(hDC)
       
          SelectObject_ (hDC2, hBmp)
          BitBlt_(hDC, 0, 0, WindowWidth(#Fenetre), WindowHeight(#Fenetre), hDC2, 0, 0, #SRCCOPY)
          ReleaseDC_(hWnd, hDC)
         
        DeleteDC_(hDC2)
      EndPaint_(hWnd, @ps)
      ProcedureReturn #True
   
    Default
      ProcedureReturn #PB_ProcessPureBasicEvents
   
  EndSelect

EndProcedure