Page 1 of 1

ImageMenu : Image changes in menus are no longer updated with PB 6.21 Windows.

Posted: Sat Jun 21, 2025 6:31 am
by plabouro472
With version 6.20, the code below works perfectly.
Since version 6.21, the colors are no longer updated.
Is this a bug or an intended change?


ImageMenu : Les changements d'image dans les menus ne sont plus actualiser avec PB 6.21 Window.
Avec la version 6.20, le code ci-dessous fonctionne parfaitement.
depuis la version 6.21, les couleurs ne sont plus mises à jour.
Est-ce là un BUG ou une modification voulue ?

Code: Select all

 

; Version PB 6.20 : Les changements de couleur s'effectuent correctement
; Version PB 6.21 : Les changements de couleur ne sont plus mises à jour

Global .s Titre   = "Test"

Global .i ColAiguilleH = #Red
Global .i ColAiguilleM = #Green
Global .i ColAiguilleS = #Blue


Enumeration FormMenu
 #MenuItem_CouleurH
 #MenuItem_CouleurM
 #MenuItem_CouleurS
 
 #MenuItem_Quitter
EndEnumeration

Global .i Image_Couleur_Heure   = CreateImage  ( #PB_Any , 16 , 16 , 32 )
Global .i Image_Couleur_Minute   = CreateImage  ( #PB_Any , 16 , 16 , 32 )
Global .i Image_Couleur_Seconde   = CreateImage  ( #PB_Any , 16 , 16 , 32 )

StartDrawing ( ImageOutput( Image_Couleur_Heure  ) )
 Box   ( 0 , 0 , 16 , 16 , ColAiguilleH )
StopDrawing  ( )
StartDrawing ( ImageOutput( Image_Couleur_Minute ) )
 Box   ( 0 , 0 , 16 , 16 , ColAiguilleM )
StopDrawing  ( )
StartDrawing ( ImageOutput( Image_Couleur_Seconde ) )
 Box   ( 0 , 0 , 16 , 16 , ColAiguilleS )
StopDrawing  ( )


Global .i Option = #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_BorderLess
Global .i Win_0 = OpenWindow(#PB_Any, #PB_Ignore , #PB_Ignore , 300 , 200, Titre , Option )
WindowBounds ( Win_0 , 300 , 200 , #PB_Ignore , #PB_Ignore ) 
SetWindowColor ( Win_0 , #Black )
CreateImageMenu ( 0  , WindowID( Win_0 ) )
MenuTitle("Menu")

OpenSubMenu("Couleur")
MenuItem( #MenuItem_CouleurH , "Heure" , ImageID( Image_Couleur_Heure ) )
MenuItem( #MenuItem_CouleurM , "Minute" , ImageID( Image_Couleur_Minute ) )
MenuItem( #MenuItem_CouleurS , "Seconde" , ImageID( Image_Couleur_Seconde ) )
CloseSubMenu()

MenuBar()
MenuItem( #MenuItem_Quitter , "Quitter" )


;*********************
;* Boucle principale *
;*********************
;- Boucle de gestion des evenements
Repeat
 Evenement = WaitWindowEvent( )
 
 Select Evenement
 Case #PB_Event_CloseWindow ;{
  End
  ;}
 Case #PB_Event_Menu   ;{
  Select EventMenu()
  Case #MenuItem_CouleurH ;{
   Couleur = ColorRequester()
   If Couleur > -1
   ColAiguilleH = Couleur
   StartDrawing( ImageOutput( Image_Couleur_Heure ) )
    Box( 0 , 0 , 16 , 16 , ColAiguilleH )
   StopDrawing()
   EndIf
   ;}
  Case #MenuItem_CouleurM ;{
   Couleur = ColorRequester()
   If Couleur > -1
   ColAiguilleM = Couleur
   StartDrawing( ImageOutput( Image_Couleur_Minute ) )
    Box( 0 , 0 , 16 , 16 , ColAiguilleM )
   StopDrawing()
   EndIf
   ;}
  Case #MenuItem_CouleurS ;{
   Couleur = ColorRequester()
   If Couleur > -1
   ColAiguilleS = Couleur
   StartDrawing( ImageOutput( Image_Couleur_Seconde ) )
    Box( 0 , 0 , 16 , 16 , ColAiguilleS )
   StopDrawing()
   EndIf
   ;}
   
  Case #MenuItem_Quitter ;{
   End
   ;}
  EndSelect
  ;}
  
 EndSelect
 
 
Until Evenement = #PB_Event_CloseWindow



Re: ImageMenu : Image changes in menus are no longer updated with PB 6.21 Windows.

Posted: Sat Jun 21, 2025 8:27 am
by Taz
If you reset the menuItem after changing the image, it works again. But I'm not sure if that's the correct way to do it.

Code: Select all

  Case #MenuItem_CouleurH ;{
   Couleur = ColorRequester()
   If Couleur > -1
   ColAiguilleH = Couleur
   StartDrawing( ImageOutput( Image_Couleur_Heure ) )
    Box( 0 , 0 , 16 , 16 , ColAiguilleH )
    StopDrawing()
    MenuItem( #MenuItem_CouleurH , "Heure" , ImageID( Image_Couleur_Heure ) )
   EndIf

Re: ImageMenu : Image changes in menus are no longer updated with PB 6.21 Windows.

Posted: Sat Jun 21, 2025 8:38 am
by jacdelad
It's definitely not wrong. Looks like the image is cached somewhere after assigning it to the menu. Maybe the Manu has an Image list, like ListViews do?

Re: ImageMenu : Image changes in menus are no longer updated with PB 6.21 Windows.

Posted: Sat Jun 21, 2025 10:03 am
by Fred
It's the expected behavior, you need to refresh explicitly the image if you want a change (it was actually a bug in 6.20 as all images used for gadget, menu etc. should be duplicated)

Re: ImageMenu : Image changes in menus are no longer updated with PB 6.21 Windows.

Posted: Sat Jun 21, 2025 12:40 pm
by plabouro472
Taz wrote: Sat Jun 21, 2025 8:27 am If you reset the menuItem after changing the image, it works again. But I'm not sure if that's the correct way to do it.

Code: Select all

  Case #MenuItem_CouleurH ;{
   Couleur = ColorRequester()
   If Couleur > -1
   ColAiguilleH = Couleur
   StartDrawing( ImageOutput( Image_Couleur_Heure ) )
    Box( 0 , 0 , 16 , 16 , ColAiguilleH )
    StopDrawing()
    MenuItem( #MenuItem_CouleurH , "Heure" , ImageID( Image_Couleur_Heure ) )
   EndIf
La commande :
MenuItem( #MenuItem_CouleurH , "Heure" , ImageID( Image_Couleur_Heure ) )
Change bien l'image mais ajoute aussi un menu supplémentaire.

The command:
MenuItem( #MenuItem_CouleurH , "Heure" , ImageID( Image_Couleur_Heure ) )
Changes the image but also adds an additional menu.


Voice la solution que je propose :
créer une procedure qui supprime complétement le menu puis le génère à nouveau.
De cette façon, le menu contiendra les nouvelles images.
Elle sera appelée à chaque changement d'image.

A solution I propose:
Create a procedure that completely deletes the menu and then regenerates it.
This way, the menu will contain the new images.
It will be called every time the image changes.

Voici le nouveau code :
Here's the new code:

Code: Select all

 

; Version PB 6.21 :
; Les changements de couleur sont maitenant mise à jour
; Color changes are now updated

Global .s Titre = "Test"

Global .i ColAiguilleH = #Red
Global .i ColAiguilleM = #Green
Global .i ColAiguilleS = #Blue

; Rendu Global car utilisé dans la procedure : RefreshMenu( )
; Global rendering because used in the procedure:
Global .i Win_0
Global .i MonMenu


Enumeration FormMenu
 #MenuItem_CouleurH
 #MenuItem_CouleurM
 #MenuItem_CouleurS
 
 #MenuItem_Quitter
EndEnumeration

; Initialisation des images de menu
; Initializing menu images
Global .i Image_Couleur_Heure = CreateImage ( #PB_Any , 16 , 16 , 32 )
Global .i Image_Couleur_Minute = CreateImage ( #PB_Any , 16 , 16 , 32 )
Global .i Image_Couleur_Seconde = CreateImage ( #PB_Any , 16 , 16 , 32 )
StartDrawing ( ImageOutput( Image_Couleur_Heure ) )
 Box ( 0 , 0 , 16 , 16 , ColAiguilleH )
StopDrawing ( )
StartDrawing ( ImageOutput( Image_Couleur_Minute ) )
 Box ( 0 , 0 , 16 , 16 , ColAiguilleM )
StopDrawing ( )
StartDrawing ( ImageOutput( Image_Couleur_Seconde ) )
 Box ( 0 , 0 , 16 , 16 , ColAiguilleS )
StopDrawing ( )


Procedure RefreshMenu ( ) ; Menu creation
; On supprime le menu complétement
; We remove the menu completely
 If IsMenu( MonMenu ) : FreeMenu( MonMenu ) : EndIf
 
; puis on le régénére avec les nouvelles images modifiées
; then we regenerate it with the new modified images
 MonMenu = CreateImageMenu( #PB_Any , WindowID( Win_0 ) )
 MenuTitle("Menu")
 
 OpenSubMenu("Couleur")
 MenuItem( #MenuItem_CouleurH , "Heure" , ImageID( Image_Couleur_Heure ) )
 MenuItem( #MenuItem_CouleurM , "Minute" , ImageID( Image_Couleur_Minute ) )
 MenuItem( #MenuItem_CouleurS , "Seconde" , ImageID( Image_Couleur_Seconde ) )
 CloseSubMenu()
 
 MenuBar()
 MenuItem( #MenuItem_Quitter , "Quitter" )
 
EndProcedure


; Création de la fenêtre
; Window creation
Option = #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_BorderLess
Win_0 = OpenWindow(#PB_Any, #PB_Ignore , #PB_Ignore , 300 , 200, Titre , Option )
SetWindowColor ( Win_0 , #Black )

; Création du menu
; Menu creation
RefreshMenu ( )


;*********************
;* Boucle principale *
;*********************
;- Boucle de gestion des evenements
Repeat
 Evenement = WaitWindowEvent( )
 
 Select Evenement
 Case #PB_Event_CloseWindow ;{
 End
 ;}
 Case #PB_Event_Menu ;{
 Select EventMenu()
 Case #MenuItem_CouleurH ;{
 Couleur = ColorRequester()
 If Couleur > -1
 ColAiguilleH = Couleur
 StartDrawing( ImageOutput( Image_Couleur_Heure ) )
 Box( 0 , 0 , 16 , 16 , ColAiguilleH )
 StopDrawing()
 RefreshMenu ( ) ; Menu creation
 EndIf
 ;}
 Case #MenuItem_CouleurM ;{
 Couleur = ColorRequester()
 If Couleur > -1
 ColAiguilleM = Couleur
 StartDrawing( ImageOutput( Image_Couleur_Minute ) )
 Box( 0 , 0 , 16 , 16 , ColAiguilleM )
 StopDrawing()
 RefreshMenu ( ) ; Menu creation
 EndIf
 ;}
 Case #MenuItem_CouleurS ;{
 Couleur = ColorRequester()
 If Couleur > -1
 ColAiguilleS = Couleur
 StartDrawing( ImageOutput( Image_Couleur_Seconde ) )
 Box( 0 , 0 , 16 , 16 , ColAiguilleS )
 StopDrawing()
 RefreshMenu ( ) ; Menu creation
 EndIf
 ;}
 
 Case #MenuItem_Quitter ;{
 End
 ;}
 EndSelect
 ;}
 
 EndSelect
 
 
Until Evenement = #PB_Event_CloseWindow