création d'un editeur de boite de dialogue

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Re: création d'un editeur de boite de dialogue

Message par jbernard13 »

dayvid a écrit :Est-ce que se serais possible de convertire sa en 4.50 :)

Installe la version 4.00 de PB pour faire marcher ce code .
Jbernard13
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: création d'un editeur de boite de dialogue

Message par dayvid »

C'est bon c'est fait :D

Mais je n'est pas réussi a le convertir en 4.50
ya un problème avec des commende :)

et sinon:

J'ai commencer a crée ceci mais ya un problème avec une commende de la Library Pure Color
"SetButtonToggleIcon" si je me souvient bien car on voie que il y a un décalage avec l'image

et j'ai commencer a améliorer le code pour crée des bouton
http://www.archive-host.com/files/91337 ... _gadget.7z
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: création d'un editeur de boite de dialogue

Message par dayvid »

Désoler de rallumer le sujet

Est t'il possible d'avoir un exemple
de sélection avec souris

Choisir un gadget (un bouton pour commencer)
- sélectionner une zone sur la fenêtre
- crée le bouton aux positions et dimensions de la sélection
- quand la souris passe sur le bouton, on change de curseur, on met la croix et quand on clique
avec le bouton droit avec la souris, on peut le déplacer
- quand le bouton est sélectionné on renvoie dans des champs toutes ces caractéristique que l'on peut changer à volonté

Je voudrait apprendre a crée un micro pureforme mais pour crée pour le moment (simple) des boitte de dialogue
je supplies de votre part de m'aider car je n'y arriverais jamais tous seule car mon niveaux est trop bas :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: création d'un editeur de boite de dialogue

Message par dayvid »

Quelqu'un peut t-il convertire ceci en 4.50 svp (fait les yeux doux)

Code : Tout sélectionner

; 
; PureBasic Visual Designer
;
;
; 12/11/2001
;   Today, the multi window mode finally works.
; 
; 05/11/2001
;   Continued a bit the work: can move the gadgets and generate a pseudo code
;
; 14/10/2001
;   Added the object viewer tree
;
; 06/10/2001
;   First version
;

;InitGadget(100)

