Menu système et déplacement de la fenêtre

Sujets variés concernant le développement en PureBasic
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Menu système et déplacement de la fenêtre

Message par Anonyme2 »

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 ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

et en mettant en parent la fenêtre qui représente le bureau ? 8O

ou bien tu la fixe en jouant sur If Event=#WM_MOVE ; si l'on bouge la fenetre !!
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je ne m'explique pas assez Dobro :roll:

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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

L'exemple de Droopy ne te convient pas?

http://purebasic.hmt-forum.com/viewtopic.php?p=36925
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Non, ça retire l'élément, moi je veux juste le griser et désactiver

C'est pour la commande DisableSystemMenuItem() que je suis en train d'écrire
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Merci KarLKoX :D

ça marche

Le problème doit venir de ma librairie car je n'ai fait que des essais sur des menus système ownerdrawn, pas sur le menusystem type

J'adore le titre de la fenêtre
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Encore une chose KarLKoX

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
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

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 :roll:
"Qui baise trop bouffe un poil." P. Desproges
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

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 :roll:
Oui, la, faut quand même pas exagérer.

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"

:lol:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

moi j'aurai preferé qu'il prenne "Fait par Dobro"

:lol: :lol: :lol:
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Chris a écrit :
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 :roll:
Oui, la, faut quand même pas exagérer.

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"

:lol:
:oops: :wink:
"Qui baise trop bouffe un poil." P. Desproges
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

KarLKoX,

ou as-tu trouvé cette valeur de $8000 ?
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

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).
"Qui baise trop bouffe un poil." P. Desproges
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

D'accord mais tu tiens les infos de ou ?

S'il y a 16 bits de poids fort dispo pour l'état de l'éléments, à quoi correspondent-ils ?
Répondre