Poshu : je t'invite à aller voir ce lien :
Custom Gadget
qui présente un boulot que j'ai commencé, mais malheureusement pas tout à fait fini, faute de temps.
En revanche, la plupart des gadgets implémentés sont fonctionnels, et le topic n'est plus à jour concernant les dernières modifications que j'ai effectué (elles sont normalement indiquées dans l'archive.)
voici un exemple d'intégration d'un gadget dans mon projet :
Code : Tout sélectionner
;- ###########
;####################################################
;- Include de PBGadget - Graph100
;{###################################################
;- ###########
;{ Public procedures
; Ajoute un gadget normal de PB dans la gestion des evenements de CG_CustomGadget. A utiliser pour les redimentionnements automatiques, et le positionnement sur les splitters et container
Procedure CG_PBGadget(Gadget, ParentWindow, Anchor.b = #CG_Anchor_None, Dock.b = #CG_Dock_None, IfInGadget_ParentGadget = -1)
Protected *obj.ICG_CustomGadget_base
If IsWindow(ParentWindow)
; on ajoute ca pour eviter les problèmes d'affichage lors d'un redimensionnement
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
SmartWindowRefresh(ParentWindow, #True)
CompilerEndIf
; teste si le gadget parent, si spécifié, existe vraiment
If IfInGadget_ParentGadget <> -1 And IsGadget(IfInGadget_ParentGadget) = 0
IfInGadget_ParentGadget = -1
EndIf
; si le gadget existais déjà, on libère les ressources
If FindMapElement(ICG_Var_Global\Gadget(), Str(Gadget))
CG_FreeGadget(Gadget)
EndIf
; on gère le #pb_any : le gadget PB doit d'abord avoir été créé donc il ne faut pas utiliser #pb_any !!
If Gadget = #PB_Any : ProcedureReturn 0 : EndIf
; création de l'objet PBgadget
*obj = AllocateMemory(SizeOf(ICG_CustomGadget_base))
*obj\_Function = *obj
*obj\zz_FunctionTable = ?VTable_PBGadget
; si echec d'allocation mémoire
If *obj = 0
ProcedureReturn 0
EndIf
; initialisation de la mémoire du nouvel objet
InitializeStructure(*obj, ICG_CustomGadget_base)
With *obj
\Gadget = Gadget
\GadgetType = #CG_GadgetType_PB
\ParentWindow = ParentWindow
\ParentGadget = IfInGadget_ParentGadget
\x = GadgetX(Gadget)
\y = GadgetY(Gadget)
\Width = GadgetWidth(Gadget)
\Height = GadgetHeight(Gadget)
; vérification des paramètres de dock
If Dock & #CG_Dock_Top = #CG_Dock_Top
Dock = #CG_Dock_Top
ElseIf Dock & #CG_Dock_Bottom = #CG_Dock_Bottom
Dock = #CG_Dock_Bottom
ElseIf Dock & #CG_Dock_Left = #CG_Dock_Left
Dock = #CG_Dock_Left
ElseIf Dock & #CG_Dock_Right = #CG_Dock_Right
Dock = #CG_Dock_Right
ElseIf Dock & #CG_Dock_Fill = #CG_Dock_Fill
Dock = #CG_Dock_Fill
Else
Dock = #CG_Dock_None
EndIf
\Dock_type = Dock
\Anchor_type = Anchor
\Anchor_Margin_Top = \y
\Anchor_Margin_Left = \x
If IfInGadget_ParentGadget <> -1
\Anchor_Margin_Right = GadgetWidth(IfInGadget_ParentGadget) - (\x + \Width)
\Anchor_Margin_Bottom = GadgetHeight(IfInGadget_ParentGadget) - (\y + \Height)
Else
\Anchor_Margin_Right = WindowWidth(ParentWindow) - (\x + \Width)
\Anchor_Margin_Bottom = WindowHeight(ParentWindow) - (\y + \Height)
EndIf
EndWith
; Fin de la création du gadget
; on l'ajoute dans la liste des gadgets customisés pour le traitement des evenements
ICG_AddCustomGadget(*obj)
ProcedureReturn Gadget
EndIf
ProcedureReturn 0
EndProcedure
;}
;{ Internal procedures
;-
Procedure ICG_PBGadget_ProcessEvent(*obj.ICG_CustomGadget_base, event_type)
EndProcedure
Procedure ICG_PBGadget_Render(*obj.ICG_CustomGadget_base)
EndProcedure
;}
;{ Internal common procedure
Procedure ICG_PBGadget_ResizeGadget(*obj.ICG_CustomGadget_base, x, y, width, height)
*obj\x = x
*obj\y = y
*obj\Width = width
*obj\Height = height
ResizeGadget(*obj\Gadget, x, y, width, height)
EndProcedure
Procedure ICG_PBGadget_SetGadgetState(*obj.ICG_CustomGadget_base, State)
SetGadgetState(*obj\Gadget, State)
EndProcedure
Procedure.i ICG_PBGadget_GetGadgetAttribute(*obj.ICG_CustomGadget_base, Attribute)
ProcedureReturn GetGadgetAttribute(*obj\Gadget, Attribute)
EndProcedure
Procedure ICG_PBGadget_SetGadgetAttribute(*obj.ICG_CustomGadget_base, Attribute, Value.i)
SetGadgetAttribute(*obj\Gadget, Attribute, Value)
EndProcedure
Procedure ICG_PBGadget_DisableGadget(*obj.ICG_CustomGadget_base, State)
EndProcedure
Procedure ICG_PBGadget_SetGadgetText(*obj.ICG_CustomGadget_base, Text.s)
SetGadgetText(*obj\Gadget, Text)
EndProcedure
Procedure.s ICG_PBGadget_GetGadgetText(*obj.ICG_CustomGadget_base)
ProcedureReturn GetGadgetText(*obj\Gadget)
EndProcedure
Procedure ICG_PBGadget_AddGadgetItem(*obj.ICG_CustomGadget_base, Position, Text.s, FrontColor.l, Image.l, Redraw.b)
AddGadgetItem(*obj\Gadget, Position, Text, Image)
EndProcedure
Procedure ICG_PBGadget_RemoveGadgetItem(*obj.ICG_CustomGadget_base, Position, Redraw.b)
RemoveGadgetItem(*obj\Gadget, Position)
EndProcedure
Procedure ICG_PBGadget_ClearGadgetItem(*obj.ICG_CustomGadget_base)
ClearGadgetItems(*obj\Gadget)
EndProcedure
Procedure ICG_PBGadget_FreeGadget(*obj.ICG_CustomGadget_base)
FreeGadget(*obj\Gadget)
FreeMemory(*obj)
EndProcedure
;}
DataSection
VTable_PBGadget:
Data.i @ICG_PBGadget_ProcessEvent(), @ICG_PBGadget_Render()
Data.i @ICG_PBGadget_ResizeGadget(), @ICG_PBGadget_SetGadgetState(), @ICG_PBGadget_GetGadgetAttribute(), @ICG_PBGadget_SetGadgetAttribute()
Data.i @ICG_PBGadget_DisableGadget(), @ICG_PBGadget_SetGadgetText(), @ICG_PBGadget_GetGadgetText(), @ICG_PBGadget_AddGadgetItem(), @ICG_PBGadget_RemoveGadgetItem(), @ICG_PBGadget_ClearGadgetItem()
Data.i @ICG_PBGadget_FreeGadget()
EndDataSection
;-
;}####################################################
Le principe ressemble à de la programmation orientée objet (il me semble), ou tout fonctionne avec un pointeur vers l'objet gadget qui regroupe toutes les fonctions qui peuvent agir dessus.
Mais dans le code on n'appelle pas ces fonctions par l'intermédiaire du pointeur, mais avec les fonctions suivante :
Code : Tout sélectionner
Declare CG_ResizeGadget(Gadget, x, y, width, height, *adresse_customgadget.ICG_CustomGadget_base = -1)
Declare CG_GetGadgetState(Gadget)
Declare CG_SetGadgetState(Gadget, State.l)
Declare CG_GetGadgetAttribute(Gadget, Attribute)
Declare CG_SetGadgetAttribute(Gadget, Attribute, Value)
Declare CG_DisableGadget(Gadget, State.b)
Declare.b CG_IsDisableGadget(Gadget)
Declare CG_SetGadgetText(Gadget, Text.s)
Declare.s CG_GetGadgetText(Gadget)
Declare CG_AddGadgetItem(Gadget, Position, Text.s, FrontColor.l, Image.l = -1, Redraw.b = #True)
Declare CG_RemoveGadgetItem(Gadget, Position, Redraw.b = #True)
Declare CG_ClearGadgetItem(Gadget)
Declare CG_FreeGadget(Gadget)
Declare.i CG_LoadFont(FontName.s = "Arial", FontSize.l = 12, FontStyle.l = #CG_Font_Normal)
Declare.i CG_SetDefaultFont(FontName.s = "Arial", FontSize.l = 12, FontStyle.l = #CG_Font_Normal)
Declare.i CG_SetDefaultColorSet(Index)
Declare.i CG_CustomGadget_MemoryHandle(Gadget.l)
Ainsi l'utilisation des gadgets est bien plus transparente et aisée. Tu fais juste un include dans ton code principal, et tu appelles tout les gadgets qui t’intéresse de la même façon que les gadgets natifs PB
En espérant que ça te soit utile.