J'ai quelques questions qui me chagrinent depuis mes débuts avec PB concernant les menus.
Ce n'est pas dans la conception des menus que je bloque, mais avec leur utilisation.
-Le fait de cliquer sur un menu de la barre des menus gèle l'application. Si l"application contient des timers, ceux-ci sont bloqués tant qu'on ne relâche pas le menu.
-Après avoir lancé une tache via menu ou bouton, la tache se gèle si on sélectionne un menu. J'ai pourtant un DoEvents() dans mes taches.
-Dans la barre des menus, cliquer sur un menu sans sous menu ne permet pas de déclencher une action.
Questions:
-peut-on utiliser un Thread pour ses timers et cela fonctionne-t-il correctement
-peut-on rendre la barre de menus non opérationnelle tant qu'une tache se déroule en "batch"
L'interface n'est pas bloquée, mais une action sur un menu bloque la tache.
-peut-on déclencher une action par simple clic sur un menu de la barre des menus.
c'est a dire sans sélectionner un sous menu.
Dans l'application en exemple, l'heure est affichée dans la barre de titre ainsi que le compteur de boucle du Timer
Tant qu'on ne fait rien, tout est normal. Dès qu'on sélectionne un menu, arrêt de l'heure et du compteur. Si on relâche le menu, l'heure s'affiche normalement, mais on voit que le compteur continu la ou il était resté.
Le menu "~" comporte un sous menu qui permet de faire un roll on/off de la fenêtre.
Je voudrais faire la même chose juste en appuyant sur le menu "~" ???
Cela fait beaucoup de lecture, alors j'arrête la.
Place au code. D'avance, merci pour votre aide.
Code : Tout sélectionner
EnableExplicit
#WinApp=10 : #WinAppWidth = 553 : #WinAppHeight = 416
#TITLE$ = "APP Light Edition"
Global Event, indexMenu
Enumeration Menus
#MenuApp
EndEnumeration
Enumeration FormMenu
#MenuAppQuit
#MenuAppRoll
EndEnumeration
Enumeration Timer
#Timer
EndEnumeration
Declare winRoll()
Declare setTitle()
ExamineDesktops()
Define X = (DesktopWidth(0)-#WinAppWidth)/2
Define Y = (DesktopHeight(0)-#WinAppHeight)/2
Define Flags = #PB_Window_TitleBar|#PB_Window_ScreenCentered|#PB_Window_Minimize|#PB_Window_SystemMenu
If OpenWindow(#WinApp, X, Y, #WinAppWidth, #WinAppHeight, #TITLE$, Flags)
If CreateImageMenu(#MenuApp, WindowID(#WinApp), #PB_Menu_ModernLook)
MenuTitle("File")
MenuItem(#MenuAppQuit , "Exit"+Chr(9)+"Ctrl+Q")
MenuTitle("~")
MenuItem(#MenuAppRoll , "Roll up")
EndIf
AddWindowTimer(#WinApp, #Timer, 1000)
AddKeyboardShortcut(#WinApp, #PB_Shortcut_Escape, #MenuAppQuit) ; quit with ESC
AddKeyboardShortcut(#WinApp, #PB_Shortcut_Control|#PB_Shortcut_Q, #MenuAppQuit) ; quit with CTRL+Q
AddKeyboardShortcut(#WinApp, #PB_Shortcut_Control|#PB_Shortcut_R, #MenuAppRoll) ; win roll with CTRL+R
SetWindowState(#WinApp, #PB_Window_Normal)
HideWindow(#WinApp, #False, #PB_Window_ScreenCentered)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Menu
indexMenu = EventMenu()
Select indexMenu
Case #MenuAppQuit : Break
Case #MenuAppRoll : winRoll()
EndSelect
Case #PB_Event_CloseWindow : Break
Case #PB_Event_Timer : setTitle()
EndSelect
ForEver
EndIf
End
Procedure getTitleHeight(frm)
Protected MyRect.RECT
GetClientRect_(WindowID(frm), MyRect)
ProcedureReturn #WinAppHeight - MyRect\bottom
EndProcedure
Procedure winRoll()
If WindowHeight(#WinApp) = #WinAppHeight
SetMenuItemText(#MenuApp, #MenuAppRoll, "Roll down")
StickyWindow(#WinApp, #True)
ResizeWindow(#WinApp, #PB_Ignore, #PB_Ignore, 250, getTitleHeight(#WinApp))
Else
SetMenuItemText(#MenuApp, #MenuAppRoll, "Roll up")
StickyWindow(#WinApp, #False)
ResizeWindow(#WinApp, #PB_Ignore, #PB_Ignore, #WinAppWidth, #WinAppHeight)
EndIf
EndProcedure
Procedure setTitle()
Protected Now$
Static count
Now$ = FormatDate("%hh:%ii:%ss", Date())
SetWindowTitle(#WinApp, #TITLE$+" : "+Now$+" : "+Str(count))
count+1
EndProcedure
Procedure.a doEvents(loop.a=255)
Protected n.a
For n = 0 To loop
WindowEvent()
n + 1
Next
EndProcedure