Page 1 of 1

ClipGadgets()

Posted: Mon Feb 08, 2016 8:11 am
by mestnyi
http://www.purebasic.fr/english/viewtop ... 98#p475798

The following code shows the same arrangement in the form of gadgets in the same sequence as they were adding.
Do not add to purebasik like out of the box.
This would eliminate a lot of surprises.

Code: Select all

;-
; Для виндовс чтобы приклепить гаджеты на место
; надо вызывать процедуру в конце создания всех гаджетов
; надо вызвать после создания всех гаджетов
; 
EnableExplicit

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  Procedure GadgetsClipCallBack( GadgetID, lParam )
    If GadgetID
      Protected Gadget = GetProp_( GadgetID, "PB_ID" )
;       If IsGadget( Gadget ) And GadgetID = GadgetID( Gadget )
;         Debug "Gadget "+ Gadget +"  -  "+ GadgetID
;       Else
;         Debug "- Gadget   -  "+ GadgetID
;       EndIf
      
      If GetWindowLongPtr_( GadgetID, #GWL_STYLE ) & #WS_CLIPSIBLINGS = #False 
        If IsGadget( Gadget ) 
          Select GadgetType( Gadget )
            Case #PB_GadgetType_ComboBox
              Protected Height = GadgetHeight( Gadget )
              
;             ; Из-за бага когда устанавливаешь фоновый рисунок (например точки на кантейнер)
;             Case #PB_GadgetType_Container 
;               SetGadgetColor( Gadget, #PB_Gadget_BackColor, GetSysColor_( #COLOR_BTNFACE ))
;               
;             ; Для панел гаджета темный фон убирать
;             Case #PB_GadgetType_Panel 
;               If Not IsGadget( Gadget ) And (GetWindowLongPtr_(GadgetID, #GWL_EXSTYLE) & #WS_EX_TRANSPARENT) = #False
;                 SetWindowLongPtr_(GadgetID, #GWL_EXSTYLE, GetWindowLongPtr_(GadgetID, #GWL_EXSTYLE) | #WS_EX_TRANSPARENT)
;               EndIf
;               ; SetClassLongPtr_(GadgetID, #GCL_HBRBACKGROUND, GetStockObject_(#NULL_BRUSH))

          EndSelect
        EndIf
        
        SetWindowLongPtr_( GadgetID, #GWL_STYLE, GetWindowLongPtr_( GadgetID, #GWL_STYLE ) | #WS_CLIPSIBLINGS | #WS_CLIPCHILDREN )
        
        If Height
          ResizeGadget( Gadget, #PB_Ignore, #PB_Ignore, #PB_Ignore, Height )
        EndIf
        
        SetWindowPos_( GadgetID, #GW_HWNDFIRST, 0,0,0,0, #SWP_NOMOVE|#SWP_NOSIZE )
      EndIf
      
    EndIf
    
    ProcedureReturn GadgetID
  EndProcedure
CompilerEndIf


Procedure ClipGadgets( WindowID )
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    EnumChildWindows_( WindowID, @GadgetsClipCallBack(), 0 )
  CompilerEndIf
EndProcedure



CompilerIf #PB_Compiler_IsMainFile
  EnableExplicit

;{ - example
Procedure onCallback_Canvas()
  Debug "onCallback_Canvas " + EventGadget()
EndProcedure


  Procedure Gadgets( Window )
    Protected I
    UseGadgetList( WindowID(Window) )
    CanvasGadget(1, 8, 8, 210, 30, #PB_Canvas_Border)   
    CanvasGadget(2, 16, 16, 180, 60, #PB_Canvas_Border)  
    CanvasGadget(3, 16, 16, 150, 90, #PB_Canvas_Border)  
    CanvasGadget(4, 16, 16, 120, 120, #PB_Canvas_Border)  
    CanvasGadget(5, 16, 16, 90, 150, #PB_Canvas_Border)  
    CanvasGadget(6, 16, 16, 60, 180, #PB_Canvas_Border)  
    CanvasGadget(7, 16, 16, 30, 210, #PB_Canvas_Border)  
    
    For i=1 To 7
      If IsGadget(i) And StartDrawing(CanvasOutput(i))
        Box(0,0,OutputWidth(),OutputHeight(), RGB(Random(255), Random(255), Random(255)))
        StopDrawing()
        BindGadgetEvent(i, @onCallback_Canvas())
      EndIf
    Next
  EndProcedure
  
  Procedure _Gadgets( Window )
    Protected I
    UseGadgetList( WindowID(Window) )
    CanvasGadget(7, 8, 8, 210, 30, #PB_Canvas_Border)   
    CanvasGadget(6, 16, 16, 180, 60, #PB_Canvas_Border)  
    CanvasGadget(5, 16, 16, 150, 90, #PB_Canvas_Border)  
    CanvasGadget(4, 16, 16, 120, 120, #PB_Canvas_Border)  
    CanvasGadget(3, 16, 16, 90, 150, #PB_Canvas_Border)  
    CanvasGadget(2, 16, 16, 60, 180, #PB_Canvas_Border)  
    CanvasGadget(1, 16, 16, 30, 210, #PB_Canvas_Border)  
    
    For i=7 To 1 Step -1
      If IsGadget(i) And StartDrawing(CanvasOutput(i))
        Box(0,0,OutputWidth(),OutputHeight(), RGB(Random(255), Random(255), Random(255)))
        StopDrawing()
        BindGadgetEvent(i, @onCallback_Canvas())
      EndIf
    Next
  EndProcedure
  
   
  If OpenWindow(0, 0, 0, 252, 212, "Test")
    Gadgets( 0 )
;     SpinGadget     (10, 20, 20, 100, 25, 0, 1000)
;     SetGadgetState (10, 5) 
;     SetGadgetText(10, "5")   ; set initial value
;     ComboBoxGadget (100, 20, 35, 100, 155)
    
    ClipGadgets( UseGadgetList(0) )
  EndIf   
  
  SetWindowColor(0,RGB(255,255,0))
  Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  
  ClearDebugOutput()
  
   
  If OpenWindow(0, 250, 0, 252, 212, "-Test")
    _Gadgets( 0 )
    
    ClipGadgets( UseGadgetList(0) )
  EndIf   
 
  SetWindowColor(0,RGB(255,255,0))
  Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  
  End
;}
CompilerEndIf

; IDE Options = PureBasic 5.42 LTS (Windows - x86)
; CursorPosition = 173
; FirstLine = 152
; Folding = ------
; EnableUnicode
; EnableXP
; EnableCompileCount = 3
; EnableBuildCount = 0
; EnableExeConstant
; }