ASTUCE: dialog (redessiner un canvas)

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

ASTUCE: dialog (redessiner un canvas)

Message par microdevweb »

Bonjour à tous,

Cela fait quelque jours que je joue avec les dialogs de Pb qui sont excellents pour une mise en forme efficace des gadgets dans une fenêtre.

Cependant voici un code exemple ou vous aller constater que quand on agrandis la fenêtre le dessin du canvas ne fonctionne pas correctement (même si le canvas est bien redimensionné)

Note; je donne l'astuce après le code :wink:

Code qui ne fonctionne pas correctement

Code : Tout sélectionner

; Requiered : PB 5.60
; Author    : MicrodevWeb
; Name      :Dialogue redessiner le canvas
Global gForm
Procedure Draw()
  Protected w=GadgetWidth(0)
  Protected h=GadgetHeight(0)
  Protected i,x,wc=w/4
  Protected Dim color(4)
  color(0)=$FF0000FF
  color(1)=$FF00FC7C
  color(2)=$FFFF901E
  color(3)=$FF13458B
  StartVectorDrawing(CanvasVectorOutput(0))
  For i=0 To 3
    VectorSourceColor(color(i))
    AddPathBox(x,0,wc,h)
    FillPath()
    x+wc
  Next
  StopVectorDrawing()
EndProcedure
Procedure EventCanvas()
  Select EventType()
    Case #PB_EventType_Resize
      Draw()
  EndSelect
EndProcedure
Procedure Open()
  Protected Font=LoadFont(#PB_Any,"Arial",11,#PB_Font_HighQuality)
  Protected xml.s,myXml
  ; Contruction dynamique du fichier xml
  ; Note: j'ajoute Chr(10) pour mieu repèrer la ligne d'erreur :)
  xml="<window name='mainForm' width='800' height='600' text='Teste'"+
      " flags='#PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered'>"+Chr(10)+
      "   <hbox> "+Chr(10)+
      "       <hbox expand='item:1'> "+Chr(10)+
      "         <canvas id='0' name='canvas'/> "+Chr(10)+
      "         <button id='1' name='bt_new' text='Nouveau' width='90' height='30' /> "+Chr(10)+
      "       </hbox> "+Chr(10)+
      "   </hbox> "+Chr(10)+
      "</window>"
  ; On utilise une police par défaut
  SetGadgetFont(#PB_Default,FontID(Font))
  ; Chargement du fichier xml
  myXml=CatchXML(#PB_Any, @xml, StringByteLength(xml), 0,#PB_UTF8)
  If Not myXml Or XMLStatus(myXml) <> #PB_XML_Success
    MessageRequester("XML ERROR",XMLError(myXml)+" line "+Str(XMLErrorLine(myXml)),#PB_MessageRequester_Error)
    End 
  EndIf
  ; Création du dialog
  gForm=CreateDialog(#PB_Any)
  If Not gForm
    MessageRequester("DIALOG ERROR","Impossible de créer le dialog",#PB_MessageRequester_Error)
    End 
  EndIf
  ; Ouverture de la fenêtre
  If Not OpenXMLDialog(gForm,myXml,"mainForm")
    MessageRequester("DIALOG ERROR","Impossible d'ouvrir la fenêtre",#PB_MessageRequester_Error)
    End 
  EndIf
  ; Dessin des colonnes sur le canvas
  Draw()
  ; Mise en place des callback
  BindGadgetEvent(0,@EventCanvas())
EndProcedure

Open()

Repeat
  WaitWindowEvent()
Until Event()=#PB_Event_CloseWindow
L'astuce pour que cela fonctionne est la suivante
:arrow: ajoutez

Code : Tout sélectionner

ResizeGadget(0,#PB_Ignore,#PB_Ignore,#PB_Ignore,#PB_Ignore)
avant de redessiner et la cela fonctionne parfaitement

Code qui fonctionne

Code : Tout sélectionner

; Requiered : PB 5.60
; Author    : MicrodevWeb
; Name      :Dialogue redessiner le canvas
Global gForm
Procedure Draw()
  Protected w=GadgetWidth(0)
  Protected h=GadgetHeight(0)
  Protected i,x,wc=w/4
  Protected Dim color(4)
  color(0)=$FF0000FF
  color(1)=$FF00FC7C
  color(2)=$FFFF901E
  color(3)=$FF13458B
  StartVectorDrawing(CanvasVectorOutput(0))
  For i=0 To 3
    VectorSourceColor(color(i))
    AddPathBox(x,0,wc,h)
    FillPath()
    x+wc
  Next
  StopVectorDrawing()
EndProcedure
Procedure EventCanvas()
  Select EventType()
    Case #PB_EventType_Resize
      ; Ajoute ceci pour que cela fonctionne
      ResizeGadget(0,#PB_Ignore,#PB_Ignore,#PB_Ignore,#PB_Ignore)
      Draw()
  EndSelect
EndProcedure
Procedure Open()
  Protected Font=LoadFont(#PB_Any,"Arial",11,#PB_Font_HighQuality)
  Protected xml.s,myXml
  ; Contruction dynamique du fichier xml
  ; Note: j'ajoute Chr(10) pour mieu repèrer la ligne d'erreur :)
  xml="<window name='mainForm' width='800' height='600' text='Teste'"+
      " flags='#PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered'>"+Chr(10)+
      "   <hbox> "+Chr(10)+
      "       <hbox expand='item:1'> "+Chr(10)+
      "         <canvas id='0' name='canvas'/> "+Chr(10)+
      "         <button id='1' name='bt_new' text='Nouveau' width='90' height='30' /> "+Chr(10)+
      "       </hbox> "+Chr(10)+
      "   </hbox> "+Chr(10)+
      "</window>"
  ; On utilise une police par défaut
  SetGadgetFont(#PB_Default,FontID(Font))
  ; Chargement du fichier xml
  myXml=CatchXML(#PB_Any, @xml, StringByteLength(xml), 0,#PB_UTF8)
  If Not myXml Or XMLStatus(myXml) <> #PB_XML_Success
    MessageRequester("XML ERROR",XMLError(myXml)+" line "+Str(XMLErrorLine(myXml)),#PB_MessageRequester_Error)
    End 
  EndIf
  ; Création du dialog
  gForm=CreateDialog(#PB_Any)
  If Not gForm
    MessageRequester("DIALOG ERROR","Impossible de créer le dialog",#PB_MessageRequester_Error)
    End 
  EndIf
  ; Ouverture de la fenêtre
  If Not OpenXMLDialog(gForm,myXml,"mainForm")
    MessageRequester("DIALOG ERROR","Impossible d'ouvrir la fenêtre",#PB_MessageRequester_Error)
    End 
  EndIf
  ; Dessin des colonnes sur le canvas
  Draw()
  ; Mise en place des callback
  BindGadgetEvent(0,@EventCanvas())
EndProcedure

Open()

Repeat
  WaitWindowEvent()
Until Event()=#PB_Event_CloseWindow
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège