OpenToolWindow()

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

OpenToolWindow()

Message par Guimauve »

Je n'ai pas vraiment cherché sur le forum si un code existait pour faire ça.

J'ai créé une petite libraire pour créer des fenètres de type outil, barre de titre réduite. Le fonctionnement est presque identique à la création d'une fenètre normale.

Le but est de créer une petite fenètre sur laquelle je vais placer des boutons pour faire une barre d'outil détachable. Sur la fenètre principale je place un bouton qui va ouvrir la Barre d'outil associé à ce bouton. C'est une idée qui me vient du logiciel Rhinoceros 3D. Exemple :
Une fenètre regroupe les commandes de création de forme primitive 3D.
Une autre fenètre les commandes de création de surface.
Etc.

Je vais faire un exemple de ça demain. Avec la librairie ToolBarXP du Soldat Inconnu.

Le code est près à être transformé en librairie avec TailBite.

Code : Tout sélectionner

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; OpenToolWindow
; Version 1.0
; Programmation = OK
; Programmé par :  Guimauve
; Date : 4 septembre 2004
; Codé avec PureBasic V3.91
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; Options doit avoir #PB_Window_Invisible comme valeur minimum.

ProcedureDLL OpenToolWindow(Fenetre, x, y, LargeurInterne, HauteurInterne, Options, Titre$) ; Ouvre une fenetre outils.

     WindowID = OpenWindow(Fenetre, x, y, LargeurInterne, HauteurInterne, Options, Titre$)
     SetWindowLong_(WindowID, #GWL_EXSTYLE, #WS_EX_TOOLWINDOW) ; both lines are needed to avoid displaying
     ShowWindow_(WindowID, #SW_SHOW) ; of your window on the taskbar
     ProcedureReturn WindowID
     
EndProcedure

ProcedureDLL OpenToolWindow2(Fenetre, x, y, LargeurInterne, HauteurInterne, Options, Titre$ , FenetreMereID)

     WindowID = OpenWindow(Fenetre, x, y, LargeurInterne, HauteurInterne, Options, Titre$ ,FenetreMereID)
     SetWindowLong_(WindowID, #GWL_EXSTYLE, #WS_EX_TOOLWINDOW) ; both lines are needed to avoid displaying
     ShowWindow_(WindowID, #SW_SHOW) ; of your window on the taskbar
     ProcedureReturn WindowID
     
EndProcedure

Code pout tester :

Code : Tout sélectionner

Enumeration
     
     #MainWin
     
     #Btn_Quitter
EndEnumeration

Procedure TestWindow()

If OpenWindow(#MainWin, 0, 0, 400, 300, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Test window") <> 0
     
     If CreateGadgetList(WindowID(#MainWin))
          ButtonGadget(#Btn_Quitter, WindowWidth() -85, WindowHeight()-35, 75, 25, "Quitter")
     EndIf
     
EndIf

Repeat
     
     EventID = WaitWindowEvent()
     
     Select EventGadgetID()
          Case #Btn_Quitter
               EventID = #PB_Event_CloseWindow
     EndSelect
     
Until EventID = #PB_Event_CloseWindow
EndProcedure

Enumeration 100
     
     #ToolWin
     
     #Btn_ToolWin_Quitter
EndEnumeration

Procedure TestToolWindow()

If OpenToolWindow(#ToolWin, 0, 0, 400, 300, #PB_Window_ScreenCentered | #PB_Window_Invisible | #PB_Window_SystemMenu, "Test tool window") <> 0
     
     If CreateGadgetList(WindowID(#ToolWin))
          ButtonGadget(#Btn_ToolWin_Quitter, WindowWidth() -85, WindowHeight()-35, 75, 25, "Quitter")
     EndIf
     
EndIf

Repeat
     
     EventID2 = WaitWindowEvent()
     
     Select EventGadgetID()
          Case #Btn_ToolWin_Quitter
               EventID2 = #PB_Event_CloseWindow
     EndSelect
     
Until EventID2 = #PB_Event_CloseWindow

EndProcedure

TestWindow()

TestToolWindow()
A+
Guimauve
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Voiçi un exemple. C'est pas encore au top mais certain vont sûrement amélioré la technique. Ou adapter à leurs besoins.

N.B. La librairie ToolBarXP du Soldat Inconnu est nécessaire. J'ai utlisé les icônes qui viennent avec la libairie, j'espère que ça n'embête personne.

Code : Tout sélectionner

Structure SH_FILEINFO ; la structure SHFILEINFO PB est fausse
     hIcon.l
     iIcon.l
     dwAttributes.l
     szDisplayName.b[#MAX_PATH]
     szTypeName.b[80]
EndStructure

Procedure.l ExtractSmallIconFile(IconPath.s)
     ; Cette procedure permet d'extraire l'ID de l'icône 16*16 associé au type de fichier ou au dossier dont l'adresse est IconPath
     SHGetFileInfo_(IconPath, 0, @InfosFile.SH_FILEINFO, SizeOf(SH_FILEINFO), #SHGFI_ICON | #SHGFI_SMALLICON)
     ProcedureReturn InfosFile\hIcon
EndProcedure

Procedure.l ExtractLargeIconFile(IconPath.s)
     ; Cette procedure permet d'extraire l'ID de l'icône 32*32 associé au type de fichier ou au dossier dont l'adresse est IconPath
     SHGetFileInfo_(IconPath, 0, @InfosFile.SH_FILEINFO, SizeOf(SH_FILEINFO), #SHGFI_ICON | #SHGFI_LARGEICON)
     ProcedureReturn InfosFile\hIcon
EndProcedure


Declare FloatingToolbar(PosX.l, PosY.l, string$)

Enumeration
     
     #MainWin
     
     #Btn_Precedent
     #Btn_suivant
     
EndEnumeration

Enumeration 100
     
     #FloatingToolBar
     
     #Actionbouton1
     #Actionbouton2
     #Actionbouton3
     #Actionbouton4
     #Actionbouton5
     
EndEnumeration


If OpenWindow(#MainWin, 0, 0, 400, 300, #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget, "Test window") <> 0
     
     LoadImage(0, "ToolBarXP 16.bmp")
     
     If CreateGadgetList(WindowID(#MainWin)) <> 0
          CreateToolBarXP(WindowID(#MainWin), 16)
          SetToolBarXPShape(UseImage(0), RGB(237, 241, 252), GetSysColor_(#COLOR_3DFACE), 350)
          
          IconePrecedent = ExtractSmallIconFile("Précédent.ico")
          IconeSuivant = ExtractSmallIconFile("Suivant.ico")
          ToolBarXPStart()
          ToolBarXPButton(#Btn_Precedent, IconePrecedent)
          
          ToolBarXPButton(#Btn_suivant, IconeSuivant)
          ToolBarXPEnd()
          
     EndIf
EndIf


posix = WindowX() + GadgetX(#Btn_Precedent) + 16
posiy = WindowY() + GadgetY(#Btn_Precedent) + 65

Tbx = WindowX() + GadgetX(#Btn_suivant) + 16
Tby = WindowY() + GadgetY(#Btn_suivant) + 65

Repeat
     
     EventID = WaitWindowEvent()
     
     Select EventGadgetID()
               
          Case #Btn_Precedent
               Action = FloatingToolbar(posix, posiy, "1")
               
               Select Action
                         
                    Case #Actionbouton1
                         Debug "Le bouton 1 de la barre d'outil flottante 1"
                         
                    Case #Actionbouton2
                         Debug "Le bouton 2 de la barre d'outil flottante 1"
                         
                    Case #Actionbouton3
                         Debug "Le bouton 3  de la barre d'outil flottante 1"
                         
                    Case #Actionbouton4
                         Debug "Le bouton 4 de la barre d'outil flottante 1"
                         
                    Case #Actionbouton5
                         Debug "Le bouton 5 de la barre d'outil flottante 1"
                         
               EndSelect
               
          Case #Btn_suivant
               Action2 = FloatingToolbar(Tbx, Tby, "2")
               
               Select Action2
                         
                    Case #Actionbouton1
                         Debug "Le bouton 1 de la barre d'outil flottante 2"
                         
                    Case #Actionbouton2
                         Debug "Le bouton 2 de la barre d'outil flottante 2"
                         
                    Case #Actionbouton3
                         Debug "Le bouton 3  de la barre d'outil flottante 2"
                         
                    Case #Actionbouton4
                         Debug "Le bouton 4 de la barre d'outil flottante 2"
                         
                    Case #Actionbouton5
                         Debug "Le bouton 5 de la barre d'outil flottante 2"
                         
               EndSelect
     EndSelect
     
Until EventID = #PB_Event_CloseWindow




; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<



Procedure FloatingToolbar(PosX.l, PosY.l, string$)
     
     If OpenToolWindow(#FloatingToolBar, PosX, PosY, 10 * 16, 16, #PB_Window_Invisible, "ToolBar " + string$) <> 0
          If CreateGadgetList(WindowID(#FloatingToolBar)) <> 0
               
               Icone1 = ExtractSmallIconFile("1.ico")
               Icone2 = ExtractSmallIconFile("2.ico")
               Icone3 = ExtractSmallIconFile("3.ico")
               Icone4 = ExtractSmallIconFile("4.ico")
               Icone5 = ExtractSmallIconFile("5.ico")
               
               
               CreateToolBarXP(WindowID(#FloatingToolBar), 16)
               SetToolBarXPShape(UseImage(0), RGB(237, 241, 252), GetSysColor_(#COLOR_3DFACE), 350)
               ToolBarXPStart()
               Bouton_Icone1 = ToolBarXPButton(#PB_Any, Icone1)
               Bouton_Icone2 = ToolBarXPButton(#PB_Any, Icone2)
               Bouton_Icone3 = ToolBarXPButton(#PB_Any, Icone3)
               Bouton_Icone4 = ToolBarXPButton(#PB_Any, Icone4)
               Bouton_Icone5 = ToolBarXPButton(#PB_Any, Icone5)
               ToolBarXPEnd()
               
          EndIf
     EndIf
     
     Repeat
          
          EventID2 = WaitWindowEvent()
          
          Select EventGadgetID()
                    
               Case Bouton_Icone1
                    Command_No = #Actionbouton1
                    EventID2 = #PB_Event_CloseWindow
                    
               Case Bouton_Icone2
                    Command_No = #Actionbouton2
                    EventID2 = #PB_Event_CloseWindow
                    
               Case Bouton_Icone3
                    Command_No = #Actionbouton3
                    EventID2 = #PB_Event_CloseWindow
                    
               Case Bouton_Icone4
                    Command_No = #Actionbouton5
                    EventID2 = #PB_Event_CloseWindow
                    
               Case Bouton_Icone5
                    Command_No = #Actionbouton5
                    EventID2 = #PB_Event_CloseWindow
                    
          EndSelect
          
     Until EventID2 = #PB_Event_CloseWindow
     
     
     CloseWindow(#FloatingToolBar)
     ProcedureReturn Command_No
EndProcedure
A+
Guimauve
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

juste un problème avec ton code sur win2000 - 98 (mais pas sous XP)

regarde :
Image

pour ne pas avoir ce prob, je fais comme ça :
http://purebasic.hmt-forum.com/viewtopic.php?t=39

je ne sais pas comment fait Danilo dans sa lib
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

C'est bizarre ça. Mais je ne l'ai testé seulement sur XP.

Je vais faire les corrections pendant la semaine. Mais ce n'est pas le seul problème. Il y a des cas où la fenètre ne se ferme pas lorsque l'on clique sur le X dans le coin en haut à droite.

Je pense que c'est ça qui cause le problème : Action = FloatingToolbar(posix, posiy, "1"). Et je ne vois pas pourquoi ça passe pas.

Je croyais l'avoir testé suffisament, il semblerait que non.

Mais merci pour ton code, je vais l'étudier pour voir ce qui cloche.

A+
Guimauve
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

tu n'avais pas eu ce prob sur 2000, toi, c'est bizarre en effet. y'a un truc :?

chez moi, ça fait un peu comme une zone jamais rafraichie, dès que je passe quelque chose devant, elle reste affiché dans ce petit rectangle sous la barre de titre.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Bien non, c'est la première fois que je tente de faire la programmation d'une toolbar flottante.

Juste ouvrir une fenètre, est-ce que ça fonctionne ?

Code : Tout sélectionner

#Main_Win_Style = #PB_Window_ScreenCentered |#PB_Window_Invisible ;| #PB_Window_SystemMenu 

If OpenToolWindow(0,0,0,400,300,#Main_Win_Style,"Nom du programme") <> 0

     If CreateGadgetList(WindowID(0)) <> 0
     
     
     EndIf
     
EndIf     

Repeat

EventID = WaitWindowEvent() 

Until EventID = #PB_Event_CloseWindow
A+
Guimauve
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

mon image, c'est juste avec les 3 lignes de la procedure

Code : Tout sélectionner

     WindowID = OpenWindow(Fenetre, x, y, LargeurInterne, HauteurInterne, Options, Titre$) 
     SetWindowLong_(WindowID, #GWL_EXSTYLE, #WS_EX_TOOLWINDOW) ; both lines are needed to avoid displaying 
     ShowWindow_(WindowID, #SW_SHOW) ; of your window on the taskbar
d'ailleurs, pourquoi ne mets tu pas directement le #PB_Window_Invisible

Code : Tout sélectionner

     WindowID = OpenWindow(Fenetre, x, y, LargeurInterne, HauteurInterne, Options | #PB_Window_Invisible, Titre$) 
     SetWindowLong_(WindowID, #GWL_EXSTYLE, #WS_EX_TOOLWINDOW) ; both lines are needed to avoid displaying 
     ShowWindow_(WindowID, #SW_SHOW) ; of your window on the taskbar
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message par ZapMan »

Bravo ! Bravissimo ! Il reste apparement 2,3 bricoles à régler mais j'ai l'impression que je vais finir par avoir ma toolbar détachable pour SoundEdit !!!
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
Répondre