Bouton sur image

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

Bouton sur image

Message 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
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5

PureBasic 6.11 MacOS
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Bouton sur image

Message 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.
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

Re: Bouton sur image

Message 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.
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5

PureBasic 6.11 MacOS
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Bouton sur image

Message 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 
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

Re: Bouton sur image

Message par Bmld76 »

Merci mais je ne peux pas le compilé : erreur de constante, structure non trouvée .
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5

PureBasic 6.11 MacOS
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Bouton sur image

Message 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
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

Re: Bouton sur image

Message 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
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5

PureBasic 6.11 MacOS
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Bouton sur image

Message 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.
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

Re: Bouton sur image

Message 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"
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5

PureBasic 6.11 MacOS
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Bouton sur image

Message 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...
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Bouton sur image

Message 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.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Bouton sur image

Message 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
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Bouton sur image

Message 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.
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Bouton sur image

Message 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.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Bouton sur image

Message 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:
Répondre