; 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 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