Page 1 sur 3

Gadget Frame3D

Publié : mar. 29/janv./2013 14:36
par pat
Bonjour à tous,

C'est bien agréable les Gadget Frame3D, avec les lignes pour encadrer les objets.
Ce que je souhaite c'est de pouvoir colorier les lignes, et uniquement les lignes, de la couleur que je souhaite (du vert, du bleu, etc.) alors que par défaut ces lignes sont en noirs.
Comment donc faire pour que ces lignes soient de la couleur que l'on souhaite ?
La couleur des lignes est bien stockée quelque part, mais il faut trouver où ?
Je pense que les APIs sont la solution mais alors pour faire ça il faut être bien calé dans le domaine.
Y aurait-il quelqu'un qui connaisse la solution et merci à lui, pour moi et pour les autres, de nous éclairer de sa lanterne.

Re: Gadget Frame3D

Publié : mar. 29/janv./2013 17:10
par Mesa
En fait les gadgets 3D proviennent de CEGUI http://www.cegui.org.uk/wiki/index.php/Main_Page et purebasic utilise des skins préfabriqués (voir dans le dossier PureBasic\Examples\3D\Data\GUI), tu peux toujours y bricoler les couleurs des images présentes. Sinon, il va falloir créer de nouveaux skins à l'aide du sdk de cegui, à télécharger sur leur site.

A ma connaissances, il n'y a pas grande aide sur les forums de PB, c'est dommage, tu pourrais ouvrir la voie :wink:

Mesa.

Re: Gadget Frame3D

Publié : mar. 29/janv./2013 17:17
par graph100
je pense qu'il veut parler du Frame3DGadget(), et non du Frame3DGadget3D().
Il cherche donc les api pour modifier la couleur d'un gadget. J'ai vu ça sur le forum il n'y a pas si longtemps, mais je ne sais plus ou.

Cherche du coté des SendMessage_()

Re: Gadget Frame3D

Publié : mer. 30/janv./2013 10:07
par Mesa
ah oui, c'est vrai...

On ne peux pas utiliser les api avec ce gadget comme on le ferait avec un bouton, car c'est un gadget créé par Fred, il me semble.

Il faut le recréer avec un canvas ou avec le code de Danilo
http://forums.purebasic.com/english/vie ... 13&t=49733

Code : Tout sélectionner

