Quand je prends le focus avec LeftButtonDown ou quand je le perd LostFocus, pour ne pas avoir un cadre blanc (=canvas) je dois repeindre le gadget avec:
ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore)
ou avec:
HideGadget(\Gadget,#True)
HideGadget(\Gadget,#False)
Y a t'il une solution préférable entre les 2, ou autres ?
Code : Tout sélectionner
Enumeration
#Window_0
#Canvas_0
#Editor_0
#Canvas_1
#Text_0
#Button_0
EndEnumeration
Structure GadgetHandle
Gadget.i
Handle.i
EndStructure
Procedure GadgetHandle_Callback()
Protected GadgetHandle.GadgetHandle, ResizeDone.b = #False
With GadgetHandle
\Handle = EventGadget()
\Gadget = GetGadgetData(\Handle)
Select EventType()
Case #PB_EventType_Focus
If StartDrawing(CanvasOutput(\Handle)) ;Dessiner une bordure autour du gadget
Box(0, 0, OutputWidth(), OutputHeight(), $000000)
Box(1, 1, OutputWidth()-2, OutputHeight()-2, $FFFFFF)
StopDrawing()
EndIf
Case #PB_EventType_LostFocus
If StartDrawing(CanvasOutput(\Handle)) ;Supprimer la bordure autour du gadget
Box(0, 0, OutputWidth(), OutputHeight(), $FFFFFF)
StopDrawing()
EndIf
;DisableGadget(\Gadget,#True) : DisableGadget(\Gadget,#False) ;ne redessine pas le Gadget
;SetActiveGadget(\Gadget) ;ne redessine pas le Gadget
;HideGadget(\Gadget,#True) : HideGadget(\Gadget,#False) ;OK mais quel est le mieux entre hide/unhide ou Resize
ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore) ;OK mais quel est le mieux entre hide/unhide ou Resize
Case #PB_EventType_KeyDown
Select GetGadgetAttribute(EventGadget(),#PB_Canvas_Key)
Case #PB_Shortcut_Right
If GetGadgetAttribute(\Handle, #PB_Canvas_Modifiers) = #PB_Canvas_Shift
ResizeGadget(\Handle, #PB_Ignore, #PB_Ignore, GadgetWidth(\Handle)+1, #PB_Ignore)
Else
ResizeGadget(\Handle, GadgetX(\Handle)+1, #PB_Ignore, #PB_Ignore, #PB_Ignore)
EndIf
Case #PB_Shortcut_Left
If GetGadgetAttribute(\Handle, #PB_Canvas_Modifiers) = #PB_Canvas_Shift
ResizeGadget(\Handle, #PB_Ignore, #PB_Ignore, GadgetWidth(\Handle)-1, #PB_Ignore)
Else
ResizeGadget(\Handle, GadgetX(\Handle)-1, #PB_Ignore, #PB_Ignore, #PB_Ignore)
EndIf
Case #PB_Shortcut_Up
If GetGadgetAttribute(\Handle, #PB_Canvas_Modifiers) = #PB_Canvas_Shift
ResizeGadget(\Handle, #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetHeight(\Handle)-1)
Else
ResizeGadget(\Handle, #PB_Ignore, GadgetY(\Handle)-1, #PB_Ignore, #PB_Ignore)
EndIf
Case #PB_Shortcut_Down
If GetGadgetAttribute(\Handle, #PB_Canvas_Modifiers) = #PB_Canvas_Shift
ResizeGadget(\Handle, #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetHeight(\Handle)+1)
Else
ResizeGadget(\Handle, #PB_Ignore, GadgetY(\Handle)+1, #PB_Ignore, #PB_Ignore)
EndIf
EndSelect
If StartDrawing(CanvasOutput(\Handle)) ;Redessiner la bordure en cas de redimensionnement
Box(0, 0, OutputWidth(), OutputHeight(), $480000)
Box(1, 1, OutputWidth()-2, OutputHeight()-2, $FFFFFF)
StopDrawing()
EndIf
ResizeGadget(\Gadget, GadgetX(\Handle)+1, GadgetY(\Handle)+1, GadgetWidth(\Handle)-2, GadgetHeight(\Handle)-2)
Case #PB_EventType_LeftButtonDown
;DisableGadget(\Gadget,#True) : DisableGadget(\Gadget,#False) ;ne redessine pas le Gadget
;SetActiveGadget(\Gadget) ;ne redessine pas le Gadget
;HideGadget(\Gadget,#True) : HideGadget(\Gadget,#False) ;OK mais quel est le mieux entre hide/unhide ou Resize
ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore) ;OK mais quel est le mieux entre hide/unhide ou Resize
EndSelect
EndWith
EndProcedure
OpenWindow(#Window_0, 0, 0, 300, 145, "", #PB_Window_SystemMenu)
CanvasGadget(#Canvas_0, 0, 0, 0, 0, #PB_Canvas_Keyboard)
EditorGadget(#Editor_0, 50, 20, 200, 50, #PB_Editor_WordWrap) : SetGadgetText(#Editor_0, "Text Editor Gadget")
ResizeGadget(#Canvas_0, GadgetX(#Editor_0)-1, GadgetY(#Editor_0)-1, GadgetWidth(#Editor_0)+2, GadgetHeight(#Editor_0)+2)
SetGadgetData(#Canvas_0, #Editor_0)
CanvasGadget(#Canvas_1, 0, 0, 0, 0, #PB_Canvas_Keyboard)
TextGadget(#Text_0, 50, 80, 100, 20, "Texte")
ResizeGadget(#Canvas_1, GadgetX(#Text_0)-1, GadgetY(#Text_0)-1, GadgetWidth(#Text_0)+2, GadgetHeight(#Text_0)+2)
SetGadgetData(#Canvas_1, #Text_0)
ButtonGadget(#Button_0, 50, 110, 100, 25, "Take Focus")
SetGadgetAttribute(#Canvas_0, #PB_Canvas_Cursor, #PB_Cursor_Arrows)
BindGadgetEvent(#Canvas_0, @GadgetHandle_Callback())
SetGadgetAttribute(#Canvas_1, #PB_Canvas_Cursor, #PB_Cursor_Arrows)
BindGadgetEvent(#Canvas_1, @GadgetHandle_Callback())
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
En remplaçant Case #PB_EventType_KeyDown avec le code ci dessous, je dois également repeindre le gadget avec hide/unhide ou ResizeGadget à la fin.
Ici, contrairement au code ci dessus le redimensionnement est fait sur le Gadget en 1er et sur le canva (ou poignée) ensuite. Il est fait de même dans "SweetyVD" pour calculer les positions mini, maxi pour les déplacements/redimensionnements.
Pour éviter le "Flickerring" avec ResizeGadget(\Gadget, #PB_Ignore...) à chaque #PB_EventType_KeyDown, je passe par une variable, ResizeDone alimenté à #True en cas de déplacements/redimensionnements réellement effectués.
Est-ce que je loupe quelque chose ? Y a t'il mieux à faire ?
Code : Tout sélectionner
Case #PB_EventType_KeyDown
Select GetGadgetAttribute(EventGadget(),#PB_Canvas_Key)
Case #PB_Shortcut_Right
If GetGadgetAttribute(\Handle, #PB_Canvas_Modifiers) = #PB_Canvas_Shift
ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, GadgetWidth(\Gadget)+1, #PB_Ignore)
Else
ResizeGadget(\Gadget, GadgetX(\Gadget)+1, #PB_Ignore, #PB_Ignore, #PB_Ignore)
EndIf
ResizeDone = #True
Case #PB_Shortcut_Left
If GetGadgetAttribute(\Gadget, #PB_Canvas_Modifiers) = #PB_Canvas_Shift
ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, GadgetWidth(\Gadget)-1, #PB_Ignore)
Else
ResizeGadget(\Gadget, GadgetX(\Gadget)-1, #PB_Ignore, #PB_Ignore, #PB_Ignore)
EndIf
ResizeDone = #True
Case #PB_Shortcut_Up
If GetGadgetAttribute(\Gadget, #PB_Canvas_Modifiers) = #PB_Canvas_Shift
ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetHeight(\Gadget)-1)
Else
ResizeGadget(\Gadget, #PB_Ignore, GadgetY(\Gadget)-1, #PB_Ignore, #PB_Ignore)
EndIf
ResizeDone = #True
Case #PB_Shortcut_Down
If GetGadgetAttribute(\Gadget, #PB_Canvas_Modifiers) = #PB_Canvas_Shift
ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetHeight(\Gadget)+1)
Else
ResizeGadget(\Gadget, #PB_Ignore, GadgetY(\Gadget)+1, #PB_Ignore, #PB_Ignore)
EndIf
ResizeDone = #True
EndSelect
If ResizeDone ;Solution de contournement pour effectuer ResizeGadget(\Gadget) sans le clignotement
If StartDrawing(CanvasOutput(\Handle)) ;Redessiner la bordure en cas de redimensionnement
Box(0, 0, OutputWidth(), OutputHeight(), $480000)
Box(1, 1, OutputWidth()-2, OutputHeight()-2, $FFFFFF)
StopDrawing()
EndIf
ResizeGadget(\Handle, GadgetX(\Gadget)-1, GadgetY(\Gadget)-1, GadgetWidth(\Gadget)+2, GadgetHeight(\Gadget)+2)
ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore)
EndIf