Fenêtre avec grille entièrement paramètrable

Programmation d'applications complexes
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Fenêtre avec grille entièrement paramètrable

Message par Shadow »

Salut,

Suis pas venue depuis un moment.
Je travail actuellement sur un projet.

J'aimerais faire un Rad Maker.

Je travail avec une personne du forum pour tenté d'y parvenir.
Il ne fais pas à ma place, c'est moi qui fais, lui il m'aide juste à améliorer, me dire comment faire, me filer un coup de main.

Ya beaucoup de travail mais je suis motivé grâce à cette personne justement qui sans lui je ne ferais pas :)
Il saura se reconnaitre j'en suis certain.

Je vous propose pour commencer, un code avec une fenêtre ainsi qu'une grille et tout ça paramétrable.
A partir de la ligne 139, ces paramètres actuels peuvent être changés:

Code : Tout sélectionner

\Int_CouleurArrierePlant = RGB(255, 255, 255) ; La couleur d'arrière plan du Canvas.
  
\Int_AfficherGrille = #True ; #True pour afficher la grille.

\Int_TypeFormes = 1 ; Type de Forme voulue: Type de Forme voulue: 1 = Carré plein, 2 = Carré arrondi plein, 3 = Rond plein, 4 = Carré vide, 5 = Carré arrondi vide, 6 = Rond vide.
\Int_EspaceFormes = 5 ; L'espace entre les Formes.
\Int_TailleFormes = 1  ; La taille des Formes.
\Int_CouleurFormes = RGB(0, 0, 255) ; La couleur des Formes.
\Int_ArrondissementFormes = 1       ; Le degré d'arrondissement des Formes si le type est égale à 2 ou 5.
Si la grille est affiché et lorsque la fenêtre est redimensionné, celle-ci prendra la taille la plus proche
de la taille indiqué en prenant en compte la taille des forme de la grille pour que ce soit homogène.
Testez différente possibilités.

Dites-moi se que vous en pensez, si vous avez des idées etc.
Ceci n'est qu'une prémisse (Avant gout) de mon Rad Maker.

Mais qu'est se que Rad Maker ?

Rapide Application Développement Création
Rad Maker vous permettra facilement de concevoir une application ayant besoin de certain outils.

Par exemple tous se qui est création, redimensionnement, déplacement, copie, coupage, collage, suppression d'objet.
A la manière d'un éditeur visuel.

Il est fastidieux de créer se genre de chose, Rad Maker servira entre autre à ça mais pas que.
Je ne sais pas trop ou tous ça va me mener mais j'y travail !

J'aurais aimer également faire des "Fenêtre aiment able"
Mais cella semble ardus...

En gros ont as X fenêtre au choix qu'on choisie dans son programme
et celle-ci aurait la faculté de pouvoir s’aimanter...

Elle prendrait en compte non seulement leur taille mais aussi celle des autres.
Ainsi, il serait facile de prendre une fenêtre et la "Clipsé" si je puis dire, sur une autre.

Bref compliqué à expliquer comme ça.

Code : Tout sélectionner

; Code créé Monsieur Dieppedalle David le 25/04/2016.
; Orthographe corrigé par Monsieur Michel Lye.

; Canvas avec une grille personnalisable.

EnableExplicit

;{ Enumérations

Enumeration Windows
  
  #FenetrePrincipale
  #Canvas
  
EndEnumeration

;}

