Page 1 sur 1

parlons des menus ^^ (Fred t'as le droit de participer)

Publié : dim. 15/janv./2006 20:20
par Dr. Dri
d'abord je vais placer une petite question ^^
(que si j'ai la réponse c'est cool =)

Comment connaître (voir même modifier) la police (taille, style et couleur compris) d'un menu sous windows ?

passons au sujet que je voulais lancer ^^

j'ai essayé de comprendre comment fonctionnaient les menus sous windows pour me coder des fonctions supplémentaires et j'ai bloqué sur différents points:



Il m'a fallu du temps avant de comprendre que MenuTitle() ne servait strictement à rien.
Voila un exemple:

Code : Tout sélectionner

If OpenWindow(0, 200, 200, 220, 100, #PB_Window_SystemMenu, "SubMenu Example")
  If CreateMenu(0, WindowID())
    OpenSubMenu("Project") 
      MenuItem(1, "Open")  
      MenuItem(2, "Close")
      MenuBar()
      OpenSubMenu("Recent files")
        MenuItem( 3, "C:\Autoexec.bat")
        MenuItem( 4, "D:\Test.txt")
      CloseSubMenu()
    CloseSubMenu()
    MenuItem(5, "Not a MenuTitle")
    OpenSubMenu("Help") 
      MenuItem(6, "About")
    CloseSubMenu()
  EndIf
  
  Repeat
    
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Menu
      Debug EventMenuID()
    EndIf
    
  Until Event = #PB_Event_CloseWindow
EndIf
C'est l'exemple OpenSubMenu() tiré de l'aide, j'ai remplacé les MenuTitle() par des OpenSubMenu() et j'ai ajouté les CloseSubMenu() qui vont avec et le résultat est identique...

J'ai même pu mettre un MenuItem dans la barre de menu alors que je ne pensais pas ca possible. J'étais persuadé qu'on n'utilisait que MenuTitle() dans la barre de menu... C'est un exemple sur les PopupMenu qui m'a fait tilté, dans le Popup MenuTitle() crée un sous menu.

Le PureBasic se veut simple, mais je trouve que MenuTitle() complique les choses, apres la question est de savoir si ceux sont les autres OS qui créent le besoin d'avoir cette fonction... Votre avis là-dessus ?



MenuID() maintenant...

Cette fonction renvoit l'identifiant du menu en cours, mais je n'ai pas de fonction pour connaitre le menu en cours (pas de UseMenu() ?)
En plus MenuID ne permet pas de préciser de numéro de menu, pourtant ce serait très pratique...

z'en pensez quoi ?



Bon apres y'a toutes les fonctions que j'aimerais avoir en natif que j'ai pu coder une fois que j'avais zapé le probleme des MenuTitle()

Code : Tout sélectionner

Procedure.l GetMenuItemCount(MenuID.l)
  ProcedureReturn GetMenuItemCount_(MenuID)
EndProcedure

Procedure.l IsMenuID(MenuID.l)
  Protected IsMenuID
  
  If GetMenuItemCount(MenuID) <> #Menu_Error
    IsMenuID = #True
  EndIf
  
  ProcedureReturn IsMenuID
EndProcedure

Procedure.l IsMenuItem(MenuID.l, Position.l)
  ProcedureReturn GetMenuItemID_(MenuID, Position)
EndProcedure

Procedure.l IsSubMenu(MenuID.l, Position.l)
  ProcedureReturn GetSubMenu_(MenuID, Position)
EndProcedure

Procedure.l IsMenuBar(MenuID.l, Position.l)
  Protected IsMenuBar
  
  If IsMenuID(MenuID)
    If IsMenuItem(MenuID, Position) = #Menu_Error And IsSubMenu(MenuID, Position) = #False
      IsMenuBar = #True
    EndIf
  EndIf
  
  ProcedureReturn IsMenuBar
EndProcedure

Procedure.s GetMenuText(MenuID.l, MenuItem.l, ByPosition.l)
  Protected String.s, MenuItemInfo.MenuItemInfo
  
  String = Space($FF)
  
  MenuItemInfo\cbSize     = SizeOf(MenuItemInfo)
  MenuItemInfo\fMask      = #MIIM_TYPE
  MenuItemInfo\fType      = #MFT_STRING
  MenuItemInfo\dwTypeData = @String
  MenuItemInfo\cch        = $FF
  
  If GetMenuItemInfo_(MenuID, MenuItem, ByPosition, MenuItemInfo) = #False
    String = #NULL$
  EndIf
  
  ProcedureReturn String
EndProcedure

Procedure.l SetMenuText(MenuID.l, MenuItem.l, ByPosition.l, String.s)
  Protected MenuItemInfo.MenuItemInfo
  
  MenuItemInfo\cbSize     = SizeOf(MenuItemInfo)
  MenuItemInfo\fMask      = #MIIM_TYPE
  MenuItemInfo\fType      = #MFT_STRING
  MenuItemInfo\dwTypeData = @String
  MenuItemInfo\cch        = Len(String)
  
  ProcedureReturn SetMenuItemInfo_(MenuID, MenuItem, ByPosition, MenuItemInfo)
EndProcedure
Dri :)

Publié : lun. 16/janv./2006 7:47
par Anonyme2
t'as essayé ma lib MoreMenu 3.40 (la 4.00 est en cours mais j'ai la flemme en ce moment)

J'essayerais de répondre à ta question sur les polices, couleurs etc pour windows en prenant un exemple

Publié : lun. 16/janv./2006 9:07
par Chris
Manque aussi la possibilité de mettre des icônes dans les menus.

Mais je le met pas dans la liste officielle, sinon Fred va nous retarder la v4.00 de 15 jours :lol:

Publié : lun. 16/janv./2006 13:58
par Dr. Dri
Denis a écrit :t'as essayé ma lib MoreMenu 3.40 (la 4.00 est en cours mais j'ai la flemme en ce moment)

J'essayerais de répondre à ta question sur les polices, couleurs etc pour windows en prenant un exemple
J'ai bien aimé ta lib ^^
Mais j'avais codé une fonction qui charge un menu (resource) et le rend utilisable avec les fonctions natives de PB
Du coup j'ai trouvé que la lib native de PB était un peu vide
Et quand jme suis penché dessus bah ca a donné le post au dessus...

Pour ma question j'ai trouvé tout seul comme un grand en épluchant le win32.hlp ^^
y'a GetSysColor_() et SystemParametersInfo_()

Dri :)