Menu système et déplacement de la fenêtre
Menu système et déplacement de la fenêtre
J'ai testé plein de choses mais je n'arrive pas à griser et désactiver l'élément du menu système qui permet de déplacer la fenêtre (élément Déplacer)
Avec RemoveMenu_(), on supprime l'élément et la fenêtre ne se déplace plus mais ce n'est pas ce que je cherche.
J'ai essayé avec SetMenuInfo, ModifyMenu, EnableMenu_, setwindowpos_() mais jamais l'élément ne s'est grisé et désactivé, j'ai même supprimé l'élément puis je l'ai rajouté mais sans succès.
Le système le grise au moins dans un cas c'est lorsque la fenêtre est maximisée quand on utilise le bouton en haut à droite pour le faire
Sur internet, je n'ai pas trouvé et sur un forum anglais un intervenant a dit que c'était impossible.
Avez-vous déjà fait ça et si oui comment ?
Avec RemoveMenu_(), on supprime l'élément et la fenêtre ne se déplace plus mais ce n'est pas ce que je cherche.
J'ai essayé avec SetMenuInfo, ModifyMenu, EnableMenu_, setwindowpos_() mais jamais l'élément ne s'est grisé et désactivé, j'ai même supprimé l'élément puis je l'ai rajouté mais sans succès.
Le système le grise au moins dans un cas c'est lorsque la fenêtre est maximisée quand on utilise le bouton en haut à droite pour le faire
Sur internet, je n'ai pas trouvé et sur un forum anglais un intervenant a dit que c'était impossible.
Avez-vous déjà fait ça et si oui comment ?
Je ne m'explique pas assez Dobro
en utilisant uniquement les APIS pour modifier les menus, pas en attribuant une fenêtre parent, c'est pour la librairie des menus en couleurs
Normalement Enablemenu_() fonctionne avec des menus et popup classiques mais avec le menu système c'est pas la même
Enablemenu_() ne fonctionne que pour la fermeture de la fenêtre mais pas pour les autres éléments du menu mais j'ai réussi pour tous les éléments sauf pour le déplacement et la restauration de la fenêtre
Il me reste la solution de supprimer l'élément et de le remplacer par un élément classique et de traiter dans la boucle mais je préfèrerais y arriver autrement