;{ Structures

Structure FenetrePrincipaleProprietes
  
  Int_Numero.i ; Le numéro de la fenêtre (Enumération).
  Int_ID.i     ; Le numéro d'identifiant de la fenêtre.
  
  Titre.s ; Le titre (Texte) de la fenêtre.
  
  Int_X.i ; La position X de la fenêtre.
  Int_Y.i ; La position Y de la fenêtre.
  
  Int_Largeur.i ; La Largeur de la fenêtre.
  Int_Hauteur.i ; La Largeur de la fenêtre.
  
  Int_LargeurMinimum.i ; La Largeur Minimum que doit faire la fenêtre.
  Int_HauteurMinimum.i ; La Hauteur Minimum que doit faire la fenêtre.
  Int_LargeurMaximum.i ; La Largeur Maximum que doit faire la fenêtre.
  Int_HauteurMaximum.i ; La Hauteur Maximum que doit faire la fenêtre.
  
  Int_Option.i ; Les options de la fenêtre.
  
EndStructure

Structure CanvasProprietes
  
  Int_Numero.i ; Le numéro de la fenêtre (Enumération).
  Int_ID.i     ; Le numéro d'identifiant de la fenêtre.
  
  Int_X.i ; La position X du Canvas.
  Int_Y.i ; La position Y du Canvas.
  
  Int_Largeur.i ; La Largeur du Canvas.
  Int_Hauteur.i ; La Hauteur du Canvas.
  
  Int_Image.i ; Le numéro de l'image du Canvas qui sert pour dessiner la grille, la sélection et les objets.
  
  Int_CouleurArrierePlant.i ; La couleur d'arrière plan du Canvas.
  
  Int_AfficherGrille.b ; #True pour afficher la grille.
  IntAimenterGrille.b  ; #True pour aimanter la grille.
  
  Int_TypeFormes.i ; Type de Forme voulue: Type de Forme voulue: 1 = Carré plein, 2 = Carré arrondi plein, 3 = Rond plein, 4 = Carré vide, 5 = Carré arrondi vide, 6 = Rond vide.
  Int_EspaceFormes.i ; L'espace entre les Formes.
  Int_TailleFormes.i ; La taille des Formes.
  Int_CouleurFormes.i; La couleur des Formes.
  Int_ArrondissementFormes.i ; Le degré d'arrondissement des Formes si le type est égal à 2 ou 5.
  
  Int_Xsouris.i ; La position X de la souris sur le Canvas.
  Int_Ysouris.i ; La position Y de la souris sur le Canvas.
  
  Int_CliqueXsouris.i ; La position X du clic de la souris sur le Canvas.
  Int_CliqueYsouris.i ; La position Y du clic de la souris sur le Canvas.
  
EndStructure

Structure SelectionProprietes
  
  Int_TypeSelection.i ; Type de sélection voulue: 1 = Points, 2 = Carrés, 3 = Tirets.
  Int_EspaceSelection.i ; L'espace entre les Points / Carrés / Tirets de la sélection.
  Int_TailleSelection.i ; L'épaisseur des Points / Carrés / Tirets de la sélection.
  Int_CouleurSelection.i; La couleur de la sélection.
  
  Int_SelectionXsouris.i ; La position X de la sélection.
  Int_SelectionYsouris.i ; La position Y de la sélection.
  Int_SelectionLargeur.i ; La Largeur de la sélection.
  Int_SelectionHauteur.i ; La Hauteur de la sélection.
  
EndStructure



;}

;{ Variables globales, Listes, Tableaux, Maps

Global StructureFenetrePrincipale.FenetrePrincipaleProprietes
Global StructureCanvas.CanvasProprietes
Global StructureSelection.SelectionProprietes

;}

