Page 1 sur 1

Fonctionnement etrange de GrabDrawingImage() ???

Publié : ven. 03/juin/2016 17:47
par Patrick88
A partir de ce code pris dans les exemple de PB, code qui capture l'image d'un bouton sur la fenêtre du programme et l'affiche dans un bouton image et sur la fenêtre.

Code : Tout sélectionner

Define.i Event, Image

If OpenWindow(0, 0, 0, 430, 100, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	
	ButtonGadget(1, 5, 70, 200, 30, "Dessiner sur la fenêtre")
	ButtonImageGadget(2, 0, 0, 210, 70, 0)
	
	Repeat
		Event = WaitWindowEvent()
		
		Select Event
			Case #PB_Event_Gadget
				Select EventGadget()
					Case 1
						If StartDrawing(WindowOutput(0))
							;Debug OutputDepth()
							If IsImage(Image)
								FreeImage(Image)
							EndIf
							Image = GrabDrawingImage(#PB_Any,  GadgetX(1), GadgetY(1), GadgetWidth(1), GadgetHeight(1))
							DrawImage(ImageID(Image), 220, 20)
							;DrawAlphaImage(ImageID(Image), 220, 20)
							StopDrawing()
							SetGadgetAttribute(2, #PB_Button_Image, ImageID(Image) )
						EndIf
				EndSelect
		EndSelect
	Until Event = #PB_Event_CloseWindow
EndIf
Mon code devrait faire a peu près la même chose, mais il ne fonctionne pas avec le bouton, il ne le dessine pas ou l'image n'existe pas....
cela fonctionne bien avec le gadget texte, j'ai créer un bouton bidon avec l'id 1 et je lui retransfaire le focus au cas ou, mais c'est pas ça qui coince....
pour que le bouton soit pris, il faut le désactiver avant sa capture (procedure AjouteGadget - disableGadget....)

le principe du programme, je crée le gadget voulu avec toujours le même identifiant, je capture son image, détruit le gadget, affiche l'image dans #PB_Event_Repaint

je comprends pas, un truc bateau que je fais mal ou auquel je pense pas... ???

Patrick

Code : Tout sélectionner

EnableExplicit

Enumeration window
  #Form_principal  
EndEnumeration

Enumeration menu
  #Mnu_principal
  #Mnu_insert_button
  #Mnu_insert_text
  
EndEnumeration

Enumeration 0
  #gad_DessinGadget  
EndEnumeration

#Souris_Bouge = 512;
#SourisBG_BAS = 513;
#SourisBG_HAUT = 514;
#SourisBG_Dbl_Clic = 515;
#SourisBD_BAS = 516;
#SourisBD_HAUT = 517;
#SourisBD_Dbl_Clic = 518;
#SourisBM_BAS = 519;
#SourisBM_HAUT = 520;
#SourisBM_Dbl_Clic = 521;

Structure STRUC_GADGET
  l_identifiant.l
  l_type.l
  l_posX.l
  l_posY.l
  l_largeur.l
  l_hauteur.l
  s_titre.s
  l_option.l
  l_Image_du_gadget.l
EndStructure

Structure STRUC_Sauve_Event
  no_event.b
  xdep.l
  ydep.l
  bouton_souris.b
  souris_bouge.b
EndStructure

Global NewList List_Gadget.STRUC_GADGET()
Global EtatEvent.STRUC_Sauve_Event
Global l_DenierNumeroIdentifiant.l
Global b_DemandeCaptureGadget.b

Procedure CaptureGadget()
   Protected Image.l
   If StartDrawing(WindowOutput(#Form_principal))
			If IsImage(Image)
				FreeImage(Image)
			EndIf
			Image = GrabDrawingImage(#PB_Any,GadgetX(#gad_DessinGadget), GadgetY(#gad_DessinGadget), GadgetWidth(#gad_DessinGadget), GadgetHeight(#gad_DessinGadget)) 
			List_Gadget()\l_Image_du_gadget = Image
			;FreeGadget(#gad_DessinGadget)
			
			StopDrawing()
		EndIf
		b_DemandeCaptureGadget = #False
EndProcedure
	
Procedure AjouteGadget(type_gadget.l,x.l,y.l,largeur.l,hauteur.l,titre.s,option.l)
 
  AddElement(List_Gadget())
  With List_Gadget()
    \l_identifiant = l_DenierNumeroIdentifiant
    \l_type = type_gadget
    \l_posX = x
    \l_posY = y
    \l_largeur = largeur
    \l_hauteur = hauteur
    \s_titre = titre
    \l_option = option
      
    Select type_gadget
      Case #PB_GadgetType_Button
        ButtonGadget(#gad_DessinGadget,\l_posX,\l_posY,\l_largeur,\l_hauteur,\s_titre);,\l_option)
        ;DisableGadget(#gad_DessinGadget,#True)
      Case #PB_GadgetType_Text
        TextGadget(#gad_DessinGadget,\l_posX,\l_posY,\l_largeur,\l_hauteur,\s_titre);,\l_option)
    EndSelect
    SetActiveGadget(1)
   
	EndWith 
	b_DemandeCaptureGadget = #True
  l_DenierNumeroIdentifiant+1
  
EndProcedure

Procedure Fen_Principale()
  Protected Event.l
  
  If OpenWindow(#Form_principal,10,10,1024,768,"Edit-minator",#PB_Window_SystemMenu)
    
     If CreateMenu(#Mnu_principal, WindowID(#Form_principal))
       MenuTitle("Inserer")
       MenuItem(#Mnu_insert_button, "Bouton")
       MenuItem(#Mnu_insert_text, "Text")
       
     EndIf
     
    ButtonGadget(1,0,0,100,50,"lijhk")
    l_DenierNumeroIdentifiant = 1000
    b_DemandeCaptureGadget = #False
    
    Repeat
      Event = WaitWindowEvent()   
      
      Select Event
        Case #PB_Event_Repaint
          ForEach List_Gadget()
            If StartDrawing(WindowOutput(#Form_principal))
              DrawImage(ImageID(List_Gadget()\l_Image_du_gadget), List_Gadget()\l_posX,List_Gadget()\l_posY+100)  
              StopDrawing()
            EndIf
          Next
          
        Case #PB_Event_Menu
          Select EventMenu()
            Case #Mnu_insert_button
              AjouteGadget(#PB_GadgetType_Button,100,100,100,20,"Bouton_",#NUL)
              
            Case #Mnu_insert_text
              AjouteGadget(#PB_GadgetType_Text,100,100,100,20,"text_",#NUL)
                    
          EndSelect ; event menu
        Default
          ;Debug event
      EndSelect ; event general
      
      If b_DemandeCaptureGadget = #True
        CaptureGadget()

        
      EndIf
      
    Until Event = #PB_Event_CloseWindow
  EndIf
EndProcedure


Fen_Principale()
End

Re: Fonctionnement etrange de GrabDrawingImage() ???

Publié : lun. 06/juin/2016 1:52
par Demivec
Essai:

Code : Tout sélectionner

Procedure CaptureGadget()
   Protected Image.i ;valeur est un entier
   If StartDrawing(WindowOutput(#Form_principal))
         If IsImage(List_Gadget()\i_Image_du_gadget) ;IsImage(Image)
            FreeImage(List_Gadget()\i_Image_du_gadget) ;FreeImage(Image)
         EndIf
         Image = GrabDrawingImage(#PB_Any,GadgetX(#gad_DessinGadget), GadgetY(#gad_DessinGadget), GadgetWidth(#gad_DessinGadget), GadgetHeight(#gad_DessinGadget)) 
         List_Gadget()\i_Image_du_gadget = Image
         ;FreeGadget(#gad_DessinGadget)
         
         StopDrawing()
      EndIf
      b_DemandeCaptureGadget = #False
EndProcedure

Re: Fonctionnement etrange de GrabDrawingImage() ???

Publié : lun. 06/juin/2016 19:33
par Patrick88
pas mieux, ne change rien :(

tant pis, je ferai "autrement"... ce sera moins "visuel" :mrgreen:

merci

Pat