#NbLangageStrings = 5  ; Including the '0'
Dim Langage.s(#NbLangageStrings)

For k=0 To #NbLangageStrings : Read Langage(k) : Next

#WINDOW_Main         = 0
#WINDOW_Properties   = 1
#WINDOW_ObjectViewer = 2 
#WINDOW_PoolStart    = 10

#MENU_Quit           = 0
#MENU_NewWindow      = 1
#MENU_GenerateSource = 2

#GADGET_PropertyCaption = 1
#GADGET_PropertyX       = 2
#GADGET_PropertyY       = 3
#GADGET_PropertyWidth   = 4
#GADGET_PropertyHeight  = 5
#GADGET_ObjectTree      = 6

IncludeFile "ObjectViewer.pb"

Global  UsedCreatedWindow ; Tell which window is being activated.
Global *MemoryBuffer      ; Multi-Purpose memory buffer
Global  SelectMode        ; Can be 0 or 1, indicating if it a gadget or the window which is selected..
Global  CurrentGadgetType ; GadgetType currently selected (Button, StringGadget, CheckBox etc...)

Structure Window
  Address.l
  NumericID.l
  GadgetArea.l
  Flags.l
  Title.s
  x.w
  y.w
  Width.w
  Height.w
  TreePosition.w
  TreeState.b
EndStructure


Structure Gadget
  Address.l
  NumericID.l
  WindowID.l
  Flags.l
  Title.s
  x.w
  y.w
  Width.w
  Height.w
  Type.w
  TreePosition.w
EndStructure


NewList CreatedWindow.Window()
NewList CreatedGadget.Gadget()

DefaultTitle$ = Langage(3)

CurrentGadgetType = 1 ; Default to ButtonGadget

*MemoryBuffer = AllocateMemory(10000)  

If CreateMenu(0,WindowID())
  MenuTitle(Langage(0))
    MenuItem(#MENU_NewWindow     , Langage(2))
    MenuBar()
    MenuItem(#MENU_GenerateSource, Langage(5))
    MenuBar()
    MenuItem(#MENU_Quit          , Langage(1))
EndIf


Procedure BuildObjectTree()

  *CurrentWindow = CreatedWindow()
  *CurrentGadget = CreatedGadget()
  
  ; First, as we rebuilt the whole tree, we memorise the actual window nodes state (expanded or shrinked)
  ;  
  ResetList(CreatedWindow())
  While NextElement(CreatedWindow())
    CreatedWindow()\TreeState = TreeGadgetItemState(#GADGET_ObjectTree, CreatedWindow()\TreePosition)
  Wend

  ; Now we can clear the tree list
  ;  
  ClearGadgetItemList(#GADGET_ObjectTree)

  CurrentPosition = 0

  ResetList(CreatedWindow())
  While NextElement(CreatedWindow())
    AddTreeGadgetItem(#GADGET_ObjectTree, CreatedWindow()\Title, 0)
    CreatedWindow()\TreePosition = CurrentPosition

    FirstTime = 1
    
    ResetList(CreatedGadget())
    While NextElement(CreatedGadget())
      If CreatedGadget()\WindowID = CreatedWindow()\NumericID
        
        If FirstTime : OpenTreeGadgetNode() : FirstTime = 0 : EndIf
        
        AddTreeGadgetItem(#GADGET_ObjectTree, CreatedGadget()\Title, 0)
        
        CurrentPosition+1
        CreatedGadget()\TreePosition = CurrentPosition
      EndIf
    Wend
    
    If FirstTime = 0 : CloseTreeGadgetNode() : EndIf
    
    If CreatedWindow()\TreeState : ExpandTreeGadgetItem(#GADGET_ObjectTree,  CreatedWindow()\TreePosition) : EndIf
    
    CurrentPosition+1
  Wend
  
  ChangeCurrentElement(CreatedWindow(), *CurrentWindow)
  ChangeCurrentElement(CreatedGadget(), *CurrentGadget)
EndProcedure


Procedure OpenWindow_Properties()
  If OpenWindow(#WINDOW_Properties, 10, 100, 200, 200, #PB_Window_SystemMenu, "Properties")
    If CreateGadgetList(WindowID())
    
      GadgetTop    = 10
      GadgetHeight = 20
    
      TextGadget  (0, 10, GadgetTop+2, 100, GadgetHeight, Langage(4))
      StringGadget(#GADGET_PropertyCaption, 60, GadgetTop  , 125, GadgetHeight, "") : GadgetTop+30
      
      TextGadget  (0, 10, GadgetTop+2, 100, GadgetHeight, Langage(4))
      StringGadget(#GADGET_PropertyX, 60, GadgetTop  , 125, GadgetHeight, "") : GadgetTop+30
      
      TextGadget  (0, 10, GadgetTop+2, 100, GadgetHeight, Langage(4))
      StringGadget(#GADGET_PropertyY, 60, GadgetTop  , 125, GadgetHeight, "") : GadgetTop+30
      
      TextGadget  (0, 10, GadgetTop+2, 100, GadgetHeight, Langage(4))
      StringGadget(#GADGET_PropertyWidth, 60, GadgetTop  , 125, GadgetHeight, "") : GadgetTop+30
      
      TextGadget  (0, 10, GadgetTop+2, 100, GadgetHeight, Langage(4))
      StringGadget(#GADGET_PropertyHeight, 60, GadgetTop  , 125, GadgetHeight, "") : GadgetTop+30
    
    EndIf
  EndIf
EndProcedure

DisableDebugger
Procedure UpdateWindowData()
  ResetList(CreatedWindow())
  While (NextElement(CreatedWindow()))
    If CreatedWindow()\NumericID = UsedCreatedWindow
      UseWindow(UsedCreatedWindow)
      GetWindowText_(WindowID(), *MemoryBuffer, 1000)
    
      CreatedWindow()\Title  = PeekS(*MemoryBuffer)
      CreatedWindow()\x      = WindowX()
      CreatedWindow()\y      = WindowY()
      CreatedWindow()\Width  = WindowWidth()
      CreatedWindow()\Height = WindowHeight()
      
      ; Now update the properties
      ;
      SetGadgetText(#GADGET_PropertyCaption, CreatedWindow()\Title)
      SetGadgetText(#GADGET_PropertyX      , Str(CreatedWindow()\x))
      SetGadgetText(#GADGET_PropertyY      , Str(CreatedWindow()\y))
      SetGadgetText(#GADGET_PropertyWidth  , Str(CreatedWindow()\Width))
      SetGadgetText(#GADGET_PropertyHeight , Str(CreatedWindow()\Height))
      
      SelectMode = 0
      
      ProcedureReturn
    EndIf
  Wend
EndProcedure

; This callback is called automatically by Windows when an event occurs.
; We use it to update the size of the statusbar when the user size the window.
; This is useful only when solid mode sizing is used.
;

Procedure WindowCallBack(WindowID, Message, wParam, lParam)

  WindowNumericID = EventWindowID()

  If Message = #WM_ACTIVATE 
    If wParam = #WA_CLICKACTIVE Or wParam = #WA_ACTIVE 
    If WindowNumericID >= #WINDOW_PoolStart
      UsedCreatedWindow = WindowNumericID
      UpdateWindowData()
      SetGadgetState(#GADGET_ObjectTree, 0) ; CreatedWindow()\TreePosition+1)
    Else
      UseWindow(WindowNumericID)
    EndIf
    EndIf
  EndIf
  
  If Message = #WM_MOVE Or Message = #WM_SIZE
    If WindowNumericID >= #WINDOW_PoolStart
      UpdateWindowData()
    EndIf
  EndIf
EndProcedure
EnableDebugger

*StringBase.l

OpenDefaultConsole()


Procedure IsInsideAGadget(x, y)

  ResetList(CreatedGadget())
  While NextElement(CreatedGadget())
    
    If CreatedGadget()\WindowID = CreatedWindow()\NumericID
      If CreatedGadget()\x < x And CreatedGadget()\y < y And CreatedGadget()\x+CreatedGadget()\Width > x  And CreatedGadget()\y+CreatedGadget()\Height > y 
        ProcedureReturn 1
      EndIf
    EndIf    
  Wend
  
  ProcedureReturn 0
EndProcedure


Procedure UpdateGadgetData()

  ; CreatedGadget()\Title  = PeekS(*MemoryBuffer)
  ; CreatedGadget()\x      = WindowX()
  ; CreatedGadget()\y      = WindowY()
  ; CreatedGadget()\Width  = WindowWidth()
  ; CreatedGadget()\Height = WindowHeight()
  
  ; Now update the properties
  ;
  SetGadgetText(#GADGET_PropertyCaption, CreatedGadget()\Title)
  SetGadgetText(#GADGET_PropertyX      , Str(CreatedGadget()\x))
  SetGadgetText(#GADGET_PropertyY      , Str(CreatedGadget()\y))
  SetGadgetText(#GADGET_PropertyWidth  , Str(CreatedGadget()\Width))
  SetGadgetText(#GADGET_PropertyHeight , Str(CreatedGadget()\Height))
  
  SelectMode = 1
  
EndProcedure


#PanelOffsetX = -2
#PanelOffsetY = -23

; Diplay on the current active window the Gadget depending of its type (Button, CheckBox etc...)
;
Procedure DisplaySpecificGadget(GadgetType, x, y, Width, Height, Title$)

  UseGadgetList(CreatedWindow()\GadgetArea)
  
  x-#PanelOffsetX
  y-#PanelOffsetY
  
  Select GadgetType
    Case 1
      *Address = ButtonGadget(10, x, y, Width, Height, Title$)
      
    Case 2
      *Address = StringGadget(10, x, y, Width, Height, Title$)

    Case 3
      *Address = CheckBoxGadget(10, x, y, Width, Height, Title$)

  EndSelect
  
  ProcedureReturn *Address
EndProcedure


Procedure DisplayXORSelection()

  StartPointX = WindowMouseX()+#PanelOffsetX ; Due to window borders (top and left)
  StartPointY = WindowMouseY()+#PanelOffsetY 

  StartDrawing(WindowOutput())
  DrawingMode(7)
    
  SetCapture_(WindowID())
  
  If IsInsideAGadget(StartPointX, StartPointY)

    OffsetX = StartPointX-CreatedGadget()\x
    OffsetY = StartPointY-CreatedGadget()\y

    Repeat
      Event = WaitWindowEvent()
      
      If Event = #WM_MOUSEMOVE
        
        If Drawed
          Box(PreviousX , PreviousY, CreatedGadget()\Width, CreatedGadget()\Height)
        EndIf
        
        PreviousX = WindowMouseX()+#PanelOffsetX-OffsetX 
        PreviousY = WindowMouseY()+#PanelOffsetY-OffsetY 
        Box(PreviousX , PreviousY, CreatedGadget()\Width , CreatedGadget()\Height)
        Drawed = 1
      EndIf
    Until Event = #WM_LBUTTONUP
    
    If Drawed
      Box(PreviousX , PreviousY, CreatedGadget()\Width, CreatedGadget()\Height)
      
      CreatedGadget()\x        = PreviousX
      CreatedGadget()\y        = PreviousY
      
      DestroyWindow_(CreatedGadget()\Address)
      CreatedGadget()\Address  = DisplaySpecificGadget(CreatedGadget()\Type, PreviousX, PreviousY, CreatedGadget()\Width, CreatedGadget()\Height, CreatedGadget()\Title)
    EndIf

    UpdateGadgetData()
    
  Else
                
    Repeat
      Event = WaitWindowEvent()
      
        If Event = #WM_MOUSEMOVE
          Drawed = 1
          
          Box(StartPointX, StartPointY, PreviousX , PreviousY)
          
          PreviousX = WindowMouseX()-StartPointX-2+#PanelOffsetX
          PreviousY = WindowMouseY()-StartPointY+#PanelOffsetY
          Box(StartPointX, StartPointY, PreviousX , PreviousY)
          
          ; EnableWindow_(*Panel, 0)
          ; ReSizeGadget(21, 0, 0, 10, 10)
        EndIf
    Until Event = #WM_LBUTTONUP
    
    If Drawed
      Box(StartPointX, StartPointY, PreviousX , PreviousY)
      
      If PreviousX > 8 And PreviousY > 8
        AddElement(CreatedGadget())
        CreatedGadget()\WindowID = CreatedWindow()\NumericID
        CreatedGadget()\Title    = ""
        CreatedGadget()\x        = StartPointX
        CreatedGadget()\y        = StartPointY
        CreatedGadget()\Width    = PreviousX
        CreatedGadget()\Height   = PreviousY
        CreatedGadget()\Type     = CurrentGadgetType
        CreatedGadget()\Address  = DisplaySpecificGadget(CurrentGadgetType, StartPointX, StartPointY, PreviousX, PreviousY, CreatedGadget()\Title)
         
        UpdateGadgetData()
            
        BuildObjectTree()
        
        ActivateGadget(#GADGET_PropertyCaption)
        UseWindow(#WINDOW_Properties)
      EndIf
      
    Else
      UpdateWindowData()
    EndIf
        
  EndIf    
  
  ReleaseCapture_()
  StopDrawing()
  
EndProcedure


If OpenWindow(#WINDOW_Main, 300, 120, 300, 85, #PB_Window_SystemMenu, "PureBasic Visual Designer v0.11")
  AttachMenu(0, WindowID())
  
  If CreateGadgetList(WindowID())
    ButtonGadget(1,  10, 10, 50, 25, "But")
    ButtonGadget(2,  60, 10, 50, 25, "Str")
    ButtonGadget(3, 110, 10, 50, 25, "Chk")
  EndIf
  
  OpenWindow_Properties()
  
  OpenWindow_ObjectViewer()
  
  SetWindowCallback(@WindowCallBack())
      
  Repeat
    Event = WaitWindowEvent()
    
    Select Event
      WindowID = EventWindowID()
      
      If WindowID >= #WINDOW_PoolStart
      
        If WindowMouseX() > 0
          If WindowMouseY() > 0
            If Event = #WM_LBUTTONDOWN
              DisplayXORSelection()
            EndIf
          EndIf
        EndIf
      
      EndIf
      
    
      Case #PB_EventMenu
            
        Select EventMenuID()
        
          Case #MENU_NewWindow
            Gosub CreateNewWindow

          Case #MENU_GenerateSource
            Gosub GenerateSource

          Case #MENU_Quit
            Quit = 1  
    
        EndSelect
        

      Case #PB_EventGadget
      
        GadgetID = EventGadgetID()
        
        If EventWindowID() = #WINDOW_Main
          
          Select GadgetID
            Case 1
              CurrentGadgetType = 1
            
            Case 2
              CurrentGadgetType = 2
              
            Case 3
              CurrentGadgetType = 3
            
          EndSelect          
        Else
        
          Select GadgetID
          
            Case #GADGET_PropertyCaption
              If UsedCreatedWindow
                a$ = GetGadgetText(#GADGET_PropertyCaption)
                
                If SelectMode = 0
                  SetWindowText_(UseWindow(UsedCreatedWindow), a$)
                  CreatedWindow()\Title = a$
                Else
                  CreatedGadget()\Title = a$
                  SetWindowText_(CreatedGadget()\Address, a$)
                EndIf
                
                BuildObjectTree()
                ; UseWindow(#WINDOW_Properties)
              EndIf
              
              
            Case #GADGET_ObjectTree
              SelectedItem = GetGadgetState(#GADGET_ObjectTree)
              PrintN(Str(SelectedItem))
              Found = 0
              
              ResetList(CreatedGadget())
              While NextElement(CreatedGadget())
                If CreatedGadget()\TreePosition = SelectedItem
                  SelectMode = 1
                  UpdateGadgetData()
                  Found = 1
                  Goto Skip22
                EndIf
              Wend
              Skip22:
              
              If Found = 0
                ResetList(CreatedWindow())
                While NextElement(CreatedWindow())
                  If CreatedWindow()\TreePosition = SelectedItem
                    SelectMode = 0
                    UsedCreatedWindow = CreatedWindow()\NumericID
                    UpdateWindowData()
                    BringWindowToTop_(CreatedWindow()\Address)
                    Found = 1
                    Goto Skip23
                  EndIf
                Wend
                Skip23:
                
              EndIf
              
          EndSelect
        EndIf  
    
      Case #PB_EventCloseWindow
        
        If WindowID  = #WINDOW_Main
          Quit = 1
        Else
          If WindowID >= #WINDOW_PoolStart
            UsedCreatedWindow = WindowID
            UpdateWindowData()
            DeleteElement(CreatedWindow())
            CloseWindow(WindowID)
          EndIf
        EndIf

    EndSelect
    
  Until Quit = 1
EndIf

End


Procedure GetFreeWindowNumber(StartWindowID)

  DisableDebugger  
  While (UseWindow(StartWindowID) <> 0)
    StartWindowID+1
  Wend
  EnableDebugger
  
  ProcedureReturn StartWindowID
EndProcedure


CreateNewWindow:

  LastElement(CreatedWindow())
  If AddElement(CreatedWindow())
    UsedCreatedWindow = GetFreeWindowNumber(#WINDOW_PoolStart)
    
    Title$ = DefaultTitle$+" ( "+Str(UsedCreatedWindow-#WINDOW_PoolStart)+" )"

    If OpenWindow(UsedCreatedWindow, 120, 200, 300, 300, #PB_Window_SystemMenu | #PB_Window_SizeGadget, Title$)

      CreatedWindow()\NumericID  = UsedCreatedWindow
      CreatedWindow()\Address    = WindowID()

      UpdateWindowData()
      
      CreateGadgetList(WindowID())
      
      CreatedWindow()\GadgetArea = PanelGadget(20, -2, -22, 2000, 2000)
      DisableGadget(20, 1)
      
      BuildObjectTree()
    EndIf
  EndIf
Return


GenerateSource:

  If CreateFile(0, "C:\Generated Source.pb")
    
    WriteStringN("; PB Generated GUI - V0.01")
    WriteStringN(";")
    WriteStringN("")
    
    *CurrentWindow = CreatedWindow()
    *CurrentGadget = CreatedGadget()
    
    WriteStringN("InitGadget(100)")

    ResetList(CreatedWindow())
    While NextElement(CreatedWindow())
    
      WriteStringN("Procedure OpenWindow_1()")
      WriteStringN("  If OpenWindow(0,"+Str(CreatedWindow()\x)+","+Str(CreatedWindow()\y)+","+Str(CreatedWindow()\Width)+","+Str(CreatedWindow()\Height)+",#PB_Window_SystemMenu"+","+Chr(34)+CreatedWindow()\Title+Chr(34)+")")
      WriteStringN("    If CreateGadgetList(WindowID())")

      ResetList(CreatedGadget())
      While NextElement(CreatedGadget())
        If CreatedGadget()\WindowID = CreatedWindow()\NumericID
          WriteStringN("      ButtonGadget(0,"+Str(CreatedGadget()\x)+","+Str(CreatedGadget()\y)+","+Str(CreatedGadget()\Width)+","+Str(CreatedGadget()\Height)+","+Chr(34)+CreatedGadget()\Title+Chr(34)+")")
        EndIf
      Wend
      
      WriteStringN("    EndIf")
      WriteStringN("  EndIf")
      WriteStringN("EndProcedure")
      WriteStringN("")
      WriteStringN("OpenWindow_1()")
      WriteStringN("")
    Wend
    
    WriteStringN("Repeat")
    WriteStringN("  Event = WaitWindowEvent()")
    WriteStringN("Until Event = #PB_EventCloseWindow")
    
    ChangeCurrentElement(CreatedWindow(), *CurrentWindow)
    ChangeCurrentElement(CreatedGadget(), *CurrentGadget)
    
    CloseFile(0)
    
    RunProgram("C:\Generated Source.pb", "", 0)  ; Windows automatically launch a program associated to a file.. Nice :)
  EndIf
Return

DataSection

LangageStrings:

Data.s "File", "Quit", "New Window...", "New Window", "Caption", "Generate Source"
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Warkering
Messages : 808
Inscription : ven. 08/janv./2010 1:14
Localisation : Québec, Canada

Re: création d'un editeur de boite de dialogue

Message par Warkering »

Va falloir que quelqu'un t'apprenne à convertir en 4.5! :mrgreen:
Désolé, je n'ai pas le temps; Je suis au Cégep et à soir, c'est la saoulade générale! Donc! :lol:
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: création d'un editeur de boite de dialogue

Message par falsam »

Ligne 23 Read.s au lieu de Read
Il te manque l'include "ObjectViewer.pb"
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: création d'un editeur de boite de dialogue

Message par dayvid »

Le fichier inclue, je l'es déjà tinkiètte pas
Bon bin c'est pas grave :)

C'est dommage car je ne vais pas pouvoir avenser dans ce que je voulais :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Répondre