;{ Initialisations et Réglages du programme

With StructureFenetrePrincipale
  
  \Int_Numero = #FenetrePrincipale ; Le numéro de la fenêtre (Enumération).
  \Int_ID = 0                      ; Le numéro d'identifiant de la fenêtre.
  
  \Titre = "Fenêtre avec Grille personnalisé." ; Le titre (Texte) de la fenêtre.
  
  \Int_X = 0 ; La position X de la fenêtre.
  \Int_Y = 0 ; La position Y de la fenêtre.
  
  \Int_LargeurMinimum.i = 200 ; La Largeur Minimum que doit faire la fenêtre.
  \Int_HauteurMinimum.i = 150 ; La Hauteur Minimum que doit faire la fenêtre.
  \Int_LargeurMaximum.i = #PB_Default ; La Largeur Maximum que doit faire la fenêtre.
  \Int_HauteurMaximum.i = #PB_Default ; La Hauteur Maximum que doit faire la fenêtre.
  
  \Int_Largeur = 800 ; La Largeur de la fenêtre.
  \Int_Hauteur = 600 ; La Hauteur de la fenêtre.
  
  \Int_Option = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered ; Les options de la fenêtre.
  
EndWith

With StructureCanvas
  
  \Int_Numero = #Canvas ; Le numéro du Canvas (Enumération).
  \Int_ID = 0           ; Le numéro d'identifiant du Canvas.
  
  \Int_X = 0 ; La position X du Canvas.
  \Int_Y = 0 ; La position Y du Canvas.
  
  \Int_Largeur = 800 ; La Largeur du Canvas.
  \Int_Hauteur = 600 ; La Hauteur du Canvas.
  
  \Int_Image = 1 ; Le numéro de l'image du Canvas qui sert pour dessiner la grille, la sélection et les objets.
  
  \Int_CouleurArrierePlant = RGB(255, 255, 255) ; La couleur d'arrière plan du Canvas.
  
  \Int_AfficherGrille = #True ; #True pour afficher la grille.
  \IntAimenterGrille = #True  ; #True pour aimenter la grille.
  
  \Int_TypeFormes = 1 ; Type de Forme voulue: Type de Forme voulue: 1 = Carré plein, 2 = Carré arrondi plein, 3 = Rond plein, 4 = Carré vide, 5 = Carré arrondi vide, 6 = Rond vide.
  \Int_EspaceFormes = 5 ; L'espace entre les Formes.
  \Int_TailleFormes = 1  ; La taille des Formes.
  \Int_CouleurFormes = RGB(0, 0, 255) ; La couleur des Formes.
  \Int_ArrondissementFormes = 1       ; Le degré d'arrondissement des Formes si le type est égale à 2 ou 5.
  
  \Int_Xsouris = 0 ; La position X de la souris sur le Canvas.
  \Int_Ysouris = 0 ; La position Y de la souris sur le Canvas.
  
  \Int_CliqueXsouris = 0 ; La position X du clic de la souris sur le Canvas.
  \Int_CliqueYsouris = 0 ; La position Y du clic de la souris sur le Canvas.
  
EndWith

With StructureSelection
  
  \Int_TypeSelection = 1 ; Type de sélection voulue: 1 = Points, 2 = Carrés, 3 = Tirets.
  \Int_EspaceSelection = 10 ; L'espace entre les Points / Carrés / Tirets de la sélection.
  \Int_TailleSelection = 1  ; L'épaisseur des Points / Carrés / Tirets de la sélection.
  \Int_CouleurSelection = RGB(0, 0, 255) ; La couleur de la sélection.
  
  \Int_SelectionXsouris = 0 ; La position X de la sélection.
  \Int_SelectionYsouris = 0 ; La position Y de la sélection.
  \Int_SelectionLargeur = 0 ; La Largeur de la sélection.
  \Int_SelectionHauteur = 0 ; La Hauteur de la sélection.
  
EndWith

;}

