Fonctionnement etrange de GrabDrawingImage() ???
Publié : ven. 03/juin/2016 17:47
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.
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
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
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