L'identifiant peut-être l'identifiant statique du gadget ou le handle du gadget
Le 2eme paramètre de la fonction indique quel type d'identifiant est passé en 1er paramètre
_ Soit #PB_staticID pour l'id statique
Soit #PB_DynamicID pour le handle
La fonction retourne -1 si l'id ne correpond pas à un gadget sinon une des constantes définie dans la liste
Pour arriver à ce résultat, il a fallu passer par :
- trouver la class du gadget
lorsque plusieurs gadget ont la même class, j'ai séparé à l'aide de l'existance ou non des adresses de certaines fonctions de ces gadgets (avec l'aide de la table virtuelle des gadgets) pour 5 gadgets et pour certains gadgets, cela ne suffisait pas, j'ai délimité à l'aide des styles.
Pour séparer le TextGadget de l'HyperlinkGadget, j'ai utilisé la valeur $20000 du style mais je ne sais pas à quoi ça correspond (j'ai testé toutes les constantes de style de la classe 'Static' mais sans résultat)
J'espère ne pas avoir oublié de gadget
Code : Tout sélectionner
; Auteur : Denis, Forum Français
; Date : Janvier 2006
; Purebasic Version : jusqu'à la 3.94
; Description
; GetGadgetType(id, IdType)
; IdType : #PB_staticID ou #PB_DynamicID
; La commande permet de tester des gadgets en passant l'identifiant à tester (id)
; L'identifiant peut être l'id statique (#gadget)
; ou le handle (GadgetID(#gadget)
; L'id est le 1er paramètre de la fonction
; Le second paramètre indique le type du 1er paramètre
; #PB_staticID --> le 1er paramètre est l'id statique du gadget
; #PB_DynamicID --> le 1er paramètre est le handle du gadget
Enumeration
#PB_ButtonGadget = 1
#PB_ButtonImageGadget ; 2
#PB_CalendarGadget ; 3
#PB_CheckBoxGadget ; 4
#PB_ComboBoxGadget ; 5
#PB_ContainerGadget ; 6
#PB_DateGadget ; 7
#PB_EditorGadget ; 8
#PB_ExplorerComboGadget ; 9
#PB_ExplorerListGadget ; 10
#PB_ExplorerTreeGadget ; 11
#PB_Frame3DGadget ; 12
#PB_HyperLinkGadget ; 13
#PB_ImageGadget ; 14
#PB_IPAddressGadget ; 15
#PB_ListIconGadget ; 16
#PB_ListViewGadget ; 17
#PB_MDIGadget ; 18
#PB_OptionGadget ; 19
#PB_PanelGadget ; 20
#PB_ProgressBarGadget ; 21
#PB_ScrollAreaGadget ; 22
#PB_ScrollBarGadget ; 23
#PB_SpinGadget ; 24
#PB_SplitterGadget ; 25
#PB_StringGadget ; 26
#PB_TextGadget ; 27
#PB_TrackBarGadget ; 28
#PB_TreeGadget ; 29
#PB_WebGadget ; 30
EndEnumeration
Structure Place_Pile
ZonePile.b[256] ; permet d'utiliser une zone de la pile de 256 octets
; pour stocker une chaîne de caractères directement
; sans passer par les commandes PB ni l'API
EndStructure
Structure GadgetFunctions
FreeGadget.l
GetGadgetState.l
SetGadgetState.l
GetGadgetText.l
SetGadgetText.l
AddGadgetItem.l
AddGadgetItem2.l
RemoveGadgetItem.l
ClearGadgetItemList.l
ResizeGadget.l
CountGadgetItems.l
GetGadgetItemState.l
SetGadgetItemState.l
GetGadgetItemText.l
SetGadgetItemText.l
OpenGadgetList2.l
GadgetX.l
GadgetY.l
GadgetWidth.l
GadgetHeight.l
HideGadget.l
EndStructure
; Les class des différents gadgets
#PB_ListIconGadget_Class = "SysListView32"
#PB_ExplorerListGadget_Class = "SysListView32"
#PB_TreeGadget_Class = "SysTreeView32"
#PB_ExplorerTreeGadget_Class = "SysTreeView32"
#PB_ButtonGadget_Class = "Button"
#PB_ButtonImageGadget_Class = "Button"
#PB_CalendarGadget_Class = "SysMonthCal32"
#PB_CheckBoxGadget_Class = "Button"
#PB_ComboBoxGadget_Class = "ComboBox"
#PB_ContainerGadget_Class = "PureContainer"
#PB_DateGadget_Class = "SysDateTimePick32"
#PB_EditorGadget_Class = "RichEdit20A"
#PB_ExplorerComboGadget_Class = "ComboBoxEx32"
#PB_Frame3DGadget_Class = "Button"
#PB_HyperLinkGadget_Class = "Static"
#PB_ImageGadget_Class = "Static"
#PB_IPAddressGadget_Class = "SysIPAddress32"
#PB_ListViewGadget_Class = "ListBox"
#PB_MDIGadget_Class = "MDIClient"
#PB_OptionGadget_Class = "Button"
#PB_PanelGadget_Class = "SysTabControl32"
#PB_ProgressBarGadget_Class = "msctls_progress32"
#PB_ScrollAreaGadget_Class = "PureScrollArea"
#PB_ScrollBarGadget_Class = "ScrollBar"
#PB_SpinGadget_Class = "Edit"
#PB_SplitterGadget_Class = "PureSplitter"
#PB_StringGadget_Class = "Edit"
#PB_TextGadget_Class = "Static"
#PB_TrackBarGadget_Class = "msctls_trackbar32"
#PB_WebGadget_Class = "AtlAxWin"
#PB_StatusBar_Class = "msctls_statusbar32"
#erreur = -1
#BS_PUSHLIKE = $1000
#PB_staticID = 0 ; indique que c'est l'id statique comme 1er paramètre
#PB_DynamicID = 1 ; indique que c'est le handle comme 1er paramètre
Procedure GetGadgetType(id, idType)
; id est l'id statique passé à tester
; retourne -1 si le l'identifiant n'est pas un identifiant d'un Gadget reconnu
; sinon retourne une des constantes suivantes
; #PB_ButtonGadget
; #PB_ButtonImageGadget
; #PB_CalendarGadget
; #PB_CheckBoxGadget
; #PB_ComboBoxGadget
; #PB_ContainerGadget
; #PB_DateGadget
; #PB_EditorGadget
; #PB_ExplorerComboGadget
; #PB_ExplorerListGadget
; #PB_ExplorerTreeGadget
; #PB_Frame3DGadget
; #PB_HyperLinkGadget
; #PB_ImageGadget
; #PB_IPAddressGadget
; #PB_ListIconGadget
; #PB_ListViewGadget
; #PB_MDIGadget
; #PB_OptionGadget
; #PB_PanelGadget
; #PB_ProgressBar
; #PB_ProgressBarGadget
; #PB_ScrollAreaGadget
; #PB_ScrollBarGadget
; #PB_SpinGadget
; #PB_SplitterGadget
; #PB_StringGadget
; #PB_TextGadget
; #PB_TrackBarGadget
; #PB_TreeGadget
; #PB_WebGadget
Protected resultat.l, Memoire.Place_Pile, *Table.GadgetFunctions, classe.s
resultat = #erreur
If idType = #PB_DynamicID
If IsWindow_(id)
id = GetDlgCtrlID_(id)
EndIf
ElseIf idType <> #PB_staticID
ProcedureReturn resultat
EndIf
*Table = IsGadget(id)
If *Table
; on teste la longueur de la chaîne de la classe du gagdet
Nb_Char = GetClassName_(GadgetID(id), Memoire, 256)
If Nb_Char
classe = PeekS(Memoire)
Select Nb_Char
Case 4
; comparaison avec "Edit" pour SpinGadget ou StringGadget
If classe = "Edit"
; il n'y a pas de fonction GetGadgetState pour StringGadget
; la valeur stocké dans la table virtuelle des gadgets est 0 pour StringGadget
*Table = PeekL(*Table + 4)
If *Table\GetGadgetState
resultat = #PB_SpinGadget
Else
resultat = #PB_StringGadget
EndIf
EndIf
Case 6
; comparaison avec "Static" pour TextGadget ou ImageGadget ou HyperLinkGadget
If classe = "Static"
; il n'y a pas de fonction SetGadgetState pour TextGadget et HyperLinkGadget
; la valeur stocké dans la table virtuelle des gadgets est <> 0 pour ImageGadget
*Table = PeekL(*Table + 4)
If *Table\SetGadgetState
resultat = #PB_ImageGadget
ElseIf GetWindowLong_(GadgetID(id), #GWL_STYLE) & $20000
resultat = #PB_TextGadget
Else
resultat = #PB_HyperLinkGadget
EndIf
; comparaison avec "Button" pour ButtonGadget ou ButtonImageGadget
; ou CheckBoxGadget ou OptionGadget ou Frame3DGadget
ElseIf classe = "Button"
*Table = PeekL(*Table + 4)
; avec la table virtuelle et les fonctions, on ne peut séparer
; que le ButtonImageGadget avec SetGadgetState()
If *Table\SetGadgetState And * Table\GetGadgetState = 0
resultat = #PB_ButtonImageGadget
Else
; on différencie le reste avec les styles
; voir les posts ici mais j'ai modifié pour optiongadget
; http://forums.purebasic.com/english/viewtopic.php?t=14082
; http://forums.purebasic.com/english/viewtopic.php?t=11173
Style = GetWindowLong_(GadgetID(id), #GWL_STYLE)
If Style & #BS_GROUPBOX = #BS_GROUPBOX
resultat = #PB_Frame3DGadget
ElseIf Style & #BS_CHECKBOX = #BS_CHECKBOX Or Style & #BS_AUTOCHECKBOX = #BS_AUTOCHECKBOX Or Style & #BS_3STATE = #BS_3STATE Or Style & #BS_AUTO3STATE = #BS_AUTO3STATE
If Style & #BS_PUSHLIKE = #BS_PUSHLIKE
resultat = #PB_ButtonGadget
Else
resultat = #PB_CheckBoxGadget
EndIf
ElseIf Style & #BS_RADIOBUTTON = #BS_RADIOBUTTON Or Style & #BS_AUTORADIOBUTTON = #BS_AUTORADIOBUTTON
If Style & #BS_PUSHLIKE = #BS_PUSHLIKE
resultat = #PB_ButtonGadget
Else
resultat = #PB_OptionGadget
EndIf
ElseIf Style & #BS_PUSHBUTTON = #BS_PUSHBUTTON Or Style & #BS_DEFPUSHBUTTON = #BS_DEFPUSHBUTTON
resultat = #PB_ButtonGadget
EndIf
EndIf
EndIf
Case 7
; comparaison avec "ListBox" pour le ListViewGadget
If classe = #PB_ListViewGadget_Class
resultat = #PB_ListViewGadget
EndIf
Case 8
; comparaison avec "ComboBox" pour le ComboBoxGadget
If classe = #PB_ComboBoxGadget_Class
resultat = #PB_ComboBoxGadget
; comparaison avec "AtlAxWin" pour le WebGadget
ElseIf classe = #PB_WebGadget_Class
resultat = #PB_WebGadget
EndIf
Case 9
; comparaison avec "MDIClient" pour MDIGadget
If classe = #PB_MDIGadget_Class
resultat = #PB_MDIGadget
; comparaison avec "ScrollBar" pour le ScrollBarGadget
ElseIf classe = #PB_ScrollBarGadget_Class
resultat = #PB_ScrollBarGadget
EndIf
Case 11
; comparaison "RichEdit20A" pour l'EditorGadget
If classe = #PB_EditorGadget_Class
resultat = #PB_EditorGadget
EndIf
Case 12
; comparaison "ComboBoxEx32" pour le ExplorerComboGadget
If classe = #PB_ExplorerComboGadget_Class
resultat = #PB_ExplorerComboGadget
; comparaison avec "PureSplitter" pour le "SplitterGadget
ElseIf classe = #PB_SplitterGadget_Class
resultat = #PB_SplitterGadget
EndIf
Case 13
; comparaison "SysMonthCal32" pour le calendargadget
If classe = #PB_CalendarGadget_Class
resultat = #PB_CalendarGadget
; comparaison "PureContainer" pour le ContainerGadget
ElseIf classe = #PB_ContainerGadget_Class
resultat = #PB_ContainerGadget
; comparaison "SysListView32" pour la ListIconGadget ou l'ExplorerListGadget
ElseIf classe = "SysListView32"
; il n'y a pas de fonction SetGadgetItemState pour l'ExplorerListGadget
; la valeur stocké dans la table virtuelle des gadgets est 0 pour l'ExplorerListGadget
*Table = PeekL(*Table + 4)
If *Table\SetGadgetItemState
resultat = #PB_ListIconGadget
Else
resultat = #PB_ExplorerListGadget
EndIf
; comparaison "SysTreeView32" pour le TreeGadget ou l'ExplorerTreeGadget
ElseIf classe = "SysTreeView32"
; il n'y a pas de fonction SetGadgetItemState pour l'ExplorerTreeGadget
; la valeur stocké dans la table virtuelle des gadgets est 0 pour l'ExplorerTreeGadget
*Table = PeekL(*Table + 4)
If *Table\SetGadgetItemState
resultat = #PB_TreeGadget
Else
resultat = #PB_ExplorerTreeGadget
EndIf
EndIf
Case 14
; comparaison "SysIPAddress32" pour l'IPAddressGadget
If classe = #PB_IPAddressGadget_Class
resultat = #PB_IPAddressGadget
; comparaison avec "PureScrollArea" pour le ScrollAreaGadget
ElseIf classe = #PB_ScrollAreaGadget_Class
resultat = #PB_ScrollAreaGadget
EndIf
Case 15
; comparaison avec "SysTabControl32" pour le PanelGadget
If classe = #PB_PanelGadget_Class
resultat = #PB_PanelGadget
EndIf
Case 17
; comparaison "SysDateTimePick32" pour le DateGadget
If classe = #PB_DateGadget_Class
resultat = #PB_DateGadget
; comparaison avec "msctls_progress32" pour la progressbar
ElseIf classe = #PB_ProgressBarGadget_Class
resultat = #PB_ProgressBarGadget
; comparaison avec "msctls_trackbar32" pour le TrackbarGadget
ElseIf classe = #PB_TrackBarGadget_Class
resultat = #PB_TrackBarGadget
EndIf
EndSelect
EndIf
EndIf
ProcedureReturn resultat
EndProcedure
un code d'essais avec tous les gadgets sauf le MDIgadget (je l'ai testé à part)
Il y a plusieurs lignes de debug en commentaires, il suffit de supprimer le ; devant ligne pour obtenir le résultat
Code : Tout sélectionner
; exemple
Enumeration
#Window
#Explorer
#_ButtonGadget = 11
#_ButtonImageGadget
#_CalendarGadget
#_CheckBoxGadget
#_ComboBoxGadget
#_ContainerGadget
#_DateGadget
#_EditorGadget
#_ExplorerComboGadget ; 19
#_ExplorerListGadget
#_ExplorerTreeGadget
#_Frame3DGadget
#_HyperLinkGadget
#_ImageGadget
#_IPAddressGadget
#_ListIconGadget
#_ListViewGadget ; 27
#_MDIGadget
#_OptionGadget
#_PanelGadget ; 30
#_ProgressBarGadget
#_ScrollAreaGadget
#_ScrollBarGadget
#_SpinGadget
#_SplitterGadget
#_StringGadget
#_TextGadget ; 37
#_TrackBarGadget
#_TreeGadget
#_WebGadget
EndEnumeration
If OpenWindow(#Window, 00, 00, 760, 650, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "")
If CreateGadgetList(WindowID())
CalendarGadget(#_CalendarGadget, 5, 130, 200, 200, 180)
CreateImage(200, 24, 24)
ButtonGadget(#_ButtonGadget, 10, 10, 100, 25, "Essai")
ButtonImageGadget(#_ButtonImageGadget, 10, 40, 100, 25, UseImage(200))
ExplorerListGadget(#_ExplorerListGadget, 120, 10, 200, 100, "C:\", #PB_Explorer_AutoSort | #PB_Explorer_NoDriveRequester | #PB_Explorer_MultiSelect | #PB_Explorer_FullRowSelect)
ListIconGadget(#_ListIconGadget, 212, 130, 155, 100, "Nom", 140, #PB_ListIcon_MultiSelect | #PB_ListIcon_FullRowSelect)
AddGadgetItem(#_ListIconGadget, -1, "ListIconGadget")
ExplorerTreeGadget(#_ExplorerTreeGadget, 350, 10, 200, 100, "C:\", #PB_Explorer_AutoSort | #PB_Explorer_NoDriveRequester | #PB_Explorer_MultiSelect | #PB_Explorer_FullRowSelect)
ExplorerComboGadget(#_ExplorerComboGadget, 570, 80, 150, 60, "C:\")
TreeGadget(#_TreeGadget, 380, 130, 160, 100)
AddGadgetItem(#_TreeGadget, -1, "TreeGadget")
IPAddressGadget(#_IPAddressGadget, 10, 350, 155, 20)
SetGadgetState(#_IPAddressGadget, MakeIPAddress(127, 0, 0, 1))
ListViewGadget(#_ListViewGadget, 212, 243, 155, 90)
AddGadgetItem(#_ListViewGadget, -1, "ListViewGadget")
PanelGadget(#_PanelGadget, 380, 243, 160, 90)
AddGadgetItem(#_PanelGadget, 14, "PanelGadget")
CloseGadgetList()
ProgressBarGadget(#_ProgressBarGadget, 212, 343, 325, 30, 0, 100)
SetGadgetState(#_ProgressBarGadget, 75)
TrackBarGadget(#_TrackBarGadget, 10, 390, 200, 30, 0, 100)
WebGadget(#_WebGadget, 10, 430, 740, 160, "C:\")
DateGadget(#_DateGadget, 10, 600, 180, 25, "Date: %mm/%dd/%yyyy Time: %hh:%ii")
EditorGadget(#_EditorGadget, 200, 600, 306, 33)
StringGadget(#_StringGadget, 570, 10, 180, 20, "StrinGadget")
ScrollAreaGadget(#_ScrollAreaGadget, 570, 140, 180, 60, 0, 100, 10)
CloseGadgetList()
ScrollBarGadget(#_ScrollBarGadget, 10, 70, 100, 25, 0, 100, 10 )
ButtonGadget(110, 10, 10, 100, 25, "Bt1 SplitterGadget")
ButtonGadget(111, 10, 40, 100, 25, "Bt2 SplitterGadget")
SplitterGadget(#_SplitterGadget, 570, 220, 180, 80, 110, 111, #PB_Splitter_Separator)
ContainerGadget(#_ContainerGadget, 570, 320, 180, 100, #PB_Container_Raised)
ButtonGadget(120, 10, 10, 130, 25, "Bt1 ContainerGadget")
ButtonGadget(121, 10, 40, 130, 25, "Bt2 ContainerGadget")
CloseGadgetList()
ImageGadget(#_ImageGadget, 310, 385, 30, 30, UseImage(200) )
HyperLinkGadget(#_HyperLinkGadget, 225, 390, 50, 30, "HyperLink", 255)
TextGadget(#_TextGadget, 480, 390, 70, 30, "TextGadget")
Frame3DGadget(#_Frame3DGadget, 360, 390, 100, 125, "Frame3D")
CheckBoxGadget(#_CheckBoxGadget, 10, 110, 50, 15, "Check")
OptionGadget(#_OptionGadget, 80, 110, 50, 15, "Option")
ComboBoxGadget(#_ComboBoxGadget, 570, 20, 180, 20)
SpinGadget(#_SpinGadget, 570, 50, 180, 20, 1, 50)
SetGadgetState (#_SpinGadget, 5) : SetGadgetText(#_SpinGadget, "5")
; Debug GetGadgetType(#_CalendarGadget, #PB_staticID)
Debug GetGadgetType(#_HyperlinkGadget, #PB_staticID)
Debug GetGadgetType(#_TextGadget, #PB_staticID)
; Debug GetGadgetType(#_ListIconGadget, #PB_staticID)
; Debug GetGadgetType(#_ExplorerListGadget, #PB_staticID)
; Debug GetGadgetType(#_TreeGadget, #PB_staticID)
; Debug GetGadgetType(#_ExplorerTreeGadget, #PB_staticID)
; Debug GetGadgetType(#_IPAddressGadget, #PB_staticID)
; Debug GetGadgetType(#_ListViewGadget, #PB_staticID)
; Debug GetGadgetType(#_PanelGadget, #PB_staticID)
; Debug GetGadgetType(#_ProgressBarGadget, #PB_staticID)
; Debug GetGadgetType(#_TrackBarGadget, #PB_staticID)
; Debug GetGadgetType(#_WebGadget, #PB_staticID)
; Debug GetGadgetType(#_WebGadget, #PB_staticID)
; Debug GetGadgetType(#_StringGadget, #PB_staticID)
; Debug GetGadgetType(#_SpinGadget, #PB_staticID)
; Debug GetGadgetType(#_ScrollAreaGadget, #PB_staticID)
; Debug GetGadgetType(#_ScrollBarGadget, #PB_staticID)
; Debug GetGadgetType(#_SplitterGadget, #PB_staticID)
; Debug GetGadgetType(#_ContainerGadget, #PB_staticID)
Repeat
event = WaitWindowEvent()
If event = #PB_EventCloseWindow
quit + 1
ElseIf event = #PB_EventGadget
If EventGadgetID() = #_SpinGadget
SetGadgetText(#_SpinGadget, Str(GetGadgetState(#_SpinGadget)))
WindowEvent()
EndIf
EndIf
Until quit
EndIf
EndIf
End
Les limites :
Dans le cas des gadgets dont j'utilise les styles, il se pourrait lorsque l'on skin certains gadgets, de ne pas obtenir le bon résultat mais c'est même pas sur.