en utilisant uniquement les APIS pour modifier les menus, pas en attribuant une fenêtre parent, c'est pour la librairie des menus en couleurs
Normalement Enablemenu_() fonctionne avec des menus et popup classiques mais avec le menu système c'est pas la même
Enablemenu_() ne fonctionne que pour la fermeture de la fenêtre mais pas pour les autres éléments du menu mais j'ai réussi pour tous les éléments sauf pour le déplacement et la restauration de la fenêtre
Il me reste la solution de supprimer l'élément et de le remplacer par un élément classique et de traiter dans la boucle mais je préfèrerais y arriver autrement
Code : Tout sélectionner
#MIIM_STATE = $1
#MIIM_ID = $2
#MIIM_SUBMENU = $4
#MIIM_CHECKMARKS = $8
#MIIM_TYPE = $10
#MIIM_DATA = $20
Procedure GetMenuItemState2(hMenu.l, nPosition.l)
Protected mii.MENUITEMINFO
mii\cbSize = SizeOf(mii)
mii\fMask = #MIIM_STATE
GetMenuItemInfo_(hMenu, nPosition, #MF_BYPOSITION, mii)
ProcedureReturn mii\fState
EndProcedure
Procedure GetMenuItemPosition(nItem)
Protected hMenu.l
Protected ID.l
Protected counter.l, nCount.l
Protected highBit.l
highBit = $8000
hMenu = GetSystemMenu_(WindowID(), #False)
nCount = GetMenuItemCount_(hMenu)
For counter = 0 To nCount
ID = GetMenuItemID_(hMenu, counter)
If ID = nItem
ProcedureReturn counter
ElseIf ID = (nItem & ~highBit)
nItem = counter
ProcedureReturn counter
EndIf
Next counter
EndProcedure
Procedure EnableMenuItem(nItem.l, Enabled.l)
Protected hMenu.l, itemIndex.l
Protected mii.MENUITEMINFO
Protected highBit.l
highBit = $8000
hMenu = GetSystemMenu_(WindowID(), #False)
itemIndex = GetMenuItemPosition(nItem)
If itemIndex >= 0
mii\cbSize = SizeOf(mii)
mii\fMask = #MIIM_STATE | #MIIM_ID | #MIIM_DATA | #MIIM_TYPE
mii\dwTypeData = AllocateMemory(80)
mii\cch = Len(PeekS(mii\dwTypeData))
GetMenuItemInfo_(hMenu, itemIndex, #MF_BYPOSITION, mii)
If Enabled
mii\fState = #MF_ENABLED
Else
mii\fState = #MF_GRAYED
EndIf
If Enabled
mii\wID = nItem
Else
mii\wID = nItem & ~highBit
EndIf
mii\fMask = #MIIM_STATE | #MIIM_ID
SetMenuItemInfo_(hMenu, itemIndex, #MF_BYPOSITION, mii)
EndIf
EndProcedure
Procedure SetMoveable()
Protected isMoveable
isMoveable = GetMenuItemState2(GetSystemMenu_(WindowID(), #False), GetMenuItemPosition(#SC_MOVE))
EnableMenuItem(#SC_MOVE, isMoveable)
EndProcedure
If OpenWindow(0,0,0,250,105,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Pouet")
If CreateGadgetList(WindowID(0))
ButtonGadget(0,10,15,230,30,"Active/Désactive le déplacement")
Else
MessageRequester("Erreur", "Impossible de créer la liste des gadgets")
End
EndIf
Repeat
event.l = WaitWindowEvent()
If event = #PB_EventGadget
If EventGadgetID() = 0
SetMoveable()
EndIf
EndIf
Until event = #PB_Event_CloseWindow
EndIf
"Qui baise trop bouffe un poil." P. Desproges
Encore une chose KarLKoX
la structure de PureBasic MENUITEMINFO est fausse, il manque une élément
la voici corrigée
la structure de PureBasic MENUITEMINFO est fausse, il manque une élément
la voici corrigée
Code : Tout sélectionner
Structure ma_MENUITEMINFO
cbSize.l
fMask.l
fType.l
fState.l
wID.l
hSubMenu.l
hbmpChecked.l
hbmpUnchecked.l
dwItemData.l
dwTypeData.l
cch.l
hbmpItem.l
EndStructure
Oui, la, faut quand même pas exagérer.KarLKoX a écrit :Yopla
Je n'avais pas fait attention à la structure mais tu as raison, il manque le dernier élément, c'est bon à savoir.
Oui pour le titre de la fenêtre, j'ai manqué d'inspiration, je vais essayer de faire mieux (ou pire c'est selon) la prochaine fois
C'est quoi, ce titre? Franchement.
C'est pourtant pas les choix qui manquent.
"Tut tut", "Coin coin", "Bip bip", "Glop", etc...
Et même, mais là, j'avoue, c'est quand même osé, "Fenêtre"

Chris a écrit :Oui, la, faut quand même pas exagérer.KarLKoX a écrit :Yopla
Je n'avais pas fait attention à la structure mais tu as raison, il manque le dernier élément, c'est bon à savoir.
Oui pour le titre de la fenêtre, j'ai manqué d'inspiration, je vais essayer de faire mieux (ou pire c'est selon) la prochaine fois
C'est quoi, ce titre? Franchement.
C'est pourtant pas les choix qui manquent.
"Tut tut", "Coin coin", "Bip bip", "Glop", etc...
Et même, mais là, j'avoue, c'est quand même osé, "Fenêtre"


"Qui baise trop bouffe un poil." P. Desproges
wID = 16 bits
Sachant que windows utilise les bits de poid fort pour savoir si le menu est activé ou pas, pour désactiver le menu il faut inverser les bits de poid fort via le mask de bits $8000 qui correspond au poid fort max (32768 + 32768 = low + high = 65536 = 16 bits).
Sachant que windows utilise les bits de poid fort pour savoir si le menu est activé ou pas, pour désactiver le menu il faut inverser les bits de poid fort via le mask de bits $8000 qui correspond au poid fort max (32768 + 32768 = low + high = 65536 = 16 bits).
"Qui baise trop bouffe un poil." P. Desproges