;{ Les procédures

Procedure.q ConvertionNombrePositif(Nombre.q)
  
  If Nombre.q < 0
    ProcedureReturn -Nombre.q
  EndIf
  
  ProcedureReturn Nombre.q
  
EndProcedure

Procedure FenetrePrincipale()
  
  ; Ouverture et réglage de la fenêtre.
  
  With StructureFenetrePrincipale
    
    ; Ouvre la fenêtre avec les réglages enregistrés.
    OpenWindow(\Int_Numero, \Int_X, \Int_Y, \Int_Largeur, \Int_Hauteur, \Titre, \Int_Option)
    
    ; Règle la taille minimum et Maximum de la fenêtre.
    WindowBounds(\Int_Numero, \Int_LargeurMinimum, \Int_HauteurMinimum, \Int_LargeurMaximum, \Int_HauteurMaximum)
    
    ; Enregistre le numéro d'identifiant de la fenêtre.
    \Int_ID = WindowID(\Int_Numero)
    
    ; Enregistre la position de la fenêtre.
    \Int_X = WindowX(\Int_Numero)
    \Int_Y = WindowY(\Int_Numero)
    
  EndWith
  
  ; Création et réglage du Canvas.
  
  With StructureCanvas
    
    ; Crée le Canvas avec les réglages enregistrés.
    CanvasGadget(\Int_Numero, \Int_X, \Int_Y, \Int_Largeur, \Int_Hauteur)
    
    ; Enregistre le numéro d'identifiant du Canvas.
    \Int_ID = GadgetID(\Int_Numero)
    
    ; Création de l'image temporaire du Canvas qui sert pour dessiner la grille, la sélection et les objets.
    CreateImage(\Int_Image, \Int_Largeur, \Int_Hauteur)
    
  EndWith
  
EndProcedure

Procedure DrawFormes(TypePoint.i, X.i, Y.i, Largeur.i, Hauteur.i, CanvasRoundPoint.i, Couleur.i)
  
  ; On dessine les Formes voulue sur le Canvas.
  
  Select TypePoint.i
      
    Case 1
      Box(X.i, Y.i, Largeur.i, Hauteur.i, Couleur.i) ; dessine un Carré rempli sur l'image du Canvas.
      
    Case 2
      RoundBox(X.i, Y.i, Largeur.i, Hauteur.i, CanvasRoundPoint.i, CanvasRoundPoint.i, Couleur.i) ; dessine un Carré rempli arrondi sur l'image du Canvas.
      
    Case 3
      Circle(X.i + Largeur.i / 2, Y.i + Largeur.i / 2, Largeur.i / 2, Couleur.i) ; dessine un cercle rempli sur l'image du Canvas.
      
    Case 4
      DrawingMode(#PB_2DDrawing_Outlined)
      Box(X.i, Y.i, Largeur.i, Hauteur.i, Couleur.i) ; dessine un Carré vide sur l'image du Canvas.
      
    Case 5
      DrawingMode(#PB_2DDrawing_Outlined)
      RoundBox(X.i, Y.i, Largeur.i, Hauteur.i, CanvasRoundPoint.i, CanvasRoundPoint.i, Couleur.i) ; dessine un Carré vide arrondi sur l'image du Canvas.
      
    Case 6
      DrawingMode(#PB_2DDrawing_Outlined)
      Circle(X.i + Largeur.i / 2, Y.i + Largeur.i / 2, Largeur.i / 2, Couleur.i) ; dessine un cercle vide sur l'image du Canvas.
      
    Default
      Box(X.i, Y.i, Largeur.i, Hauteur.i, Couleur.i) ; dessine un Carré rempli sur l'image du Canvas.
      
  EndSelect
  
EndProcedure

Procedure DrawGrid()
  
  ; On dessine la grille.
  
  Protected X.i = 0, Y.i = 0
  
  With StructureCanvas
    
    ; Boucle tant que X est plus petit que la Largeur du Canvas.
    While X.i < \Int_Largeur - (\Int_TailleFormes - \Int_EspaceFormes)
      
      ; Boucle tant que Y est plus petit que la Hauteur du Canvas.
      While Y.i < GadgetHeight(\Int_Numero) - (\Int_TailleFormes - \Int_EspaceFormes)
        
        If X.i > 0
          
          If Y.i > 0
            DrawFormes(\Int_TypeFormes, X.i + \Int_TailleFormes + \Int_EspaceFormes, Y.i + \Int_TailleFormes + \Int_EspaceFormes, \Int_TailleFormes, \Int_TailleFormes, \Int_ArrondissementFormes, \Int_CouleurFormes)
            Y.i + \Int_TailleFormes + \Int_EspaceFormes
            
          ElseIf Y.i = 0
            DrawFormes(\Int_TypeFormes, X.i + \Int_TailleFormes + \Int_EspaceFormes, Y.i + \Int_EspaceFormes, \Int_TailleFormes, \Int_TailleFormes, \Int_ArrondissementFormes, \Int_CouleurFormes)
            Y.i + \Int_EspaceFormes
            
          EndIf
          
        ElseIf X.i = 0
          
          If Y.i > 0
            DrawFormes(\Int_TypeFormes, X.i + \Int_EspaceFormes, Y.i + \Int_TailleFormes + \Int_EspaceFormes, \Int_TailleFormes, \Int_TailleFormes, \Int_ArrondissementFormes, \Int_CouleurFormes)
            Y.i + \Int_TailleFormes + \Int_EspaceFormes
            
          ElseIf Y.i = 0
            DrawFormes(\Int_TypeFormes, X.i + \Int_EspaceFormes, Y.i + \Int_EspaceFormes, \Int_TailleFormes, \Int_TailleFormes, \Int_ArrondissementFormes, \Int_CouleurFormes)
            Y.i + \Int_EspaceFormes
            
          EndIf
          
        EndIf
        
      Wend
      
      If X.i > 0
        X.i + \Int_TailleFormes + \Int_EspaceFormes ; On déplace le pointeur de la position de X.
        
      ElseIf X.i = 0
        X.i + \Int_EspaceFormes ; On déplace le pointeur la position de X.
        
      EndIf
      
      Y.i = 0 ; On revient à la position Y du début.
      
    Wend
    
  EndWith
  
EndProcedure

Procedure DrawImageTemporaire()
  
  With StructureCanvas
    
    ; On dessine sur l'image temporaire.
    StartDrawing(ImageOutput(\Int_Image))
    
    DrawingMode(#PB_2DDrawing_Default)
    
    ; Efface l'image avec la couleur d'arriere plan du Canvas.
    Box(0 ,0 , \Int_Largeur, \Int_Hauteur, \Int_CouleurArrierePlant)
    
    If StructureCanvas\Int_AfficherGrille = #True
      ; Dessinne la grille sur l'image.
      DrawGrid()
    EndIf
    
    StopDrawing()
    
  EndWith
  
EndProcedure

Procedure DrawCanvas()
  
  With StructureCanvas
    
    ; On dessine l'image temporaire.
    DrawImageTemporaire()
    
    StartDrawing(CanvasOutput(\Int_Numero))
    
    DrawingMode(#PB_2DDrawing_Default)
    
    ; Dessin de l'image temporaire sur le Canvas.
    DrawImage(ImageID(\Int_Image), 0, 0)
    
    StopDrawing()
    
  EndWith
  
EndProcedure

Procedure SizeWindows()
  
  With StructureFenetrePrincipale
    
    If StructureCanvas\Int_AfficherGrille = #True
      
      ; Calcule et enregistre la taille que doit faire la fenêtre suivant la grille et ses paramètres.
      \Int_Largeur = ((WindowWidth(\Int_Numero) / (StructureCanvas\Int_EspaceFormes + StructureCanvas\Int_TailleFormes)) * (StructureCanvas\Int_EspaceFormes + StructureCanvas\Int_TailleFormes)) + StructureCanvas\Int_EspaceFormes
      \Int_Hauteur = ((WindowHeight(\Int_Numero) / (StructureCanvas\Int_EspaceFormes + StructureCanvas\Int_TailleFormes)) * (StructureCanvas\Int_EspaceFormes + StructureCanvas\Int_TailleFormes)) + StructureCanvas\Int_EspaceFormes
      
    Else
      
      ; Enregistre la taille de la fenêtre.
      \Int_Largeur = WindowWidth(\Int_Numero)
      \Int_Hauteur = WindowHeight(\Int_Numero)
      
    EndIf
  
    ; Si la fenêtre est en mode normale.
    If GetWindowState(\Int_Numero) = #PB_Window_Normal
      
      ; Redimensionne la fenêtre avec les nouvelles dimensions.
      ResizeWindow(\Int_Numero, #PB_Ignore, #PB_Ignore, \Int_Largeur, \Int_Hauteur)
      
    EndIf
    
    ; Redimensionne le Canvas avec les nouvelles dimensions, ici les dimensions de la fenêtre.
    ResizeGadget(StructureCanvas\Int_Numero, StructureCanvas\Int_X, StructureCanvas\Int_Y, \Int_Largeur, \Int_Hauteur)
    
  EndWith
  
  With StructureCanvas
    
    ; Enregistre la nouvelle taille du Canvas.
    \Int_Largeur = GadgetWidth(\Int_Numero)
    \Int_Hauteur = GadgetHeight(\Int_Numero)
    
    ; Suppression de l'image temporaire, si elle existe.
    If IsImage(\Int_Image) > 0
      FreeImage(\Int_Image)
    EndIf
    
    ; Création d'une nouvelle image temporaire.
    CreateImage(\Int_Numero, \Int_Largeur, \Int_Hauteur)
    
    ; Si l'image a bien été créée.
    If IsImage(\Int_Image) > 0
      ; On Dessine le Canvas.
      DrawCanvas()
    EndIf
    
  EndWith
  
EndProcedure

Procedure MoveWindow()
  
  With StructureFenetrePrincipale
    
    ; Enregistre la nouvelle position de la fenêtre.
    \Int_X = WindowX(\Int_Numero)
    \Int_Y = WindowY(\Int_Numero)
    
  EndWith
  
EndProcedure

Procedure EventCanvas(Int_EventType.i)
  
  With StructureCanvas
    
    ; Quel type d'évènement est intervenu sur le Canvas.
    Select Int_EventType
        
      Case #PB_EventType_LeftButtonDown ; Le bouton gauche de la souris a été pressé.
        
        ; Obtient et Sauvegarde la position actuel du clique de la souris.
        \Int_CliqueXsouris = GetGadgetAttribute(\Int_Numero, #PB_Canvas_MouseX)
        \Int_CliqueYsouris = GetGadgetAttribute(\Int_Numero, #PB_Canvas_MouseY)
        
      Case #PB_EventType_LeftButtonUp ; Le bouton gauche de la souris a été relâché.
        
        
        
        ; Efface la position actuel du clique de la souris.
        \Int_CliqueXsouris = 0
        \Int_CliqueYsouris = 0
        
        ; Efface la position ainsi que la taille de la séléction du drag de la souris.
        StructureSelection\Int_SelectionXsouris = 0
        StructureSelection\Int_SelectionYsouris = 0
        StructureSelection\Int_SelectionLargeur = 0
        StructureSelection\Int_SelectionHauteur = 0
        
        
      Case #PB_EventType_MouseMove ; Le curseur de la souris a bougé.
        
        ; Sauvegarde de la position actuel de la souris.
        \Int_Xsouris = GetGadgetAttribute(\Int_Numero, #PB_Canvas_MouseX)
        \Int_Ysouris = GetGadgetAttribute(\Int_Numero, #PB_Canvas_MouseY)
        
        ; Si le bouton gauche de la souris est préssé.
        If GetGadgetAttribute(\Int_Numero, #PB_Canvas_Buttons) = #PB_Canvas_LeftButton 
          
          ; Calcule de la Largeur ainsi que la Hauteur de drag de la souris.
          
          ; Si la position X de la souris est inférieur ou égale à la position du clique de celle-ci.
          If \Int_Xsouris <= \Int_CliqueXsouris
            
            ; La position X de départ du drag devient la position actuel de la souris.
            StructureSelection\Int_SelectionXsouris = \Int_Xsouris
            
            ; La Largeur du drag devient la position du clique de celle-ci.
            StructureSelection\Int_SelectionLargeur = \Int_CliqueXsouris - \Int_Xsouris
            
          Else ; Sinon, la position de la souris est supérieur à la position du clique de celle-ci.
            
            ; La position X du drag de départ devient la position du clique de la souris.
            StructureSelection\Int_SelectionXsouris = \Int_CliqueXsouris
            
            ; La Largeur du drag devient la position actuel de la souris.
            StructureSelection\Int_SelectionLargeur = \Int_Xsouris - \Int_CliqueXsouris
            
          EndIf
          
          ; Si la position Y de la souris est inférieur ou égale à la position du clique de celle-ci.
          If \Int_Ysouris <= \Int_CliqueYsouris
            
            ; La position Y de départ du drag devient la position actuel de la souris.
            StructureSelection\Int_SelectionYsouris = \Int_Ysouris
            
            ; La Hauteur du drag devient la position du clique de celle-ci.
            StructureSelection\Int_SelectionHauteur = \Int_CliqueYsouris - \Int_Ysouris
            
          Else ; Sinon, la position de la souris est supérieur à la position du clique de celle-ci.
            
            ; La position Y du drag de départ devient la position du clique de la souris.
            StructureSelection\Int_SelectionYsouris = \Int_CliqueYsouris
            
            ; La Hauteur du drag devient la position actuel de la souris.
            StructureSelection\Int_SelectionHauteur = \Int_Ysouris - \Int_CliqueYsouris
            
          EndIf
          
        EndIf
        
    EndSelect
    
  EndWith
  
EndProcedure

;}

; On ouvre la fenêtre.
FenetrePrincipale()

; On Dessine le Canvas.
DrawCanvas()

; Redimentionne la fenêtre suivant sa taille actuelle, aux proportions le plus proche possible du Canvas suivant ses paramètres.
SizeWindows()

;{ La boucle Principale du programme.

Define Int_WaitWindowEvent.i = 0
Define Int_EventWindow.i = 0
Define Int_EventGadget.i = 0
Define Int_EventType.i = 0

Repeat
  
  Int_WaitWindowEvent = WaitWindowEvent() ; Evènement de la fenêtre.
  Int_EventWindow = EventWindow() ; Sur quel fenêtre c'est produit l'évènement.
  Int_EventGadget = EventGadget() ; Evènement d'un gadget.
  Int_EventType = EventType() ; Type d'évènement d'un gadget.
  
  Select Int_EventWindow
      
    Case #FenetrePrincipale
      
      Select Int_WaitWindowEvent
          
        Case #PB_Event_Gadget
          
          Select Int_EventGadget
              
            Case #Canvas
              EventCanvas(Int_EventType)
              
          EndSelect
          
        Case #PB_Event_SizeWindow ; La fenêtre à été redimensionnée.
          SizeWindows()
          
        Case #PB_Event_MoveWindow ; La fenêtre à été déplacée.
          MoveWindow()
          
        Case #PB_Event_CloseWindow ; La croix de la fenêtre à été cliquée.
          End
          
      EndSelect
      
  EndSelect

ForEver

;}
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Fenêtre avec grille entièrement paramètrable

Message par Kwai chang caine »

Pas mal pour un début, ça me rappelle de VD de VB6 :wink:
C'est une super idée d'éssayer de créer un nouveau VD, comme je l'ai déjà dit y'a pas tant de codes open source aboutis dans ce domaine, voir même pas du tout
C'est un boulot de dingue, je te souhaite de réussir et surtout d'avoir la patience

Je trouve ton code tres propre, par contre il me semble que tu ne coupera pas de passer par une callback pour le resizing du canvas, car ils ne se fait pas à la volée :|

Bonne chance dans ce formidable projet :wink:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Fenêtre avec grille entièrement paramètrable

Message par blendman »

Salut

Deux petites remarques sur ton code.
Tout d'abord, les enumerations : c'est bien de tout regrouper, mais n'oublie de différencier par type d'objets purebasic (fenêtre, gadget, menu...).

Donc, à chaque fois que tu changes d'objets, tu devrais mettre le premier id à zéro pour ce nouvel objet :
au lieu de :

Code : Tout sélectionner

Enumeration Windows 
  #FenetrePrincipale
  #Canvas 
EndEnumeration
Tu devrais avoir :

Code : Tout sélectionner

Enumeration 
  ; window
  #FenetrePrincipale = 0
  ; si tu as d'autres fenêtres, tu les mets ici, sans utiliser "=1", "=2", etc..
  
  ; gadgets
  #Canvas = 0
  ; idem pour tes gadgets, les suivants tu les mettras ici
  #GadgetTruc
  #GadgetMachin

  ; menu
  #MenuFileOpen = 0
  #MenuFileNew
  #MenuFileSave
EndEnumeration
Ensuite, je me demande si afficher une grande image pour effacer à chaque fois ton gadget est judicieux.
C'est plutôt pour les softs de dessins (et encore, ça rame très vite en affichant des grandes images).
Tu devrais plutôt parcourir la liste de tes "objets" (ou éléments que tu vas disposer sur ton canvas) et afficher ceux qui sont visibles, ça devrait être plus fluide.

Bonne continuation ;).
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Fenêtre avec grille entièrement paramètrable

Message par Ar-S »

@Blendman,
Le plus propre reste de nommer les enumeration si tu veux du 0,1,2,3 pour les fenêtres et les gadgets

Code : Tout sélectionner

Enumeration fenetre
  #window0
  #window1
EndEnumeration

Enumeration gadget
  #gadget0
  #gadget1
EndEnumeration

Enumeration menu
  #menu0
  #menu1
EndEnumeration

Debug #window0
Debug #window1
Debug ""
Debug #gadget0
Debug #gadget1
Debug ""
Debug #menu0
Debug #menu1
Numéroter les enumérations n'est pas une bonne habitude (risque de doublon). Dans ton cas ça ne risque pas vu que tu ne numérotes que le 0 mais bon, autant utiliser les fonctions nominative des enumérations de PB
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Fenêtre avec grille entièrement paramètrable

Message par blendman »

Je suis d'accord avec toi Ar-s ;). C'est juste au cas où il préfère vraiment utiliser une seule enumeration en regroupant tout (moi, ça m'arrive, mais je suis bien organisé, donc, ça va je n'ai jamais de doublon, je ne mets que le premier nouvel objet à 0 (fenêtre, gadgets, etc...)

L'avantage de ta technique étant aussi qu'on peut continuer une enumeration déjà commencée (si besoin)

Code : Tout sélectionner

Enumeration fenetre
  #window0
  #window1
EndEnumeration

; ici, plein de code super la classe !!
; oup's, on doit ajouter d'autres fenêtre par exemple

Enumeration fenetre
  #window2
  #window3
EndEnumeration

Debug #window2 ; doit être = à 2
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Fenêtre avec grille entièrement paramètrable

Message par Shadow »

Bonjour, merci de vos conseil :)

@Kwai chang caine
Le plus dur je pense va être tous se qui est gestion des objets (création, sélection, redimensionnement, déplacement, copie, coupage, collage, suppression d'objet...)

Oui c'est dur mais j'apprends beaucoup et comme je le fais moi même j'apprends énormément !
Oui c'est très dur, puis au final une fois que tu sais comment ont fait, tu te dis.... mouais bon sa va c’était pas si terrible que ça...

Sauf que la se ne serra pas comme ça je pense mais bon.

Donc imagine que un type veuille créer un petit éditeur visuel pour ses besoin ou un soft de dessins, il pourra pas le faire !
Avec mon soft il va déjà avoir le principale...

Je ne sais pas ou ça va me mener mais comme je l'es dis je suis motivé !
Merci de t'es encouragements.

Note, pensez à regarder de temps en temps, je mettrais à jours...
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Fenêtre avec grille entièrement paramètrable

Message par falsam »

Quelqu'un a compris comment activer le dessin des formes prévus par ce code dans la procédure DrawFormes() ?
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Fenêtre avec grille entièrement paramètrable

Message par Shadow »

Bonjour Falsam,

J'ai pas compris ta question...
Mais \Int_AfficherGrille = #True ou #False :)
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Fenêtre avec grille entièrement paramètrable

Message par falsam »

Shadow a écrit :J'ai pas compris ta question...
Tu n'as pas compris ma question ? Alors c'est que tu ne sais même pas ce qu'il y a dans le code que tu as posté.

Dans ton code (ou plutôt celui de Micoute) tu as une procédure qui permet de dessiner des formes.

Code : Tout sélectionner

Procedure DrawFormes(TypePoint.i, X.i, Y.i, Largeur.i, Hauteur.i, CanvasRoundPoint.i, Couleur.i)
  
  ; On dessine les Formes voulue sur le Canvas.
  
  Select TypePoint.i
      
    Case 1
      Box(X.i, Y.i, Largeur.i, Hauteur.i, Couleur.i) ; dessine un Carré rempli sur l'image du Canvas.
      
    Case 2
      RoundBox(X.i, Y.i, Largeur.i, Hauteur.i, CanvasRoundPoint.i, CanvasRoundPoint.i, Couleur.i) ; dessine un Carré rempli arrondi sur l'image du Canvas.
      
    Case 3
      Circle(X.i + Largeur.i / 2, Y.i + Largeur.i / 2, Largeur.i / 2, Couleur.i) ; dessine un cercle rempli sur l'image du Canvas.
      
    Case 4
      DrawingMode(#PB_2DDrawing_Outlined)
      Box(X.i, Y.i, Largeur.i, Hauteur.i, Couleur.i) ; dessine un Carré vide sur l'image du Canvas.
      
    Case 5
      DrawingMode(#PB_2DDrawing_Outlined)
      RoundBox(X.i, Y.i, Largeur.i, Hauteur.i, CanvasRoundPoint.i, CanvasRoundPoint.i, Couleur.i) ; dessine un Carré vide arrondi sur l'image du Canvas.
      
    Case 6
      DrawingMode(#PB_2DDrawing_Outlined)
      Circle(X.i + Largeur.i / 2, Y.i + Largeur.i / 2, Largeur.i / 2, Couleur.i) ; dessine un cercle vide sur l'image du Canvas.
      
    Default
      Box(X.i, Y.i, Largeur.i, Hauteur.i, Couleur.i) ; dessine un Carré rempli sur l'image du Canvas.
      
  EndSelect
  
EndProcedure
je ne vois aucun moyen de dessiner ces formes.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Fenêtre avec grille entièrement paramètrable

Message par Shadow »

Falsam, attention à t'es insinuation merci, c'est irrespectueux pour mon travail.

Ce code est 100% de moi ta qua demander à Micoute s'il m'as aider (Sauf corriger les fautes de français).
Et t'as qu'a être plus précis aussi.

Dans: CanvasProprietes
Int_TypeFormes.i ; Type de Forme voulue: Type de Forme voulue: 1 = Carré plein, 2 = Carré arrondi plein, 3 = Rond plein, 4 = Carré vide, 5 = Carré arrondi vide, 6 = Rond vide.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Fenêtre avec grille entièrement paramètrable

Message par falsam »

En fait ce que tu appelles forme, c'est la forme de chaque point de la grille affichée. !!!! ok
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Fenêtre avec grille entièrement paramètrable

Message par Shadow »

En faite oui c'est ça sauf que tu peu mettre autre chose que un point :)
La mise à jour arrive bientôt avec pas mal de nouveauté :)
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Fenêtre avec grille entièrement paramètrable

Message par Micoute »

falsam a écrit :Dans ton code (ou plutôt celui de Micoute) tu as une procédure qui permet de dessiner des formes.
Je voudrais bien, mais malheureusement ce n'est pas le cas, moi je me contente de mettre l'orthographe des commentaires en français qui ne pique pas les yeux !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Re: Fenêtre avec grille entièrement paramètrable

Message par SPH »

Shadow a écrit :La mise à jour arrive bientôt avec pas mal de nouveauté :)
Vivement :!: :wink:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Fenêtre avec grille entièrement paramètrable

Message par Kwai chang caine »

Oui j'attends moi aussi...j'adore les VD
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre