Le code suivant fonctionne bien sous PB 4.41 mais avec la 4.60 beta 2, il y a un problème.
Le code utilise une toolbar avec les API (subclassée) et lorsque l'on clique sur le bouton de la toolbar, une fenêtre s'ouvre et si on la referme avec la croix ou avec la combinaison Alt F4, les 2 fenêtres se ferment.
Ce code fonctionne bien sous PB 4.41, 4.50 je ne sais pas je ne l'ai pas.
L'erreur se produit avec PB 4.60 beta 2 sous Seven, XP home edition, Vista home edition.
Si on ajoute un While WindoEvent() WEND dans la procedure A_Propos_De() juste après CloseWindow(#A_Propos_De), seule la fenêtre A propos de se ferme, ce qui est normal.
J'ai mis While WindoEvent() WEND en commentaire lignes 43-44
Il y a peut-être un truc qui m'échappe. Le subclassing est fait avec SetProp_ et GetProp_ mais avec l'ancienne manière ont a toujours le problème.
Vous avez une idée avant que je balance sur le forum de anglais ?
Code : Tout sélectionner
EnableExplicit
#TBSTYLE_AUTOSIZE = $10
#Option_Fenetre = #PB_Window_SystemMenu | #PB_Window_MaximizeGadget| #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered
#OriginProc_MainToolBar = "OriginProc_MainToolBar"
#MainWindow = 0
#A_Propos_De = 1
#Button_Ok_About = 0
#Bouton_Apropos = 500
Global Old_Window_Proc, ImageList_Toolbar, h_Main_ToolBar
Global Image, Mask, hMainWindow
Global Item.TBBUTTON
Procedure A_Propos_De()
Protected eventGadget
If OpenWindow(#A_Propos_De, 0, 0, 518+1+60, 350+30, "essai" , #PB_Window_SystemMenu|#PB_Window_ScreenCentered, WindowID(#MainWindow))
If ButtonGadget(#Button_Ok_About, WindowWidth(#A_Propos_De)-80, WindowHeight(#A_Propos_De)-40, 50, 20, "Ok", #PB_Button_Default)
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
eventGadget = EventGadget()
Select eventGadget
Case #Button_Ok_About
Break
EndSelect
Case #PB_Event_CloseWindow
Debug "#PB_Event_CloseWindow"
If EventWindow() = #A_Propos_De
Debug "EventWindow() = #A_Propos_De"
Break
EndIf
EndSelect
ForEver
EndIf
CloseWindow(#A_Propos_De)
; While WindowEvent()
; Wend
EndIf
EndProcedure
Procedure CleanUp()
;// détruit la ListImage si existe
If ImageList_Toolbar
ImageList_Destroy_(ImageList_Toolbar)
Debug "Image_List détruite"
EndIf
If h_Main_ToolBar
;// destruction de la fenêtre ToolBar
DestroyWindow_(h_Main_ToolBar)
Debug "h_Main_ToolBar détruite"
EndIf
If Old_Window_Proc
If IsWindow(#MainWindow)
SetWindowLongPtr_(WindowID(#MainWindow), #GWL_WNDPROC, Old_Window_Proc)
EndIf
EndIf
EndProcedure
Procedure.i MainToolBarCallBack(Window, Message, wParam, lParam)
Protected ReturnValue = GetProp_(WindowID(#MainWindow), #OriginProc_MainToolBar)
ReturnValue = CallWindowProc_(ReturnValue, WindowID(#MainWindow), Message, wParam, lParam)
Select Message
Case #WM_COMMAND
Select (wParam & $FFFF) ; l'identifiant statique du bouton
Case #Bouton_Apropos
A_Propos_De()
ProcedureReturn 0
EndSelect
EndSelect
ProcedureReturn ReturnValue
EndProcedure
Image=CreateImage(#PB_Any,25,25,24)
StartDrawing(ImageOutput(Image))
Box(1,1,25,25,$FF0000)
StopDrawing()
Mask=CreateImage(#PB_Any,25,25,24)
If Mask And StartDrawing(ImageOutput(Mask))
Box(0,0,24,24,0)
StopDrawing()
EndIf
hMainWindow = OpenWindow(#MainWindow, 0, 0, 980, 650, "Essai", #Option_Fenetre)
#Flag=#WS_CHILD|#TBSTYLE_AUTOSIZE|#CCS_NODIVIDER|#TBSTYLE_TRANSPARENT|#WS_VISIBLE|#TBSTYLE_FLAT
h_Main_ToolBar=CreateWindowEx_(0,"ToolbarWindow32",0, #Flag,0,0,0,0,hMainWindow,0,0,0)
;// subclass la toolbar (fenêtre principale pour les événements comme WM_COMMAND etc)
Old_Window_Proc = SetWindowLongPtr_(hMainWindow, #GWL_WNDPROC, @MainToolBarCallBack())
If Old_Window_Proc
SetProp_(hMainWindow, #OriginProc_MainToolBar, Old_Window_Proc)
EndIf
SendMessage_(h_Main_ToolBar, #TB_BUTTONSTRUCTSIZE, SizeOf(TBBUTTON), 0)
ImageList_Toolbar = ImageList_Create_(25,25,#ILC_MASK|#ILC_COLOR24,1,1)
ImageList_Add_(ImageList_Toolbar,ImageID(Image),ImageID(Mask))
SendMessage_(h_Main_ToolBar,#TB_SETIMAGELIST,0,ImageList_Toolbar)
Item\iBitmap=0
Item\idCommand=#Bouton_Apropos
Item\fsState=#TBSTATE_ENABLED
Item\dwData=0
Item\fsStyle=0
Item\iString=0
SendMessage_(h_Main_ToolBar,#TB_INSERTBUTTON,0,Item)
;- Boucle
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
If EventWindow() = #MainWindow
CleanUp()
Break
EndIf
EndSelect
ForEver
End