Procedure MyFrame3DGadget(window, gadget, x, y, width, height, text$, frontcolor=0, backcolor=0, shadow=$FFFFFF)
    background = GetSysColor_(#COLOR_BTNFACE);GetWindowColor(window))
    container  = ContainerGadget(gadget,x,y,width,height)
    img = CreateImage(#PB_Any,width,height)
    If img And StartDrawing(ImageOutput(img))
        Box(0,0,width,height,background)
        DrawingMode(#PB_2DDrawing_Outlined)
        RoundBox(6,6,width-12,height-12,3,3,shadow)
        RoundBox(5,5,width-10,height-10,3,3,backcolor)
        DrawingFont(GetGadgetFont(#PB_Default))
        DrawText(10,0," "+text$+" ",frontcolor, background)
        StopDrawing()
        DisableGadget(ImageGadget(#PB_Any,0,0,width,height,ImageID(img)),1)
    EndIf
    ProcedureReturn container
EndProcedure

OpenWindow(0, 0, 0, 250, 100, "Colored Frame3D", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)

MyFrame3DGadget(0, 0, 10, 10, 230, 80, "This is a Frame3D",RGB($00,$00,$FF),RGB($FF,$00,$00))
ButtonGadget(1,10,20,100,20,"Button")
CloseGadgetList()

Repeat
    Select WaitWindowEvent()
        Case #PB_Event_CloseWindow : Break
        Case #PB_Event_Gadget      : If EventGadget()=1 : MessageRequester("Info","Button pressed") : EndIf
    EndSelect
ForEver
Mesa.

Re: Gadget Frame3D

Publié : mer. 30/janv./2013 10:28
par MLD
Bonjour a tous

J'ai déja posé le problème sur ce forum, sans résultat. Pourtant en VB6 il existe un gadget de ce type ou les couleurs du trait, du titre, du fond sont modifiables a loisir.
Si vous avez des idées, je suis preneur. :lol:

Re: Gadget Frame3D

Publié : mer. 30/janv./2013 14:15
par pat
Merci à tous pour vos réponses.
Je souhaite modifier la couleur du gadget déjà fourni avec PB (donc sans frabriquer quoi que ce soit) et si MLD sait que VB6 peut modifier la couleur du trait, du texte et du fond du gadget, il n'y a pas de raison qu'on ne puisse pas faire pareil en PB.
Mais je pense que graph100 a raison de dire qu'avec les Send_Message(...) on pourrait faire quelque chose. Mais faudrait-il savoir quoi mettre dans le Send_Message(...).
La SDK documentation des APIs est en anglais et c'est pour moi difficile de progresser étant donné que je ne suis pas très doué en langue.
Il doit y avoir des gens qui connaissent très bien les APIs et je pense qu'ils ont la solution à notre problème.
Le gadget Frame3D n'étant qu'un gadget de décoration (et c'est bien sympathique tout de même), on doit, je pense, pouvoir changer les couleurs.
Merci à ceux qui savent de nous éclairer de leur lanterne.

Re: Gadget Frame3D

Publié : mer. 30/janv./2013 15:39
par Backup
:roll: ...

bon , j'interviens .... :mrgreen:


on a deja répété 1000 fois qu'en Purebasic on peut TOUT faire ... (ou presque)
il faut prendre en compte une chose fondamentale

il permet de Dessiner ce qu'on veux ,sur un gadget, une fenetre, le Bureau ( qui est je le rappel aussi une fenetre )

Purebasic est pour le Coup "Bas niveau" , ça signifie , qu'il peut modifier un dessin présent a l'ecran
que ce dessin soit un gadget, une fenetre , et meme un gadget ou une fenetre ne nous appartenant pas !! (si! si! )

tout ceci a été abordé sur notre Forum en Français dans le Text :)

alors , revoici donc un Exemple Breveté Moi-meme

pour le coup , je vais meme en mettre 2 des exemples !

le premier , affiche des Frames coloré , avec Cadre et Fond colorés de façon differente !
le Deuxieme code Affiche les cadres, dont l'un Clignote chaque seconde , Emploi du Timer obligatoire :)

Code : Tout sélectionner


Declare  cadre_color(x,y,larg,haut, couleur_cadre.i,couleur_fond.i)

enumeration
	#win
	#gadget1
	#gadget2
	#gadget3
	#gadget4
endenumeration


If OpenWindow(#win, 0, 0, 320, 250, "Frame3DGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	
	Frame3DGadget(#gadget1, 10,  10, 300, 50, "Cadre en relief standard")
	Frame3DGadget(#gadget2, 10,  70, 300, 50, "", #PB_Frame3D_Single)
	Frame3DGadget(#gadget3, 10, 130, 300, 50, "", #PB_Frame3D_Double)
	Frame3DGadget(#gadget4, 10, 190, 300, 50, "", #PB_Frame3D_Flat)
	AddWindowTimer(#win,123,1000) ; Ajout timer pour le clignotement
	
	
	Repeat
		Event = WindowEvent()
		select Event
			case #PB_Event_Timer
			if EventTimer() = 123
				; ******* grosse arnaque a Dobro  ;o) ***************
				StartDrawing(WindowOutput(#win))
					cadre_color(10,  25, 300, 35, rgb(255,0,0),rgb(125,125,125))
					cadre_color(10,  70, 300, 50, rgb(255,255,0),rgb(0,125,255))
					cadre_color(10, 130, 300, 50, rgb(255,0,255),rgb(255,125,0)) ;d
					cadre_color(10, 190, 300, 50, rgb(0,255,125),rgb(100,255,125))
				StopDrawing()
				; *********************************************
			endif
		Endselect
	Until Event= #PB_Event_CloseWindow
EndIf





Procedure cadre_color(x,y,larg,haut, couleur_cadre.i,couleur_fond.i)
	; By Dobro
	drawingmode(#PB_2DDrawing_Outlined )
	box(x,  y, larg,haut, couleur_cadre.i)
	FillArea(x+2, y+2, -1,couleur_fond.i)
	drawingmode(#PB_2DDrawing_Default )
Endprocedure

; EPB



et voici l'autre exemple qui montre qu'on peux meme faire clignoter un cadre !!
et sans CallBack !! :)

Code : Tout sélectionner


Declare  cadre_color(x,y,larg,haut, couleur_cadre.i,couleur_fond.i)

enumeration
	#win
	#gadget1
	#gadget2
	#gadget3
	#gadget4
endenumeration


If OpenWindow(#win, 0, 0, 320, 250, "Frame3DGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	
	Frame3DGadget(#gadget1, 10,  10, 300, 50, "Cadre en relief standard")
	Frame3DGadget(#gadget2, 10,  70, 300, 50, "", #PB_Frame3D_Single)
	Frame3DGadget(#gadget3, 10, 130, 300, 50, "", #PB_Frame3D_Double)
	Frame3DGadget(#gadget4, 10, 190, 300, 50, "", #PB_Frame3D_Flat)
	AddWindowTimer(#win,123,1000) ; Ajout timer pour le clignotement
	
	
	Repeat
		Event = WindowEvent()
		select Event
			case #PB_Event_Timer
			if EventTimer() = 123
				; ******* grosse arnaque a Dobro  ;o) ***************
				StartDrawing(WindowOutput(#win))
					cadre_color(10,  25, 300, 35, rgb(255,0,0),rgb(125,125,125)) ; cadre 1
					cadre_color(10,  70, 300, 50, rgb(255,255,0),rgb(0,125,255)) ; cadre 2
					
					if stat2=1
						cadre_color(10, 130, 300, 50, rgb(255,0,255),rgb(255,125,0)) ; ici on dessine sur le meme cadre
						stat2=0
						Else
						cadre_color(10, 130, 300, 50, rgb(255,255,0),rgb(0,0,0)) ;  ; ici on dessine sur le meme cadre
						stat2=1
					endif
					cadre_color(10, 190, 300, 50, rgb(0,255,125),rgb(100,255,125)) ; cadre 4
				StopDrawing()
				
				; *********************************************
			endif
		Endselect
	Until Event= #PB_Event_CloseWindow
EndIf





Procedure cadre_color(x,y,larg,haut, couleur_cadre.i,couleur_fond.i)
	; By Dobro
	drawingmode(#PB_2DDrawing_Outlined )
	box(x,  y, larg,haut, couleur_cadre.i)
	FillArea(x+2, y+2, -1,couleur_fond.i)
	drawingmode(#PB_2DDrawing_Default )
Endprocedure

; EPB

on peut avec ce principe dessiner des boutons de couleur, des Canvas avec tour Clignotant,
des Progress Bar coloré , etc ....

Re: Gadget Frame3D

Publié : mer. 30/janv./2013 17:05
par Anonyme2
Salut Dobro,

très bon le coup du timer, ça m'inspire :D

Re: Gadget Frame3D

Publié : mer. 30/janv./2013 17:36
par Backup
:D

Re: Gadget Frame3D

Publié : jeu. 31/janv./2013 11:35
par MLD
Heu! ça ressemble, mais l'on dirait une certaine pub pour une société de crédit :mrgreen:
Ou sont les coins arrondis ect. :?: Tous les gadgets fonctionnent'ils a l'intérieur du cadre :?:

Re: Gadget Frame3D

Publié : jeu. 31/janv./2013 12:34
par Backup
MLD a écrit :Ou sont les coins arrondis ect. :?:
je donne ici le principe , rien n'empeche de les dessiner les coins arrondis ...
de plus , la fonction Frame3DGadget() n'affiche pas de coin arrondis ( du moins sur Seven )
Tous les gadgets fonctionnent'ils a l'intérieur du cadre :?:
je ne vois rien dans ce code qui empecherai le fonctionnement d'un gadget ....

donne plutot un exemple de non fonctionnement , plutot que de mettre en doute le code :!:
lorsque tu ecris :
MLD a écrit : Si vous avez des idées, je suis preneur. :lol:
c'est une idée ..
mais je vois que ça ne me concerne pas ...
finalement , j'aurai peut etre mieux fais de me taire



voici l'exemple du code clignotant avec un bouton Gadget dedans ..
histoire de montrer que ça marche aussi avec un gadget :roll:

Code : Tout sélectionner


Declare  cadre_color(x,y,larg,haut, couleur_cadre.i,couleur_fond.i)

enumeration
	#win
	#gadget1
	#gadget2
	#gadget3
	#gadget4
	#Button
endenumeration


If OpenWindow(#win, 0, 0, 320, 250, "Frame3DGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	
	Frame3DGadget(#gadget1, 10,  10, 300, 50, "Cadre en relief standard")
	Frame3DGadget(#gadget2, 10,  70, 300, 50, "", #PB_Frame3D_Single)
	Frame3DGadget(#gadget3, 10, 130, 300, 50, "", #PB_Frame3D_Double)
	Frame3DGadget(#gadget4, 10, 190, 300, 50, "", #PB_Frame3D_Flat)
	ButtonGadget(#Button, 15, 140, 200, 20, "bouton qui marche" )
	
	AddWindowTimer(#win,123,1000) ; Ajout timer pour le clignotement
	
	
	Repeat
		Event = WindowEvent()
		select Event
			case #PB_Event_Timer
			if EventTimer() = 123
				; ******* grosse arnaque a Dobro  ;o) ***************
				StartDrawing(WindowOutput(#win))
					cadre_color(10,  25, 300, 35, rgb(255,0,0),rgb(125,125,125)) ; cadre 1
					cadre_color(10,  70, 300, 50, rgb(255,255,0),rgb(0,125,255)) ; cadre 2
					
					if stat2=1
						cadre_color(10, 130, 300, 50, rgb(255,0,255),rgb(255,125,0)) ; ici on dessine sur le meme cadre
						stat2=0
						Else
						cadre_color(10, 130, 300, 50, rgb(255,255,0),rgb(0,0,0)) ;  ; ici on dessine sur le meme cadre
						stat2=1
					endif
					cadre_color(10, 190, 300, 50, rgb(0,255,125),rgb(100,255,125)) ; cadre 4
				StopDrawing()
				; *********************************************
			endif
			case #PB_Event_Gadget
			Select EventGadget()
				Case #button
				MessageRequester("test bouton","ben ça tourne")
			EndSelect
		Endselect
	Until Event= #PB_Event_CloseWindow
EndIf





Procedure cadre_color(x,y,larg,haut, couleur_cadre.i,couleur_fond.i)
	; By Dobro
	drawingmode(#PB_2DDrawing_Outlined )
	box(x,  y, larg,haut, couleur_cadre.i)
	FillArea(x+2, y+2, -1,couleur_fond.i)
	drawingmode(#PB_2DDrawing_Default )
Endprocedure



; 

; EPB

Re: Gadget Frame3D

Publié : jeu. 31/janv./2013 13:22
par Backup
Rappel ..

meme principe pour faire une guirlande autour d'un canva gadget .. (vous pouvez dessiner dedans )
celui-ci deviendra fond blanc lorsqu'il sera activé

Code : Tout sélectionner

enumeration
	#win
	#cadre
	#canvas
EndEnumeration

declare WindowCallback(WindowID,message,wParam,lParam)


If OpenWindow(#win, 0, 0, 600, 600, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_SizeGadget)
	
	CanvasGadget(#canvas, 20, 20, 190, 190,#PB_Canvas_Border)
	
	SetWindowColor(#WIN,rgb(0,0,0)) ; 
	; ******* grosse arnaque a Dobro  ;o) ***************
	
	StartDrawing(WindowOutput(#win))
		
		drawingmode(#PB_2DDrawing_Outlined )
		box(10,10,210,210,rgb(0,255,0))  ; cadre exterieur
		FillArea(15, 15, -1,rgb(0,125,0))
		drawingmode(#PB_2DDrawing_Default )
		; haut
		for i=2 to 204 step 6
			circle(11+i,15,2,rgb(random(255),random(255),random(255)))
		next i
		; bas
		for i=2 to 204 step 6
			circle(11+i,213,2,rgb(random(255),random(255),random(255)))
		next i
		; gauche
		for i=2 to 204 step 6
			circle(15,11+i,2,rgb(random(255),random(255),random(255)))
		next i
		; droite
		for i=2 to 204 step 6
			circle(213,11+i,2,rgb(random(255),random(255),random(255)))
		next i
	StopDrawing()
	
	; *********************************************
	
	SetWindowCallback(@WindowCallback())
	
	
	
	
	
	
	Repeat
		Event = WaitWindowEvent(2)
		
		If Event = #PB_Event_Gadget
			if EventGadget() = #canvas 
				If EventType() = #PB_EventType_LeftButtonDown or (EventType() = #PB_EventType_MouseMove )
					if GetGadgetAttribute(#canvas, #PB_Canvas_Buttons) and  #WM_LBUTTONDown ;#PB_Canvas_LeftButton
						If StartDrawing(CanvasOutput(#canvas))
							x = GetGadgetAttribute(#canvas, #PB_Canvas_MouseX)
							y = GetGadgetAttribute(#canvas, #PB_Canvas_MouseY)
							Circle(x, y, 10, RGB(Random(255), Random(255), Random(255)))
						StopDrawing()
					Endif
				EndIf
			Endif
		EndIf
	EndIf    
	
Until Event = #PB_Event_CloseWindow
EndIf



Procedure WindowCallback(WindowID,message,wParam,lParam)
; by Dobro

res=#PB_ProcessPureBasicEvents
Select message
	case  #WM_LBUTTONDown
	
	Case #WM_PAINT
	; ******* grosse arnaque a Dobro  ;o) ***************
	
	StartDrawing(WindowOutput(#win))
		
		drawingmode(#PB_2DDrawing_Outlined )
		box(10,10,210,210,rgb(0,255,0))  ; cadre exterieur
		FillArea(15, 15, -1,rgb(0,125,0))
		drawingmode(#PB_2DDrawing_Default )
		; haut
		for i=2 to 204 step 6
			circle(11+i,15,2,rgb(random(255),random(255),random(255)))
		next i
		; bas
		for i=2 to 204 step 6
			circle(11+i,213,2,rgb(random(255),random(255),random(255)))
		next i
		; gauche
		for i=2 to 204 step 6
			circle(15,11+i,2,rgb(random(255),random(255),random(255)))
		next i
		; droite
		for i=2 to 204 step 6
			circle(213,11+i,2,rgb(random(255),random(255),random(255)))
		next i
	StopDrawing()
	
	; *********************************************
	delay(10)
	ProcedureReturn #True
EndSelect
ProcedureReturn res ; important , laissez passer les autres evenements !!!
EndProcedure







; 



; 



; 

; EPB


Re: Gadget Frame3D

Publié : jeu. 31/janv./2013 13:22
par Ar-S
MLD,
Le truc de Dobro c'est que tu dessines une forme sur ton FrameGadget, si tu veux des coins arrondies tu remplaces les box() par des RoundBox().

----edit----
Dobro tu peux nommer ta procédure CreateEpilepticalCanvas() :mrgreen:

Re: Gadget Frame3D

Publié : jeu. 31/janv./2013 15:25
par MLD
Salut Ar-S

J'avais bien compris, il existe sur le Fofo Français ou US d'autres solutions , mais aucune n'est vraiment satisfaisante. Je ne sait pas comment chez MS il ont fait pour le gadget en VB6, mais personne n'a encore trouvé la solution en PB. :? :wink:
Mais parfois j'aime bien taquiner le Dobro. :mrgreen:

Re: Gadget Frame3D

Publié : jeu. 31/janv./2013 15:31
par Ar-S
Mais tu souhaites quoi plus précisément ? un skin pour gadget ? Un skin pour toute ton interface (à ce moment une image collée au fond de ta fenêtre devrait suffire) ? Est-ce pour un gadget précis ? Tu as aussi la SkinLib de LSI qui était vraiment pas mal.