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

Just starting out? Need help? Post your questions and find answers here.
plabouro472
New User
New User
Posts: 3
Joined: Sat Jun 29, 2024 6:48 am

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

Post 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


Taz
User
User
Posts: 75
Joined: Sat Jan 20, 2018 5:28 pm
Location: Germany

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

Post 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
User avatar
jacdelad
Addict
Addict
Posts: 1991
Joined: Wed Feb 03, 2021 12:46 pm
Location: Riesa

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

Post 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?
Good morning, that's a nice tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Fred
Administrator
Administrator
Posts: 18150
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

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

Post 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)
plabouro472
New User
New User
Posts: 3
Joined: Sat Jun 29, 2024 6:48 am

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

Post 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

Post Reply