Page 1 sur 3

Bouton sur image

Publié : jeu. 28/mars/2024 15:36
par Bmld76
Bonjour

Sous MacOs un bouton placé sur une image fonctionne mais pas sous Windows. J'ai cherché mais je n'ai pas trouvé de solution pour le faire fonctionner sous windows, j'ai du louper quelque chose. Merci si vous avez une solution.

Image Image

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 222, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  If CreateImage(0, 1400-20, 2200, 32,  RGB(239, 239, 239)) And StartDrawing(ImageOutput(0))
      Box(1,i,1400-20, 40, RGB(216, 244, 254))
    StopDrawing() 
    ImageGadget(0, 0, 0, 200, 200, ImageID(0))
  EndIf
  
  ButtonGadget(1, 10, 10, 200, 20, "Standard Button")
 
  Repeat 
  
  Event = WaitWindowEvent()
  Gadget = EventGadget();
  Type_Event= EventType()

  Select Event
    Case #PB_Event_Gadget  
      Select Gadget
        Case 1
          Debug "bouton"
      EndSelect
  EndSelect 
  
  Until WaitWindowEvent() = #PB_Event_CloseWindow
  
  
EndIf

Re: Bouton sur image

Publié : jeu. 28/mars/2024 16:10
par Mesa
Exemple 1: Windows seulement et ça ne marche pas très bien.
Exemple 2: Multiplateforme et marche bien, en utilisant un canvas.

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 200, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	
	ButtonGadget(1, 10, 10, 180, 20, "Standard Button",#WS_CLIPSIBLINGS); avant le imagegadget !
	If CreateImage(0, 200, 200, 32,  RGB(239, 239, 239)) And StartDrawing(ImageOutput(0))
		Box(0,0,200, 40, RGB(216, 244, 254))
		StopDrawing() 
		ImageGadget(0, 0, 0, 200, 200, ImageID(0),#WS_CLIPSIBLINGS)
	EndIf
	
	
	;   SetActiveGadget(1)
	
	Repeat 
		
		Event = WaitWindowEvent()
		Gadget = EventGadget();
		Type_Event= EventType()
		
		Select Event
			Case #PB_Event_Gadget  
				Select Gadget
					Case 1
						Debug "bouton"
				EndSelect
		EndSelect 
		
	Until Event = #PB_Event_CloseWindow
	
	
EndIf

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 200, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	
	
	If CreateImage(0, 200, 200, 32,  RGB(239, 239, 239)) And StartDrawing(ImageOutput(0))
		Box(0,0,200, 40, RGB(216, 244, 254))
		StopDrawing() 
		CanvasGadget(0, 0, 0, 200, 200, #PB_Canvas_Container)
		SetGadgetAttribute(0, #PB_Canvas_Image, ImageID(0))
		
	EndIf
	
	ButtonGadget(1, 10, 10, 180, 20, "Standard Button")
	
	
	Repeat 
		
		Event = WaitWindowEvent()
		Gadget = EventGadget();
		Type_Event= EventType()
		
		Select Event
			Case #PB_Event_Gadget  
				Select Gadget
					Case 1
						Debug "bouton"
				EndSelect
		EndSelect 
		
	Until Event = #PB_Event_CloseWindow
	
	
EndIf
Mesa.

Re: Bouton sur image

Publié : jeu. 28/mars/2024 16:24
par Bmld76
Merci, je viens de tester canvas, ca marche sur l'exemple mais je retrouve le même problème sur mon programme ou j'essaye de faire une alternance de ligne bleue/blanche pour une liste réaliser avec text et bouton. Le problème en plus des gadgets qui ne réagissent plus sont les horribles fond gris des gadgets. Bref , je vais faire une interface plus simple pour windows.

Re: Bouton sur image

Publié : dim. 31/mars/2024 9:16
par MLD
Un peu en retard mais regarde ceci

Code : Tout sélectionner

Enumeration
#button1
#button2
#button3
#button4
#button5
EndEnumeration

icon2 = ExtractIcon_(0,"Shell32.dll", 131)
icon3 = ExtractIcon_(0,"Shell32.dll", 55)
icon4 = LoadIcon_(0,#IDI_ASTERISK)     
icon5 = LoadIcon_(0,#IDI_EXCLAMATION) 

FontID0 = LoadFont(0,"Courier New", 12)
FontID1 = LoadFont(1,"Comic sans MS", 15,#PB_Font_Underline  )
   
Procedure Bticotext(idbt,x.f,y.f,larg.f,haut.f,iconid,txt$,font,coultext,coulbout) 
Define hautimg.f,largimg.f,imgze.f
CI=CreateImage(idbt, larg, haut)
 
hdc=StartDrawing(ImageOutput(idbt))
SelectObject_(hdc, font)
  ; possibilité de régler l'espace entre lettres
  ; SetTextCharacterExtra_(hdc, 1) 
 
  ; Dessine l'image 
  Box(0,0,larg,haut,coulbout)
   
  GetIconInfo_(iconid,@info.ICONINFO) 
  hautimg=info\xHotspot 
  largimg=info\yHotspot    
  If hautimg > haut-2: hautimg=hautimg/10*8: EndIf
  If largimg > larg-2: largimg=largimg/10*8: EndIf
  If hautimg < (haut-2)/2: hautimg=hautimg*1.8:largimg=largimg*1.8: EndIf
  dbimg=5 ; distance de bord gauche/image 
  cthimg=(haut-hautimg)/2 ;centre l'image en hauteur
  DrawImage(iconid,dbimg,cthimg,largimg,hautimg)
    
  ; Position du texte
  DrawingMode(#PB_2DDrawing_Transparent) 
  hautxt=TextHeight(txt$) 
  largtxt=TextWidth (txt$) 
  ditxt=largimg+dbimg+3 ; distance image/texte
  ctxt=(haut-hautxt)/2 ; centre le text en hauteur
  DrawText(ditxt,ctxt,txt$,coultext)
StopDrawing ()
ButtonImageGadget(idbt,x,y,larg,haut,ImageID(idbt))
EndProcedure


If OpenWindow(0,0,0,820,600,"Test Boutons") 
    
     Bticotext(#button1,10,100,190,36,icon2,"Premier Bouton",FontID0,#Blue,$F1F1F1)
     Bticotext(#button2,220,100,150,36,icon3,"2em Bouton",FontID1 ,#Red,$DAE1DE)
     Bticotext(#button3,10,150,150,36,icon4,"3em Bouton",FontID0,#Blue,$5AB5BD)
     Bticotext(#button4,220,150,160,72,icon5,"4em Bouton",FontID1,#Gray,$E4BBAF)
     Bticotext(#button5,10,250,160,72,icon4,"5em Bouton",FontID1,#Black,GetSysColor_(#COLOR_BTNFACE))     
    Repeat 
      ;Debug #PB_gadget_Default
      Event = WaitWindowEvent() 
        If Event = #PB_Event_Gadget
          Select EventGadget()
           Case #button1
            ;votre code
            MessageBeep_(#MB_ICONEXCLAMATION)
            ;MessageBeep_(#MB_ICONASTERISK)

           EndSelect                                 
         EndIf
      
    Until Event  = #PB_Event_CloseWindow 
EndIf 
DeleteObject_(font) 
End 

Re: Bouton sur image

Publié : lun. 01/avr./2024 18:13
par Bmld76
Merci mais je ne peux pas le compilé : erreur de constante, structure non trouvée .

Re: Bouton sur image

Publié : lun. 01/avr./2024 22:24
par boddhi
Bmld76 a écrit : Merci mais je ne peux pas le compilé : erreur de constante, structure non trouvée .
Salut,

Avec quelles versions de Windows et PB exécutes-tu le code de MLD ? Sous Win10 + PB 5.62 et PB 6.10, le code de MLD est fonctionnel.

Code : Tout sélectionner

#IDI_EXCLAMATION=$7F03
#IDI_ASTERISK=$7F04

Structure ICONINFO
  fIcon.l
  xHotspot.l
  yHotspot.l
  PB_Alignment.b[4]
  hbmMask.i
  hbmColor.i
EndStructure
Vérifie avec le visualisateur de structures (ALT + S) si la structure ICONINFO est présente nativement ou non dans la liste proposée.
Si ce n'est pas le cas, c'est peut-être un problème d'installation ou dû à une version d'essai

Re: Bouton sur image

Publié : mar. 02/avr./2024 11:11
par Bmld76
Bonjour,

Pour mon entreprise, j'ai développé un programme pour générer des signatures mail personnalisé par Thunderbird.

Je ne développe pas sur windows, j'avais juste mis la version free. J'ai installé ma version officielle et le programme de mld fonctionne. Par contre ca ne répond pas à mon problème de faire un programme multi os avec des lignes blanches et bleues alternées derrière des button, des text et des string. Aucun problème sur MacOs et c'est joli, mais impossible sur windows des que j'empile un container, une image ou canvas avec des gadget, plus rien ne fonctionne.

Ca sera pas beau sur windows....

Image

Re: Bouton sur image

Publié : mar. 02/avr./2024 20:04
par boddhi
Une solution possible.
Je ne l'ai pas étudié en détail mais j'ai cru comprendre que la gestion des boutons se fait par blocs mémoire.

Ca semble faire le job et, en cela, rien à redire !. D'autant plus qu'elle existe :mrgreen:

En revanche, perso, niveau technique de programmation, je trouve un truc vraiment dégueulasse, c'est la manière dont sont utilisées les variables. A chaque appel ou assignation, le typage est rappelé, ce qui rend chiant la manip quand il doit être modifié.
Et comme le code a été pensé pour du 32bits, pour certaines variables, notamment avec le typage .l, cela s'avérera nécessaire.

A défaut d'un code plus démonstratif, je ne sais pas combien de lignes tu prévois lors de l'affichage, si tout tient sur une seule page ou sur plusieurs pages en cas de nombreuses lignes, mais avec le code proposé, pourquoi ne pas envisager plutôt la solution d'une liste structurée. Ca en simplifierait peut-être l'usage.

Re: Bouton sur image

Publié : mar. 02/avr./2024 21:05
par Bmld76
Merci pour ces infos, mais le problème est "bouton sur image", donc placer un bouton sur une image et le tout dans un contener et non "image dans bouton"

Re: Bouton sur image

Publié : mar. 02/avr./2024 21:39
par boddhi
Peux-tu fournir un code minimaliste de ce que ton affichage donne déjà sous Windows pour le moment ?
Avec la liste et pas seulement un test pour le bouton...

Re: Bouton sur image

Publié : mar. 02/avr./2024 22:08
par boddhi
Une autre technique pour les boutons avec une couleur de fond. Laquelle a l'avantage d'être multi-OS.

PS : Ne pas oublier d'utiliser les fonctions de mise à l'échelle DPI si besoin.

Re: Bouton sur image

Publié : mer. 03/avr./2024 7:47
par boddhi
J'ai retrouvé un vieux code que j'ai adapté pour coller au mieux à l'image que tu as fournie avec utilisation d'un conteneur et un canvas.

Code : Tout sélectionner

Global.f DPIX=DesktopScaledX(100)/100,DPIY=DesktopScaledY(100)/100
;
Procedure.i Fc_Creation_BoutonPersonnalise(ArgNoGadget.u,ArgPosX.u,ArgPosY.u,ArgLargeur.u,ArgHauteur.u,ArgTexte.s,ArgCoulTexte.l,ArgcoulFond.l)
  Protected.i IDGadget,NoImage
  
  NoImage=CreateImage(#PB_Any,ArgLargeur*DPIX,ArgHauteur*DPIY,24,ArgcoulFond)
  If StartDrawing(ImageOutput(NoImage))
    Box(0,0,ArgLargeur*DPIX,ArgHauteur*DPIY,ArgCoulFond)
    DrawText((ArgLargeur*DPIX-TextWidth(ArgTexte))/2,(ArgHauteur*DPIY-TextHeight(ArgTexte))/2,ArgTexte,ArgCoulTexte,ArgcoulFond)
    StopDrawing()
    IDgadget=ButtonImageGadget(ArgNoGadget,ArgPosX,ArgPosY,ArgLargeur,ArgHauteur,ImageID(NoImage))
  EndIf
  ProcedureReturn IDGadget
EndProcedure
;
OpenWindow(0,0,0,200,100,"Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ContainerGadget(0,0,0,200,100,#PB_Container_BorderLess)
CanvasGadget(1,0,0,200,100,#PB_Canvas_Container)
SetGadgetColor(1,#PB_Gadget_BackColor,#Yellow) ; Inutile => juste là pour faire ressortir les zones de dessin
StartDrawing(CanvasOutput(1))
Box(0,0,200*DPIX,50*DPIY,#White)
Box(0,50*DPIY,200*DPIX,50*DPIY,RGB(217,244,253))
StopDrawing()
Fc_Creation_BoutonPersonnalise(2,25,10,150,30,"Texte bouton 1",#Black,#White)
Fc_Creation_BoutonPersonnalise(3,25,60,150,30,"Texte bouton 2",#Black,RGB(217,244,253))
ButtonGadget(4,25,110,150,30,"Bouton normal")
CloseGadgetList()

Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow

Re: Bouton sur image

Publié : mer. 03/avr./2024 8:51
par Mesa
J'avais commencé un code pour toi mais je me suis aperçu qu'il est difficile de changer la couleur d'un checkbox.
Pour cela il faut utiliser un code de ChriR ici https://github.com/ChrisRfr/ObjectTheme.

Je mets quand même le peu de code que j'ai fait :

Code : Tout sélectionner

Structure item
	t1.s
	t2.s	
	t3.s	
	t4.s	
	t5.s	
	t6.s	
	t7.s	
	t8.s
	t9.s	
	
	g1.i
	g2.i
	g3.i
	g4.i
	g5.i
	g6.i
EndStructure

Global NewList items.item()

For i=0 To 10
	AddElement(items())
	items()\t1 = "Texte"
	items()\t2 = "Texte"	
	items()\t3 = "Texte"	
	items()\t4 = "Texte"	
	items()\t5 = "Texte"	
	items()\t6 = "Texte"	
	items()\t7 = "Texte"	
	items()\t8 = "Texte"
	items()\t9 = "Texte"	
Next i

Procedure fond(id)
	epaisseur=40
	StartDrawing(CanvasOutput(0))

	n=OutputHeight()/epaisseur
	y=0
	While n>0
	Box(0,y,OutputWidth(),epaisseur,#White)
	y+epaisseur
	Box(0,y,OutputWidth(),epaisseur,#Cyan)
	y+epaisseur
	n-1
	Wend
StopDrawing()

EndProcedure

Procedure additems(y)
	x=5
	items()\g1=CheckBoxGadget(#PB_Any,x,y,50,25,items()\t1)
	x+30
	StartDrawing(CanvasOutput(0))
	DrawingMode(#PB_2DDrawing_Transparent)

	DrawText(x,y,items()\t2)
	StopDrawing()
	SetGadgetColor(items()\g1,#PB_Gadget_BackColor,#White);ne marche pas sur checkbox
EndProcedure


If OpenWindow(0, 0, 0, 800, 600, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 0, 0, 800, 600, #PB_Canvas_Container)
    fond(0)
    
    additems(10)
    
    
    Repeat
     Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 1 
              CloseWindow(0)
              End  
         EndSelect
            
     EndSelect
   Until Event = #PB_Event_CloseWindow

  EndIf

M.

Re: Bouton sur image

Publié : ven. 05/avr./2024 13:25
par MLD
Bonjour a tous
Il me semble que PB ne permette pas de placer un gadget sur un autre gadget, donc un gadget bouton sur un gadget image ou autres il vaut mieux ne pas y penser.
Mais rien n'empêche de dissocier les cases a cocher, les lignes de texte et les boutons d'une même ligne. l’on peu colorer les cases a cocher les fond de texte et les boutons a la volé.
Pour ton cas j'aurais essayé avec une listeIcongadget puisque l'on peu cliquer dans une ligne de chaque colonne.

Re: Bouton sur image

Publié : ven. 05/avr./2024 15:22
par boddhi
Salut MLD,
MLD a écrit : Il me semble que PB ne permette pas de placer un gadget sur un autre gadget, donc un gadget bouton sur un gadget image ou autres il vaut mieux ne pas y penser.
Petite précision : On peut le faire mais certaines considérations doivent être prises en compte car cela affecte leur affichage.
En premier lieu, si les gadgets peuvent recevoir le focus, en second lieu l'ordre des déclarations des gadgets.

Code : Tout sélectionner

Global.f DPIX=DesktopScaledX(100)/100,DPIY=DesktopScaledY(100)/100
LoadImage(0,#PB_Compiler_Home+"Examples\Sources\Data\PureBasic.bmp")
;
OpenWindow(0,0,0,400,200,"Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonImageGadget(6,70,75,ImageWidth(0),ImageHeight(0),ImageID(0))
ButtonGadget(0,10,10,168,35,"Bouton normal 1")
ButtonImageGadget(1,95,10,ImageWidth(0),ImageHeight(0),ImageID(0))
ImageGadget(2,10,50,168/DPIX,35/DPIY,ImageID(0))
ButtonGadget(3,95,50,168,35,"Bouton normal 2")
ImageGadget(4,180,50,168/DPIX,35/DPIY,ImageID(0))
ButtonImageGadget(5,95,62,ImageWidth(0),ImageHeight(0),ImageID(0))
Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow
 
On peut aussi très bien envisager par exemple deux conteneurs, identiques en position et taille, placés l'un sur l'autre, qui viendrait alternativement à être caché pour l'un et affiché pour l'autre selon les besoins.

En conclusion, on peut superposer deux gadgets sans que PB n'y trouve rien à y redire. :wink: