Routine Spectre des couleurs Style Windows

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Routine Spectre des couleurs Style Windows

Message par GallyHC »

Ouep je viens voir le probléme en fait et je cherche mais faudrais que quand on valide le string on met les valeurs et pas tout le temps
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Routine Spectre des couleurs Style Windows

Message par Le Soldat Inconnu »

Il ne faut refaire toujours tout tes calculs.

Soit tu écrit du RGB et tu calcules uniquement le HLS, et tu changes le contenu des gadgets HLS uniquement pour ne pas perdre le focus en cours de frappe
Soit tu écrit du HLS et tu calcules uniquement le RGB, et tu changes le contenu des gadgets RGB uniquement pour ne pas perdre le focus en cours de frappe

Sinon, ça se mord la queue car les erreurs de calculs de la conversion en HLS sont répercutées sur le RGB que l'on est en train d'écrire (sans parler de la perte de focus)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Routine Spectre des couleurs Style Windows

Message par GallyHC »

Bonjour,

Voila j'ai mis a jour le code et merci Le Soldat Inconnu, j'ai suivi tes conseils.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Routine Spectre des couleurs Style Windows

Message par GallyHC »

J'ai aussi mis le code sur mon site si cela interresse quelqu'un :)

http://koakdesign.info/news/?url=4d&val=44

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Routine Spectre des couleurs Style Windows

Message par GallyHC »

Plus bcp de retours :)
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Routine Spectre des couleurs Style Windows

Message par G-Rom »

C'est du bon boulot , ca marche très bien sous Linux. :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Routine Spectre des couleurs Style Windows

Message par Backup »

joli code , Merci :)
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Routine Spectre des couleurs Style Windows

Message par venom »

oui ça fonctionne très bien. Bravo

J'ai pas yeuter le code mais tu la mis en ligne c'est cool merci.







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Routine Spectre des couleurs Style Windows

Message par Ar-S »

testé et approuvé :mrgreen:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Routine Spectre des couleurs Style Windows

Message par Le Soldat Inconnu »

Allez, encore une petite amélioration. Je trouve ça stressant de voir ma valeur forcé à 255 avant que j'ai finis de rentrer ma valeur.
donc si il y a écrit 210 et que je tape 1210, ça reste affiché 1210 mais le programme travail avec 255. Je finis de taper en effaçant le 0 à la fin et j'ai mon 121 qui est pris en compte.
Autre cas, je tape 540, le programme travail avec 255 et quand je quitte la zone de texte, le texte devient 255;

C'est plus sympa pour l'utilisateur

Code : Tout sélectionner

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+
;- INITIALISATION DES DIRECTIVES COMPILEUR.

DisableASM
EnableExplicit

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+
;- DECLARATION DES VARIABLES (GLOBALE).

;{ - ENUMERATION
Enumeration
	#Window_main
EndEnumeration
Enumeration
	#Canvas_0
	#Canvas_1
	#Text_0
	#Text_1
	#Text_2
	#Text_3
	#Text_4
	#Text_5
	#Text_6
	#String_0
	#String_1
	#String_2
	#String_3
	#String_4
	#String_5
EndEnumeration
;} 
;{ - CONSTANTE
#Color_spectre_XY = 255
;} 
;{ - GLOBAL
Global lCH.l = 0
Global lCS.l = 0
Global lCL.l = 127
Global lImage.l
;} 

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure RGBToHLS(lCR.l, lCG.l, lCB.l, *lCH.l, *lCL.l, *lCS.l)
	; ROUTINE DE CONSERTION DU RGB EN HLS.
	Define fCH.f
	Define fCS.f
	Define fCL.f
	Define lMin.l
	Define lMax.l
	Define lDif.l
	Define lSum.l
	Define lNmR.l
	Define lNmG.l
	Define lNmB.l
	
	If lCR < lCG
		If lCR < lCB
			lMin = lCR
		Else
			lMin = lCB
		EndIf
	Else
		If lCG < lCB
			lMin = lCG
		Else
			lMin = lCB
		EndIf
	EndIf
	If lCR > lCG
		If lCR > lCG
			lMax = lCR
		Else
			lMax = lCB
		EndIf
	Else
		If lCG > lCB
			lMax = lCG
		Else
			lMax = lCB
		EndIf
	EndIf
	lDif = lMax - lMin
	lSum = lMax + lMin
	
	fCL = lSum / 510
	If lMax = lMin
		fCH = 0
		fCS = 0
	Else
		lNmR = (lMax - lCR) / lDif
		lNmG = (lMax - lCG) / lDif
		lNmB = (lMax - lCB) / lDif
		If fCL <= 0.5
			fCS = lDif / lSum
		Else
			fCS = lDif / (510 - lSum)
		EndIf
		If lCR = lMax
			fCH = 60 * (6 + lNmB - lNmG)
		EndIf
		If lCG = lMax
			fCH = 60 * (2 + lNmR - lNmB)
		EndIf
		If lCB = lMax
			fCH = 60 * (4 + lNmG - lNmR)
		EndIf
	EndIf
	If fCH = 360
		fCH = 0
	EndIf
	fCH = (fCH / 360 * #Color_spectre_XY)
	fCL = fCL * #Color_spectre_XY
	fCS = fCS * #Color_spectre_XY
	PokeL(*lCH, Int(fCH))
	PokeL(*lCL, Int(fCL))
	PokeL(*lCS, Int(fCS))
	
EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure.l ConvertRM(fM1.f, fM2.f, fCH.f)
	; ROUTINE DE CALCUL DE LA COMPOSENTE DE COULEUR.
	If fCH > 360
		fCH - 360
	EndIf
	If fCH < 0
		fCH + 360
	EndIf
	
	If fCH < 60
		fM1 = fM1 + (fM2 - fM1) * fCH / 60
	Else
		If fCH < 180
			fM1 = fM2
		Else
			If fCH < 240
				fM1 = fM1 + (fM2 - fM1) * (240 - fCH) / 60
			EndIf
		EndIf
	EndIf
	ProcedureReturn fM1 * 255
	
EndProcedure

Procedure HLSToRGB(fCH.f, fCL.f, fCS.f, *lCR.l, *lCG.l, *lCB.l)
	; ROUTINE DE CONSERTION DU HLS EN RGB.
	Define fM1.f
	Define fM2.f
	
	fCH = fCH * 360 / #Color_spectre_XY
	fCL = fCL / #Color_spectre_XY
	fCS = fCS / #Color_spectre_XY
	
	If fCS = 0
		PokeL(*lCR, fCL * 255)
		PokeL(*lCG, fCL * 255)
		PokeL(*lCB, fCL * 255)
	Else
		If fCL <= 0.5
			fM2 = fCL + fCL * fCS
		Else
			fM2 = fCL + fCS - fCL * fCS
		EndIf
		fM1 = 2 * fCL - fM2
		PokeL(*lCR, ConvertRM(fM1, fM2, fCH + 120))
		PokeL(*lCG, ConvertRM(fM1, fM2, fCH))
		PokeL(*lCB, ConvertRM(fM1, fM2, fCH - 120))
	EndIf
	
EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure setDrawCross(lX.l, lY.l)
	; ROUTINE DE TRACAGE DE LA CROIX DU SPECTRE.
	If lX < #Color_spectre_XY
		lX + 1
	EndIf
	If lY < #Color_spectre_XY
		lY + 1
	EndIf
	Box(lX - 1, lY - 9, 3, 5, $000000)
	Box(lX - 1, lY + 5, 3, 5, $000000)
	Box(lX - 9, lY - 1, 5, 3, $000000)
	Box(lX + 5, lY - 1, 5, 3, $000000)
	
EndProcedure

Procedure setGenerateStectre()
	; ROUTINE DE PRECALCUL DU SPECTRE DE COULEUR.
	Define lH.l
	Define lS.l
	Define lCR.l
	Define lCG.l
	Define lCB.l
	
	lImage = CreateImage(#PB_Any, #Color_spectre_XY + 2, #Color_spectre_XY + 2)
	If lImage <> 0
		If StartDrawing(ImageOutput(lImage))
				Box(0, 0, #Color_spectre_XY + 2, #Color_spectre_XY + 2, $000000)
				For lS = 1 To #Color_spectre_XY
					For lH = 1 To #Color_spectre_XY
						HLSToRGB(lH, #Color_spectre_XY / 2, lS, @lCR, @lCG, @lCB)
						Plot(lH,(#Color_spectre_XY - lS) + 1, RGB(lCR, lCG, lCB))
					Next lH
				Next lS
			StopDrawing()
		EndIf
	EndIf
	
EndProcedure

Procedure setDrawSpectre()
	; ROUTINE D'AFFICHAGE DU SPECTRE ET CROIX.
	Define lH.l
	Define lS.l
	Define lCR.l
	Define lCG.l
	Define lCB.l
	
	If StartDrawing(CanvasOutput(#Canvas_0))
			If lImage <> 0
				DrawAlphaImage(ImageID(lImage), 0, 0)
			EndIf
			setDrawCross(lCH, #Color_spectre_XY - lCS)
			HLSToRGB(lCH, lCL, lCS, @lCR, @lCG, @lCB)
			SetGadgetColor(#Text_0, #PB_Gadget_BackColor, RGB(lCR, lCG, lCB))
		StopDrawing()
	EndIf
	
EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure setDrawArrow(lX.l, lY.l)
	; ROUTINE DE TRACAGE DE LA BARRE DE PROGRESSION.
	If lY = > #Color_spectre_XY
		lY = #Color_spectre_XY - 1
	EndIf
	Box(lX, lY, 8, 3, $000000)
	
EndProcedure

Procedure setDrawLum()
	; ROUTINE DE TRACAGE DE LA BARRE LUMIERE.
	Define i.l
	Define lCR.l
	Define lCG.l
	Define lCB.l
	
	If StartDrawing(CanvasOutput(#Canvas_1))
			Box(0, 0, #Color_spectre_XY + 2, #Color_spectre_XY + 2, $FFFFFF)
			Box(0, 0, 20, #Color_spectre_XY + 2, $000000)
			For i = 1 To #Color_spectre_XY
				HLSToRGB(lCH, i, lCS, @lCR, @lCG, @lCB)
				LineXY(1,(#Color_spectre_XY - i) + 1, 18,(#Color_spectre_XY - i) + 1, RGB(lCR, lCG, lCB))
			Next i
			setDrawArrow(22, #Color_spectre_XY - lCL)
			HLSToRGB(lCH, lCL, lCS, @lCR, @lCG, @lCB)
			SetGadgetColor(#Text_0, #PB_Gadget_BackColor, RGB(lCR, lCG, lCB))
		StopDrawing()
	EndIf
	
EndProcedure

Procedure DrawHSLText()
	
	SetGadgetText(#String_0, Str(lCH))
	SetGadgetText(#String_1, Str(lCS))
	SetGadgetText(#String_2, Str(lCL))
	
EndProcedure

Procedure DrawRGBText()
	
	Define lCR.l
	Define lCG.l
	Define lCB.l
	
	HLSToRGB(lCH, lCL, lCS, @lCR, @lCG, @lCB)
	SetGadgetText(#String_3, Str(lCR))
	SetGadgetText(#String_4, Str(lCG))
	SetGadgetText(#String_5, Str(lCB))
	
EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Define event.l
Define evenp.l
Define eveng.l
Define lMosX.l
Define lMosY.l
Define lMosP.l
Define hWnd.l = OpenWindow(#Window_main, 0, 0, #Color_spectre_XY + 60, #Color_spectre_XY + 84, "Spectre des Coucleurs", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

If hWnd <> 0
	SmartWindowRefresh(#Window_main, 1)
	CanvasGadget(#Canvas_0, 5, 5, #Color_spectre_XY + 2, #Color_spectre_XY + 2)
	CanvasGadget(#Canvas_1, 270, 5, 30, #Color_spectre_XY + 2)
	TextGadget(#Text_0, 5, 270, 100, 64, "", #PB_Text_Border)
	TextGadget(#Text_1, 122, 270, 40, 20, "Teinte", #PB_Text_Right)
	TextGadget(#Text_2, 122, 291, 40, 20, "Satur", #PB_Text_Right)
	TextGadget(#Text_3, 122, 312, 40, 20, "Lum", #PB_Text_Right)
	StringGadget(#String_0, 170, 270, 33, 20, "")
	StringGadget(#String_1, 170, 291, 33, 20, "")
	StringGadget(#String_2, 170, 312, 33, 20, "")
	TextGadget(#Text_4, 210, 270, 40, 20, "Rouge", #PB_Text_Right)
	TextGadget(#Text_5, 210, 291, 40, 20, "Vert", #PB_Text_Right)
	TextGadget(#Text_6, 210, 312, 40, 20, "Bleu", #PB_Text_Right)
	StringGadget(#String_3, 258, 270, 33, 20, "")
	StringGadget(#String_4, 258, 291, 33, 20, "")
	StringGadget(#String_5, 258, 312, 33, 20, "")
	
	setGenerateStectre()
	setDrawSpectre()
	setDrawLum()
	DrawHSLText()
	DrawRGBText()
	
	Define Retour_H, Retour_S, Retour_L, Retour_R, Retour_G, Retour_B
	Retour_H = Val(GetGadgetText(#String_0))
	Retour_S = Val(GetGadgetText(#String_1))
	Retour_L = Val(GetGadgetText(#String_2))
	Retour_R = Val(GetGadgetText(#String_3))
	Retour_G = Val(GetGadgetText(#String_4))
	Retour_B = Val(GetGadgetText(#String_5))
	
	Repeat
		event = WaitWindowEvent(20)
		evenp = EventType()
		eveng = EventGadget()
		
		If event = #PB_Event_Gadget
			Select eveng
				Case #Canvas_0
					If evenp = #PB_EventType_LeftButtonDown Or (evenp = #PB_EventType_MouseMove And GetGadgetAttribute(#Canvas_0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
						lMosX.l = GetGadgetAttribute(#Canvas_0, #PB_Canvas_MouseX)
						lMosY.l = GetGadgetAttribute(#Canvas_0, #PB_Canvas_MouseY)
						If lMosX < 0
							lMosX = 0
						Else
							If lMosX > #Color_spectre_XY
								lMosX = #Color_spectre_XY
							EndIf
						EndIf
						If lMosY < 0
							lMosY = 0
						Else
							If lMosY > #Color_spectre_XY
								lMosY = #Color_spectre_XY
							EndIf
						EndIf
						lCH = lMosX
						lCS = #Color_spectre_XY - lMosY
						setDrawSpectre()
						setDrawLum()
						DrawHSLText()
						DrawRGBText()
						Retour_H = Val(GetGadgetText(#String_0))
						Retour_S = Val(GetGadgetText(#String_1))
						Retour_L = Val(GetGadgetText(#String_2))
						Retour_R = Val(GetGadgetText(#String_3))
						Retour_G = Val(GetGadgetText(#String_4))
						Retour_B = Val(GetGadgetText(#String_5))
					EndIf
				Case #Canvas_1
					If evenp = #PB_EventType_LeftButtonDown Or (evenp = #PB_EventType_MouseMove And GetGadgetAttribute(#Canvas_1, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
						lMosY.l = GetGadgetAttribute(#Canvas_1, #PB_Canvas_MouseY)
						If lMosY < 0
							lMosY = 0
						Else
							If lMosY > #Color_spectre_XY
								lMosY = #Color_spectre_XY
							EndIf
						EndIf
						lCL = #Color_spectre_XY - lMosY
						setDrawLum()
						DrawHSLText()
						DrawRGBText()
						Retour_H = Val(GetGadgetText(#String_0))
						Retour_S = Val(GetGadgetText(#String_1))
						Retour_L = Val(GetGadgetText(#String_2))
						Retour_R = Val(GetGadgetText(#String_3))
						Retour_G = Val(GetGadgetText(#String_4))
						Retour_B = Val(GetGadgetText(#String_5))
					EndIf
				Case #String_0
					If evenp = #PB_EventType_Change
						Retour_H = Val(GetGadgetText(#String_0))
						If Retour_H < 0
							Retour_H = 0
						ElseIf Retour_H > 255
							Retour_H = 255
						EndIf
						lCH = Retour_H
						setDrawSpectre()
						setDrawLum()
						DrawRGBText()
					ElseIf evenp = #PB_EventType_LostFocus
						SetGadgetText(#String_0, Str(Retour_H))
					EndIf
				Case #String_1
					If evenp = #PB_EventType_Change
						Retour_S = Val(GetGadgetText(#String_1))
						If Retour_S < 0
							Retour_S = 0
						ElseIf Retour_S > 255
							Retour_S = 255
						EndIf
						lCS = Retour_S
						setDrawSpectre()
						setDrawLum()
						DrawRGBText()
					ElseIf evenp = #PB_EventType_LostFocus
						SetGadgetText(#String_1, Str(Retour_S))
					EndIf
				Case #String_2
					If evenp = #PB_EventType_Change
						Retour_H = Val(GetGadgetText(#String_2))
						If Retour_H < 0
							Retour_H = 0
						EndIf
						If Retour_H > 255
							Retour_H = 255
						EndIf
						lCL = Retour_H
						setDrawSpectre()
						setDrawLum()
						DrawRGBText()
					ElseIf evenp = #PB_EventType_LostFocus
						SetGadgetText(#String_2, Str(Retour_L))
					EndIf
				Case #String_3
					If evenp = #PB_EventType_Change
						Retour_R = Val(GetGadgetText(#String_3))
						If Retour_R < 0
							Retour_R = 0
						ElseIf Retour_R > 255
							Retour_R = 255
						EndIf
						RGBToHLS(Retour_R, Retour_G, Retour_B, @lCH, @lCL, @lCS)
						setDrawSpectre()
						setDrawLum()
						DrawHSLText()
					ElseIf evenp = #PB_EventType_LostFocus
						SetGadgetText(#String_3, Str(Retour_R))
					EndIf
				Case #String_4
					If evenp = #PB_EventType_Change
						Retour_G = Val(GetGadgetText(#String_4))
						If Retour_G < 0
							Retour_G = 0
						ElseIf Retour_G > 255
							Retour_G = 255
						EndIf
						RGBToHLS(Retour_R, Retour_G, Retour_B, @lCH, @lCL, @lCS)
						setDrawSpectre()
						setDrawLum()
						DrawHSLText()
					ElseIf evenp = #PB_EventType_LostFocus
						SetGadgetText(#String_4, Str(Retour_G))
					EndIf
				Case #String_5
					If evenp = #PB_EventType_Change
						Retour_B = Val(GetGadgetText(#String_5))
						If Retour_B < 0
							Retour_B = 0
						ElseIf Retour_B > 255
							Retour_B = 255
						EndIf
						RGBToHLS(Retour_R, Retour_G, Retour_B, @lCH, @lCL, @lCS)
						setDrawSpectre()
						setDrawLum()
						DrawHSLText()
					ElseIf evenp = #PB_EventType_LostFocus
						SetGadgetText(#String_5, Str(Retour_B))
					EndIf
			EndSelect
		EndIf
		
	Until event = #PB_Event_CloseWindow
	FreeImage(lImage)
EndIf
End
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Routine Spectre des couleurs Style Windows

Message par GallyHC »

Bonjour,

Merci a tous :) et merci pour cette modif "Le Soldat Inconnu" approuvé pour ma part :)

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Routine Spectre des couleurs Style Windows

Message par Guimauve »

Bonjour à tous,

Voici ma version de ce système de sélection de couleur. En gros, j'ai viré les variables globales, les énumérations de constantes pour la fenêtre et les gadgets, ajouter des boutons de contrôle (Rafraîchir, Valider, Annuler) et j'ai centralisé les informations importantes dans une structure de donnée.

Édit 1 :

Ajout de constantes pour la désignation des targets
Correction de la commande Refresh

Édit 2 :

Nouvelle correction, j'avais mal implémenté la solution proposée par Le Soldat Inconnu, Maintenant ça fonctionne

Désolé pour ceux qui l'on déjà téléchargé

Édit 3 :

Code supprimé, recherche de bogue en cours.

Édit 4 :

Remise en place du code corrigé:

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; CODE GÉNÉRÉ AUTOMATIQUEMENT, NE PAS MODIFIER À
; MOINS D'AVOIR UNE RAISON TRÈS TRÈS VALABLE !!!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code généré par : Dev-Type V3.131.634
; Nom du projet : Color Spectrum Requester
; Nom du fichier : Color Spectrum Requester.pb
; Version du fichier : 1.0.3
; Programmation : OK
; Programmé par : GallyHC
; Modifié par : Guimauve, Le Soldat Inconnu
; Date : 18-02-2012
; Mise à jour : 18-02-2012
; Codé pour PureBasic V4.60
; Plateforme : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Enumeration
  
  #COLOR_SPECTRUM_TARGET_HUE
  #COLOR_SPECTRUM_TARGET_LIGHTNESS
  #COLOR_SPECTRUM_TARGET_SATURATION
  #COLOR_SPECTRUM_TARGET_RED
  #COLOR_SPECTRUM_TARGET_GREEN
  #COLOR_SPECTRUM_TARGET_BLUE
  
  #COLOR_SPECTRUM_TARGET_WIN_TITLE
  #COLOR_SPECTRUM_TARGET_BTN_REFRESH
  #COLOR_SPECTRUM_TARGET_BTN_VALIDATE
  #COLOR_SPECTRUM_TARGET_BTN_CANCEL
  
EndEnumeration

#COLOR_SPECTRUM_SIZE_MAX = 255

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure <<<<<

Structure ColorSpectrum
  
  HLSRGB.l[6] ; Hue, Lightness, Saturation, Red, Green, Blue
  SafeHLSRGB.l[6] ; SafeHue, SafeLightness, SafeSaturation, SafeRed, SafeGreen, SafeBlue
  BackgroundLayer.l
  SpectrumCanvas.l
  LightnessCanvas.l
  WindowHandle.l
  Text.s[10]
  TextHandle.l[7]
  StringHandle.l[6]
  ButtonHandle.l[3]
  
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs <<<<<

Macro GetColorSpectrumHLSRGB(ColorSpectrumA, HLSRGBID)
  
  ColorSpectrumA\HLSRGB[HLSRGBID]
  
EndMacro

Macro GetColorSpectrumSafeHLSRGB(ColorSpectrumA, SafeHLSRGBID)
  
  ColorSpectrumA\SafeHLSRGB[SafeHLSRGBID]
  
EndMacro

Macro GetColorSpectrumBackgroundLayer(ColorSpectrumA)
  
  ColorSpectrumA\BackgroundLayer
  
EndMacro

Macro GetColorSpectrumSpectrumCanvas(ColorSpectrumA)
  
  ColorSpectrumA\SpectrumCanvas
  
EndMacro

Macro GetColorSpectrumLightnessCanvas(ColorSpectrumA)
  
  ColorSpectrumA\LightnessCanvas
  
EndMacro

Macro GetColorSpectrumWindowHandle(ColorSpectrumA)
  
  ColorSpectrumA\WindowHandle
  
EndMacro

Macro GetColorSpectrumText(ColorSpectrumA, TextID)
  
  ColorSpectrumA\Text[TextID]
  
EndMacro

Macro GetColorSpectrumTextHandle(ColorSpectrumA, TextHandleID)
  
  ColorSpectrumA\TextHandle[TextHandleID]
  
EndMacro

Macro GetColorSpectrumStringHandle(ColorSpectrumA, StringHandleID)
  
  ColorSpectrumA\StringHandle[StringHandleID]
  
EndMacro

Macro GetColorSpectrumButtonHandle(ColorSpectrumA, ButtonHandleID)
  
  ColorSpectrumA\ButtonHandle[ButtonHandleID]
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs <<<<<

Macro SetColorSpectrumHLSRGB(ColorSpectrumA, HLSRGBID, P_HLSRGB)
  
  GetColorSpectrumHLSRGB(ColorSpectrumA, HLSRGBID) = P_HLSRGB
  
EndMacro

Macro SetColorSpectrumSafeHLSRGB(ColorSpectrumA, SafeHLSRGBID, P_SafeHLSRGB)
  
  GetColorSpectrumSafeHLSRGB(ColorSpectrumA, SafeHLSRGBID) = P_SafeHLSRGB
  
EndMacro

Macro SetColorSpectrumBackgroundLayer(ColorSpectrumA, P_BackgroundLayer)
  
  GetColorSpectrumBackgroundLayer(ColorSpectrumA) = P_BackgroundLayer
  
EndMacro

Macro SetColorSpectrumSpectrumCanvas(ColorSpectrumA, P_SpectrumCanvas)
  
  GetColorSpectrumSpectrumCanvas(ColorSpectrumA) = P_SpectrumCanvas
  
EndMacro

Macro SetColorSpectrumLightnessCanvas(ColorSpectrumA, P_LightnessCanvas)
  
  GetColorSpectrumLightnessCanvas(ColorSpectrumA) = P_LightnessCanvas
  
EndMacro

Macro SetColorSpectrumWindowHandle(ColorSpectrumA, P_WindowHandle)
  
  GetColorSpectrumWindowHandle(ColorSpectrumA) = P_WindowHandle
  
EndMacro

Macro SetColorSpectrumText(ColorSpectrumA, TextID, P_Text)
  
  GetColorSpectrumText(ColorSpectrumA, TextID) = P_Text
  
EndMacro

Macro SetColorSpectrumTextHandle(ColorSpectrumA, TextHandleID, P_TextHandle)
  
  GetColorSpectrumTextHandle(ColorSpectrumA, TextHandleID) = P_TextHandle
  
EndMacro

Macro SetColorSpectrumStringHandle(ColorSpectrumA, StringHandleID, P_StringHandle)
  
  GetColorSpectrumStringHandle(ColorSpectrumA, StringHandleID) = P_StringHandle
  
EndMacro

Macro SetColorSpectrumButtonHandle(ColorSpectrumA, ButtonHandleID, P_ButtonHandle)
  
  GetColorSpectrumButtonHandle(ColorSpectrumA, ButtonHandleID) = P_ButtonHandle
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Reset <<<<<

Macro ResetColorSpectrum(ColorSpectrumA)
  
  SetColorSpectrumBackgroundLayer(ColorSpectrumA, 0)
  SetColorSpectrumSpectrumCanvas(ColorSpectrumA, 0)
  SetColorSpectrumLightnessCanvas(ColorSpectrumA, 0)
  SetColorSpectrumWindowHandle(ColorSpectrumA, 0)
  
  For TextID = 0 To 9
    SetColorSpectrumText(ColorSpectrumA, TextID, "")
  Next
  
  For TextHandleID = 0 To 6
    SetColorSpectrumTextHandle(ColorSpectrumA, TextHandleID, 0)
  Next
  
  For StringHandleID = 0 To 5
    SetColorSpectrumStringHandle(ColorSpectrumA, StringHandleID, 0)
    SetColorSpectrumHLSRGB(ColorSpectrumA, StringHandleID, 0)
    SetColorSpectrumSafeHLSRGB(ColorSpectrumA, StringHandleID, 0)
  Next
  
  For ButtonHandleID = 0 To 2
    SetColorSpectrumButtonHandle(ColorSpectrumA, ButtonHandleID, 0)
  Next
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs spéciaux <<<<<

Macro GetColorSpectrumHue(ColorSpectrumA)
  
  GetColorSpectrumHLSRGB(ColorSpectrumA, 0)
  
EndMacro

Macro GetColorSpectrumLightness(ColorSpectrumA)
  
  GetColorSpectrumHLSRGB(ColorSpectrumA, 1)
  
EndMacro

Macro GetColorSpectrumSaturation(ColorSpectrumA)
  
  GetColorSpectrumHLSRGB(ColorSpectrumA, 2)
  
EndMacro

Macro GetColorSpectrumRed(ColorSpectrumA)
  
  GetColorSpectrumHLSRGB(ColorSpectrumA, 3)
  
EndMacro

Macro GetColorSpectrumGreen(ColorSpectrumA)
  
  GetColorSpectrumHLSRGB(ColorSpectrumA, 4)
  
EndMacro

Macro GetColorSpectrumBlue(ColorSpectrumA)
  
  GetColorSpectrumHLSRGB(ColorSpectrumA, 5)
  
EndMacro

Macro GetColorSpectrumSafeHue(ColorSpectrumA)
  
  GetColorSpectrumSafeHLSRGB(ColorSpectrumA, 0)
  
EndMacro

Macro GetColorSpectrumSafeLightness(ColorSpectrumA)
  
  GetColorSpectrumSafeHLSRGB(ColorSpectrumA, 1)
  
EndMacro

Macro GetColorSpectrumSafeSaturation(ColorSpectrumA)
  
  GetColorSpectrumSafeHLSRGB(ColorSpectrumA, 2)
  
EndMacro

Macro GetColorSpectrumSafeRed(ColorSpectrumA)
  
  GetColorSpectrumSafeHLSRGB(ColorSpectrumA, 3)
  
EndMacro

Macro GetColorSpectrumSafeGreen(ColorSpectrumA)
  
  GetColorSpectrumSafeHLSRGB(ColorSpectrumA, 4)
  
EndMacro

Macro GetColorSpectrumSafeBlue(ColorSpectrumA)
  
  GetColorSpectrumSafeHLSRGB(ColorSpectrumA, 5)
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs spéciaux <<<<<

Macro SetColorSpectrumHue(ColorSpectrumA, P_Hue)
  
  GetColorSpectrumHue(ColorSpectrumA) = P_Hue
  
EndMacro

Macro SetColorSpectrumLightness(ColorSpectrumA, P_Lightness)
  
  GetColorSpectrumLightness(ColorSpectrumA) = P_Lightness
  
EndMacro

Macro SetColorSpectrumSaturation(ColorSpectrumA, P_Saturation)
  
  GetColorSpectrumSaturation(ColorSpectrumA) = P_Saturation
  
EndMacro

Macro SetColorSpectrumRed(ColorSpectrumA, P_Red)
  
  GetColorSpectrumRed(ColorSpectrumA) = P_Red
  
EndMacro

Macro SetColorSpectrumGreen(ColorSpectrumA, P_Green)
  
  GetColorSpectrumGreen(ColorSpectrumA) = P_Green
  
EndMacro

Macro SetColorSpectrumBlue(ColorSpectrumA, P_Blue)
  
  GetColorSpectrumBlue(ColorSpectrumA) = P_Blue
  
EndMacro

Macro SetColorSpectrumSafeHue(ColorSpectrumA, P_SafeHue)
  
  GetColorSpectrumSafeHue(ColorSpectrumA) = P_SafeHue
  
EndMacro

Macro SetColorSpectrumSafeLightness(ColorSpectrumA, P_SafeLightness)
  
  GetColorSpectrumSafeLightness(ColorSpectrumA) = P_SafeLightness
  
EndMacro

Macro SetColorSpectrumSafeSaturation(ColorSpectrumA, P_SafeSaturation)
  
  GetColorSpectrumSafeSaturation(ColorSpectrumA) = P_SafeSaturation
  
EndMacro

Macro SetColorSpectrumSafeRed(ColorSpectrumA, P_SafeRed)
  
  GetColorSpectrumSafeRed(ColorSpectrumA) = P_SafeRed
  
EndMacro

Macro SetColorSpectrumSafeGreen(ColorSpectrumA, P_SafeGreen)
  
  GetColorSpectrumSafeGreen(ColorSpectrumA) = P_SafeGreen
  
EndMacro

Macro SetColorSpectrumSafeBlue(ColorSpectrumA, P_SafeBlue)
  
  GetColorSpectrumSafeBlue(ColorSpectrumA) = P_SafeBlue
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 00.014 secondes (26000.00 lignes/seconde) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Macro FormatColorSpectrumRGB(ColorSpectrumA)
  
  "RGB(" + Str(GetColorSpectrumRed(ColorSpectrumA)) + ", "  + Str(GetColorSpectrumGreen(ColorSpectrumA)) + ", " + Str(GetColorSpectrumBlue(ColorSpectrumA)) + ")"
  
EndMacro

Macro FormatColorSpectrumHLS(ColorSpectrumA)
  
  "HLS(" + Str(GetColorSpectrumHue(ColorSpectrumA)) + ", "  + Str(GetColorSpectrumLightness(ColorSpectrumA)) + ", " + Str(GetColorSpectrumSaturation(ColorSpectrumA)) + ")"
  
EndMacro

Macro ColorSpectrum_RGB(ColorSpectrumA)
  
  (GetColorSpectrumBlue(ColorSpectrumA) << 16 + GetColorSpectrumGreen(ColorSpectrumA) << 8 + GetColorSpectrumRed(ColorSpectrumA))
  
EndMacro

Macro MinMaxNumber(P_Min, P_Max, P_Number01, P_Number02, P_Number03)
  
  P_Min = P_Number01
  
  If P_Number02 < P_Min
    P_Min = P_Number02
  EndIf
  
  If P_Number03 < P_Min
    P_Min = P_Number03
  EndIf
  
  P_Max = P_Number01
  
  If P_Number02 > P_Max
    P_Max = P_Number02
  EndIf
  
  If P_Number03 > P_Max
    P_Max = P_Number03
  EndIf
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Initialize <<<<<

Procedure InitializeColorSpectrum(*ColorSpectrumA.ColorSpectrum)
  
  SetColorSpectrumLightness(*ColorSpectrumA, 127)
  
  SetColorSpectrumText(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_HUE, "Teinte")
  SetColorSpectrumText(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_LIGHTNESS, "Luminosité")
  SetColorSpectrumText(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_SATURATION, "Saturation")
  SetColorSpectrumText(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_RED, "Rouge")
  SetColorSpectrumText(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_GREEN, "Vert")
  SetColorSpectrumText(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_BLUE, "Bleu")
  
  SetColorSpectrumText(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_WIN_TITLE, "Spectre de couleurs")
  
  SetColorSpectrumText(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_BTN_REFRESH, "Rafraichir")
  SetColorSpectrumText(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_BTN_VALIDATE, "Valider")
  SetColorSpectrumText(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_BTN_CANCEL, "Annuler")
  
EndProcedure

Procedure.l Private_ConvertRM(M1.f, M2.f, HueColor.f)
  
  ; ROUTINE DE CALCUL DE LA COMPOSANTE DE COULEUR.
  
  If HueColor > 360
    HueColor - 360
  EndIf
  
  If HueColor < 0
    HueColor + 360
  EndIf
  
  If HueColor < 60
    M1 = M1 + (M2 - M1) * HueColor / 60
  Else
    
    If HueColor < 180
      M1 = M2
    Else
      
      If HueColor < 240
        M1 = M1 + (M2 - M1) * (240 - HueColor) / 60
      EndIf
      
    EndIf
    
  EndIf
  
  ProcedureReturn M1 * 255
EndProcedure

Procedure ColorSpectrum_RGB_To_HLS(*ColorSpectrumA.ColorSpectrum)
  
  ; ROUTINE DE CONSERTION DU RGB EN HLS.
  
  MinMaxNumber(Min.l, Max.l, GetColorSpectrumRed(*ColorSpectrumA), GetColorSpectrumGreen(*ColorSpectrumA), GetColorSpectrumBlue(*ColorSpectrumA))
  
  DeltaMaxMin.l = Max - Min
  SumMaxMin.l = Max + Min
  
  LightnessColor.f = SumMaxMin / 510
  
  If Max = Min
    
    HueColor.f = 0
    SaturationColor.f = 0
    
  Else
    
    NormalizedRed = (Max - GetColorSpectrumRed(*ColorSpectrumA)) / DeltaMaxMin
    NormalizedGreen = (Max - GetColorSpectrumGreen(*ColorSpectrumA)) / DeltaMaxMin
    NormalizedBlue = (Max - GetColorSpectrumBlue(*ColorSpectrumA)) / DeltaMaxMin
    
    If LightnessColor <= 0.5
      SaturationColor = DeltaMaxMin / SumMaxMin
    Else
      SaturationColor = DeltaMaxMin / (510 - SumMaxMin)
    EndIf
    
    If GetColorSpectrumRed(*ColorSpectrumA) = Max 
      HueColor = 60 * (6 + NormalizedBlue - NormalizedGreen)
    EndIf
    
    If GetColorSpectrumGreen(*ColorSpectrumA) = Max 
      HueColor = 60 * (2 + NormalizedRed - NormalizedBlue)
    EndIf
    
    If GetColorSpectrumBlue(*ColorSpectrumA) = Max 
      HueColor = 60 * (4 + NormalizedGreen - NormalizedRed)
    EndIf
    
  EndIf
  
  If HueColor = 360 
    HueColor = 0
  EndIf
  
  SetColorSpectrumHue(*ColorSpectrumA, Int((HueColor / 360 * #COLOR_SPECTRUM_SIZE_MAX)))
  SetColorSpectrumLightness(*ColorSpectrumA, Int(LightnessColor * #COLOR_SPECTRUM_SIZE_MAX))
  SetColorSpectrumSaturation(*ColorSpectrumA, Int(SaturationColor * #COLOR_SPECTRUM_SIZE_MAX))
  
EndProcedure

Procedure ColorSpectrum_HLS_To_RGB(HueColor.f, LightnessColor.f, SaturationColor.f, *ColorSpectrumA.ColorSpectrum)
  
  ; ROUTINE DE CONSERTION DU HLS EN RGB.
  
  HueColor = HueColor * 360 / #COLOR_SPECTRUM_SIZE_MAX
  LightnessColor = LightnessColor / #COLOR_SPECTRUM_SIZE_MAX
  SaturationColor = SaturationColor / #COLOR_SPECTRUM_SIZE_MAX
  
  If SaturationColor = 0.0
    
    SetColorSpectrumRed(*ColorSpectrumA, LightnessColor * #COLOR_SPECTRUM_SIZE_MAX)
    SetColorSpectrumGreen(*ColorSpectrumA, LightnessColor * #COLOR_SPECTRUM_SIZE_MAX)
    SetColorSpectrumBlue(*ColorSpectrumA, LightnessColor * #COLOR_SPECTRUM_SIZE_MAX)
    
  Else
    If LightnessColor <= 0.5
      M2.f = LightnessColor + LightnessColor * SaturationColor
    Else
      M2 = LightnessColor + SaturationColor - LightnessColor * SaturationColor
    EndIf
    
    M1.f = 2 * LightnessColor - M2
    
    SetColorSpectrumRed(*ColorSpectrumA, Private_ConvertRm(M1, M2, HueColor + 120))
    SetColorSpectrumGreen(*ColorSpectrumA, Private_ConvertRm(M1, M2, HueColor))
    SetColorSpectrumBlue(*ColorSpectrumA, Private_ConvertRm(M1, M2, HueColor - 120))
    
  EndIf 
  
EndProcedure

Procedure GenerateColorSpectrumBackgroundLayer(*ColorSpectrumA.ColorSpectrum)
  
  ; ROUTINE DE PRECALCUL DU SPECTRE DE COULEUR.
  
  SetColorSpectrumBackgroundLayer(*ColorSpectrumA, CreateImage(#PB_Any, #COLOR_SPECTRUM_SIZE_MAX + 2, #COLOR_SPECTRUM_SIZE_MAX + 2))
  
  If GetColorSpectrumBackgroundLayer(*ColorSpectrumA) <> #Null
    
    If StartDrawing(ImageOutput(GetColorSpectrumBackgroundLayer(*ColorSpectrumA)))
      
      Box(0, 0, #COLOR_SPECTRUM_SIZE_MAX + 2, #COLOR_SPECTRUM_SIZE_MAX + 2, $000000)
      
      For SaturationID = 1 To #COLOR_SPECTRUM_SIZE_MAX
        
        For HueID = 1 To #COLOR_SPECTRUM_SIZE_MAX
          
          ColorSpectrum_HLS_To_RGB(HueID, #COLOR_SPECTRUM_SIZE_MAX / 2, SaturationID, *ColorSpectrumA)
          
          Plot(HueID, (#COLOR_SPECTRUM_SIZE_MAX - SaturationID) + 1, ColorSpectrum_RGB(*ColorSpectrumA))
          
        Next
        
      Next
      
      StopDrawing()
      
    EndIf
    
  EndIf
  
EndProcedure

Procedure ColorSpectrum_DrawCross(*ColorSpectrumA.ColorSpectrum)
  
  ; ROUTINE DE TRACAGE DE LA CROIX DU SPECTRE.
  
  PosX = GetColorSpectrumHue(*ColorSpectrumA)
  PosY = #COLOR_SPECTRUM_SIZE_MAX - GetColorSpectrumSaturation(*ColorSpectrumA)
  
  If PosX < #COLOR_SPECTRUM_SIZE_MAX
    PosX + 1
  EndIf
  
  If PosY < #COLOR_SPECTRUM_SIZE_MAX
    PosY + 1
  EndIf
  
  Box(PosX - 1, PosY - 9, 3, 5, 0)
  Box(PosX - 1, PosY + 5, 3, 5, 0)
  Box(PosX - 9, PosY - 1, 5, 3, 0)
  Box(PosX + 5, PosY - 1, 5, 3, 0)
  
EndProcedure

Procedure ColorSpectrum_DrawArrow(*ColorSpectrumA.ColorSpectrum)
  
  ; ROUTINE DE TRACAGE DE LA BARRE DE LIGHTNESS
  
  PosY = #COLOR_SPECTRUM_SIZE_MAX - GetColorSpectrumLightness(*ColorSpectrumA)
  
  If PosY => #COLOR_SPECTRUM_SIZE_MAX
    PosY = #COLOR_SPECTRUM_SIZE_MAX - 1
  EndIf
  
  Box(22, PosY, 8, 3, 0)
  
EndProcedure

Procedure ColorSpectrum_SpectrumRedraw(*ColorSpectrumA.ColorSpectrum)
  
  ; ROUTINE D'AFFICHAGE DU SPECTRE ET CROIX.
  
  If StartDrawing(CanvasOutput(GetColorSpectrumSpectrumCanvas(*ColorSpectrumA)))
    
    If GetColorSpectrumBackgroundLayer(*ColorSpectrumA) <> #Null
      DrawImage(ImageID(GetColorSpectrumBackgroundLayer(*ColorSpectrumA)), 0, 0)
    EndIf
    
    
    ColorSpectrum_DrawCross(*ColorSpectrumA)
    ColorSpectrum_HLS_To_RGB(GetColorSpectrumHue(*ColorSpectrumA), GetColorSpectrumLightness(*ColorSpectrumA),GetColorSpectrumSaturation(*ColorSpectrumA), *ColorSpectrumA)
    
    StopDrawing()
    
    SetGadgetColor(GetColorSpectrumTextHandle(*ColorSpectrumA, 06), #PB_Gadget_BackColor, ColorSpectrum_RGB(*ColorSpectrumA))
    
  EndIf
  
EndProcedure

Procedure ColorSpectrum_LightnessRedraw(*ColorSpectrumA.ColorSpectrum)
  
  ; ROUTINE DE TRACAGE DE LA BARRE LUMIERE.
  
  If StartDrawing(CanvasOutput(GetColorSpectrumLightnessCanvas(*ColorSpectrumA)))
    
    CurrentLightness = GetColorSpectrumLightness(*ColorSpectrumA)
    
    Box(0, 0, #COLOR_SPECTRUM_SIZE_MAX + 2, #COLOR_SPECTRUM_SIZE_MAX + 2, $FFFFFF)
    Box(0, 0, 20, #COLOR_SPECTRUM_SIZE_MAX + 2, $000000)
    
    For LightnessID = 1 To #COLOR_SPECTRUM_SIZE_MAX
      
      ColorSpectrum_HLS_To_RGB(GetColorSpectrumHue(*ColorSpectrumA), LightnessID, GetColorSpectrumSaturation(*ColorSpectrumA), *ColorSpectrumA)
      LineXY(1, (#COLOR_SPECTRUM_SIZE_MAX - LightnessID) + 1, 18, (#COLOR_SPECTRUM_SIZE_MAX - LightnessID) + 1, ColorSpectrum_RGB(*ColorSpectrumA))
      
    Next
    
    SetColorSpectrumLightness(*ColorSpectrumA, CurrentLightness)
    
    ColorSpectrum_DrawArrow(*ColorSpectrumA.ColorSpectrum)
    
    ColorSpectrum_HLS_To_RGB(GetColorSpectrumHue(*ColorSpectrumA), GetColorSpectrumLightness(*ColorSpectrumA), GetColorSpectrumSaturation(*ColorSpectrumA), *ColorSpectrumA)
    SetGadgetColor(GetColorSpectrumTextHandle(*ColorSpectrumA, 06), #PB_Gadget_BackColor, ColorSpectrum_RGB(*ColorSpectrumA))
    
    StopDrawing()
    
  EndIf
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Free Gadgets <<<<<

Procedure FreeColorSpectrumGadget(*ColorSpectrumA.ColorSpectrum)
  
  SetColorSpectrumHue(*ColorSpectrumA, 0)
  SetColorSpectrumSaturation(*ColorSpectrumA, 0)
  SetColorSpectrumLightness(*ColorSpectrumA, 127)
  SetColorSpectrumRed(*ColorSpectrumA, 0)
  SetColorSpectrumGreen(*ColorSpectrumA, 0)
  SetColorSpectrumBlue(*ColorSpectrumA, 0)
  
  For Index = 0 To 2
    FreeGadget(GetColorSpectrumTextHandle(*ColorSpectrumA, Index))
    FreeGadget(GetColorSpectrumTextHandle(*ColorSpectrumA, Index+3))
    FreeGadget(GetColorSpectrumStringHandle(*ColorSpectrumA, Index))
    FreeGadget(GetColorSpectrumStringHandle(*ColorSpectrumA, Index+3))    
    FreeGadget(GetColorSpectrumButtonHandle(*ColorSpectrumA, Index))
  Next
  
  FreeGadget(GetColorSpectrumSpectrumCanvas(*ColorSpectrumA))
  FreeGadget(GetColorSpectrumLightnessCanvas(*ColorSpectrumA))
  FreeImage(GetColorSpectrumBackgroundLayer(*ColorSpectrumA))
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur RefeshHLSColorOutput <<<<<

Procedure RefreshHLSColorOutput(*ColorSpectrumA.ColorSpectrum)
  
  For Index = 0 To 2
    SetGadgetText(GetColorSpectrumStringHandle(*ColorSpectrumA, Index), Str(GetColorSpectrumHLSRGB(*ColorSpectrumA, Index)))
  Next
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur RefeshRGBColorOutput <<<<<

Procedure RefreshRGBColorOutput(*ColorSpectrumA.ColorSpectrum)
  
  ColorSpectrum_HLS_To_RGB(GetColorSpectrumHue(*ColorSpectrumA), GetColorSpectrumLightness(*ColorSpectrumA), GetColorSpectrumSaturation(*ColorSpectrumA), *ColorSpectrumA)
  
  For Index = 3 To 5
    SetGadgetText(GetColorSpectrumStringHandle(*ColorSpectrumA, Index), Str(GetColorSpectrumHLSRGB(*ColorSpectrumA, Index)))
  Next
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur CatchRGBColorInput <<<<<

Procedure CatchRGBColorInput(*ColorSpectrumA.ColorSpectrum)
  
  For Index = 3 To 5
    SetColorSpectrumHLSRGB(*ColorSpectrumA, Index, Val(GetGadgetText(GetColorSpectrumStringHandle(*ColorSpectrumA, Index))))
  Next
  
  ColorSpectrum_RGB_To_HLS(*ColorSpectrumA)
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur CatchSafeHLSRGB <<<<<

Procedure CatchSafeHLSRGB(*ColorSpectrumA.ColorSpectrum)
  
  For SafeHLSRGBID = 0 To 5
    SetColorSpectrumSafeHLSRGB(*ColorSpectrumA, SafeHLSRGBID, Val(GetGadgetText(GetColorSpectrumStringHandle(*ColorSpectrumA, SafeHLSRGBID))))
  Next
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur RefeshSpectrum <<<<<

Procedure RefeshColorSpectrum(*ColorSpectrumA.ColorSpectrum)
  
  SetColorSpectrumHue(*ColorSpectrumA, 0)
  SetColorSpectrumSaturation(*ColorSpectrumA, 0)
  SetColorSpectrumLightness(*ColorSpectrumA, 127)
  SetColorSpectrumRed(*ColorSpectrumA, 0)
  SetColorSpectrumGreen(*ColorSpectrumA, 0)
  SetColorSpectrumBlue(*ColorSpectrumA, 0)
  
  ColorSpectrum_SpectrumRedraw(*ColorSpectrumA)
  ColorSpectrum_LightnessRedraw(*ColorSpectrumA)
  RefreshHLSColorOutput(*ColorSpectrumA)
  RefreshRGBColorOutput(*ColorSpectrumA)
  CatchSafeHLSRGB(*ColorSpectrumA)
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur ColorSpectrum_SpectrumCanvas_EventManager <<<<<

Procedure ColorSpectrum_SpectrumCanvas_EventManager(*ColorSpectrumA.ColorSpectrum)
  
  EventType = EventType()
  
  If evenp = #PB_EventType_LeftButtonDown Or ( EventType = #PB_EventType_MouseMove And GetGadgetAttribute(GetColorSpectrumSpectrumCanvas(*ColorSpectrumA), #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
    
    MouseX.l = GetGadgetAttribute(GetColorSpectrumSpectrumCanvas(*ColorSpectrumA), #PB_Canvas_MouseX)
    MouseY.l = GetGadgetAttribute(GetColorSpectrumSpectrumCanvas(*ColorSpectrumA), #PB_Canvas_MouseY)
    
    If MouseX < 0
      MouseX = 0
    Else
      If MouseX > #COLOR_SPECTRUM_SIZE_MAX
        MouseX = #COLOR_SPECTRUM_SIZE_MAX
      EndIf
      
    EndIf
    
    If MouseY < 0
      MouseY = 0
    Else
      If MouseY > #COLOR_SPECTRUM_SIZE_MAX
        MouseY = #COLOR_SPECTRUM_SIZE_MAX 
      EndIf
    EndIf
    
    SetColorSpectrumHue(*ColorSpectrumA, MouseX)
    SetColorSpectrumSaturation(*ColorSpectrumA, #COLOR_SPECTRUM_SIZE_MAX - MouseY)
    
    ColorSpectrum_SpectrumRedraw(*ColorSpectrumA)
    ColorSpectrum_LightnessRedraw(*ColorSpectrumA)
    
    RefreshHLSColorOutput(*ColorSpectrumA)
    RefreshRGBColorOutput(*ColorSpectrumA)
    
    CatchSafeHLSRGB(*ColorSpectrumA)
    
  EndIf
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur ColorSpectrum_LightnessCanvas_EventManager <<<<<

Procedure ColorSpectrum_LightnessCanvas_EventManager(*ColorSpectrumA.ColorSpectrum)
  
  EventType = EventType()
  
  If EventType = #PB_EventType_LeftButtonDown Or (EventType = #PB_EventType_MouseMove And GetGadgetAttribute(GetColorSpectrumLightnessCanvas(*ColorSpectrumA), #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
    
    MouseY.l = GetGadgetAttribute(GetColorSpectrumLightnessCanvas(*ColorSpectrumA), #PB_Canvas_MouseY)
    
    If MouseY < 0
      MouseY = 0
    Else
      
      If MouseY > #COLOR_SPECTRUM_SIZE_MAX
        MouseY = #COLOR_SPECTRUM_SIZE_MAX 
      EndIf
      
    EndIf
    
    SetColorSpectrumLightness(*ColorSpectrumA, #COLOR_SPECTRUM_SIZE_MAX - MouseY)
    
    ColorSpectrum_LightnessRedraw(*ColorSpectrumA)
    
    RefreshHLSColorOutput(*ColorSpectrumA)
    RefreshRGBColorOutput(*ColorSpectrumA)
    
    CatchSafeHLSRGB(*ColorSpectrumA)
    
  EndIf
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Hue Input Control <<<<<

Procedure ColorSpectrum_Input_Control(*ColorSpectrumA.ColorSpectrum, Target.b)
  
  EventType = EventType()
  
  If EventType = #PB_EventType_Change 
    
    SetColorSpectrumSafeHLSRGB(*ColorSpectrumA, Target, Val(GetGadgetText(GetColorSpectrumStringHandle(*ColorSpectrumA, Target))))
    
    If GetColorSpectrumSafeHLSRGB(*ColorSpectrumA, Target) < 0
      SetColorSpectrumSafeHLSRGB(*ColorSpectrumA, Target, 0)
    EndIf
    
    If GetColorSpectrumSafeHLSRGB(*ColorSpectrumA, Target) > 255
      SetColorSpectrumSafeHLSRGB(*ColorSpectrumA, Target, 255)
    EndIf

    Select Target
        
      Case #COLOR_SPECTRUM_TARGET_HUE, #COLOR_SPECTRUM_TARGET_LIGHTNESS, #COLOR_SPECTRUM_TARGET_SATURATION
        SetColorSpectrumHLSRGB(*ColorSpectrumA, Target, GetColorSpectrumSafeHLSRGB(*ColorSpectrumA, Target))

      Case #COLOR_SPECTRUM_TARGET_RED, #COLOR_SPECTRUM_TARGET_GREEN, #COLOR_SPECTRUM_TARGET_BLUE
        SetColorSpectrumHLSRGB(*ColorSpectrumA, Target, GetColorSpectrumSafeHLSRGB(*ColorSpectrumA, Target))
        ColorSpectrum_RGB_To_HLS(*ColorSpectrumA)
   
    EndSelect
    
    ColorSpectrum_SpectrumRedraw(*ColorSpectrumA)
    ColorSpectrum_LightnessRedraw(*ColorSpectrumA)
    RefreshHLSColorOutput(*ColorSpectrumA)
    
  ElseIf EventType = #PB_EventType_LostFocus 
    
    SetGadgetText(GetColorSpectrumStringHandle(*ColorSpectrumA, Target), Str(GetColorSpectrumSafeHLSRGB(*ColorSpectrumA, Target)))
    
  EndIf

EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur ColorSpectrumRequester <<<<<

Procedure.l ColorSpectrumRequester(*ColorSpectrumA.ColorSpectrum)
  
  SetColorSpectrumWindowHandle(*ColorSpectrumA, OpenWindow(#PB_Any, 0, 0, #COLOR_SPECTRUM_SIZE_MAX + 55, #COLOR_SPECTRUM_SIZE_MAX + 140, GetColorSpectrumText(*ColorSpectrumA, 06), #PB_Window_SystemMenu | #PB_Window_ScreenCentered))
  
  If GetColorSpectrumWindowHandle(*ColorSpectrumA) <> #Null
    
    SetColorSpectrumSpectrumCanvas(*ColorSpectrumA, CanvasGadget(#PB_Any, 5, 5, #COLOR_SPECTRUM_SIZE_MAX + 2, #COLOR_SPECTRUM_SIZE_MAX + 2))
    SetColorSpectrumLightnessCanvas(*ColorSpectrumA, CanvasGadget(#PB_Any, 270, 5, 30, #COLOR_SPECTRUM_SIZE_MAX + 2))
    
    SetColorSpectrumTextHandle(*ColorSpectrumA, 6, TextGadget(#PB_Any, 5, 270, 80, 84,  "", #PB_Text_Border))
    
    PosX = 10
    PosY = 270
    
    For Index = 0 To 2
      
      SetColorSpectrumTextHandle(*ColorSpectrumA, Index, TextGadget(#PB_Any, 102, PosY, 70, 25,  GetColorSpectrumText(*ColorSpectrumA, Index), #PB_Text_Right))
      SetColorSpectrumStringHandle(*ColorSpectrumA, Index, StringGadget(#PB_Any, 180, PosY, 33, 25, ""))
      
      SetColorSpectrumTextHandle(*ColorSpectrumA, Index + 3, TextGadget(#PB_Any, 220, PosY, 40, 25, GetColorSpectrumText(*ColorSpectrumA, Index + 3), #PB_Text_Right))
      SetColorSpectrumStringHandle(*ColorSpectrumA, Index + 3, StringGadget(#PB_Any, 270, PosY, 33, 25, ""))
      
      SetColorSpectrumButtonHandle(*ColorSpectrumA, Index, ButtonGadget(#PB_Any, PosX, 360, 95, 30, GetColorSpectrumText(*ColorSpectrumA, Index + 7)))
      
      PosX + 100
      PosY + 30
      
    Next
    
    GenerateColorSpectrumBackgroundLayer(*ColorSpectrumA)
    ColorSpectrum_SpectrumRedraw(*ColorSpectrumA)
    ColorSpectrum_LightnessRedraw(*ColorSpectrumA)
    RefreshHLSColorOutput(*ColorSpectrumA)
    RefreshRGBColorOutput(*ColorSpectrumA)
    CatchSafeHLSRGB(*ColorSpectrumA)
    
    Repeat
      
      EventID = WaitWindowEvent(20)
      
      Select EventID
          
        Case #PB_Event_Gadget
          
          Select EventGadget()
              
            Case GetColorSpectrumSpectrumCanvas(*ColorSpectrumA)
              ColorSpectrum_SpectrumCanvas_EventManager(*ColorSpectrumA)
              
            Case GetColorSpectrumLightnessCanvas(*ColorSpectrumA)
              ColorSpectrum_LightnessCanvas_EventManager(*ColorSpectrumA)
              
            Case GetColorSpectrumStringHandle(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_HUE)
              ColorSpectrum_Input_Control(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_HUE)
              
            Case GetColorSpectrumStringHandle(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_LIGHTNESS)
              ColorSpectrum_Input_Control(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_LIGHTNESS)
              
            Case GetColorSpectrumStringHandle(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_SATURATION)
              ColorSpectrum_Input_Control(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_SATURATION)
              
            Case GetColorSpectrumStringHandle(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_RED)
              ColorSpectrum_Input_Control(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_RED)
              
            Case GetColorSpectrumStringHandle(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_GREEN)
              ColorSpectrum_Input_Control(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_GREEN)
              
            Case GetColorSpectrumStringHandle(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_BLUE)
              ColorSpectrum_Input_Control(*ColorSpectrumA, #COLOR_SPECTRUM_TARGET_BLUE)
              
            Case GetColorSpectrumButtonHandle(*ColorSpectrumA, 0)
              RefeshColorSpectrum(*ColorSpectrumA)
              
            Case GetColorSpectrumButtonHandle(*ColorSpectrumA, 1)
              ReturnSelectedColor = ColorSpectrum_RGB(*ColorSpectrumA)
              EventID = #PB_Event_CloseWindow
              
            Case GetColorSpectrumButtonHandle(*ColorSpectrumA, 2)
              ReturnSelectedColor = -1
              EventID = #PB_Event_CloseWindow
              
          EndSelect
          
      EndSelect
      
    Until EventID = #PB_Event_CloseWindow
    
    FreeColorSpectrumGadget(*ColorSpectrumA)
    CloseWindow(GetColorSpectrumWindowHandle(*ColorSpectrumA))
    
  EndIf
  
  ProcedureReturn ReturnSelectedColor
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
; <<<<< !!! WARNING - YOU ARE NOW IN A TESTING ZONE - WARNING !!! <<<<< 
; <<<<< !!! WARNING - THIS CODE SHOULD BE COMMENTED - WARNING !!! <<<<< 
; <<<<< !!! WARNING - BEFORE THE FINAL COMPILATION. - WARNING !!! <<<<< 
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 

InitializeColorSpectrum(ColorSpectrum.ColorSpectrum)

Color.l = ColorSpectrumRequester(ColorSpectrum)

If Color <> -1
  Debug "RGB(" + Str(Red(Color)) + ", " + Str(Green(Color)) + ", " + Str(Blue(Color)) + ")"
Else
  Debug "Lutilisateur à annuler la sélection de la couleur"
EndIf

ResetColorSpectrum(ColorSpectrum)

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
Dernière modification par Guimauve le sam. 18/févr./2012 20:39, modifié 5 fois.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Routine Spectre des couleurs Style Windows

Message par Le Soldat Inconnu »

@Guimauve : il ne manque que le passage de couleur en paramètre, et ma modif :mrgreen:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Routine Spectre des couleurs Style Windows

Message par Guimauve »

Le Soldat Inconnu a écrit :@Guimauve : il ne manque que le passage de couleur en paramètre, et ma modif :mrgreen:
Tu veux dire une couleur par défaut comme dans le cas du ColorRequester() ou les valeurs pour les paramètres HLS et RGB ?

En passant, j'ai mis le code source plus haut à jour quelques fois aujourd'hui, désolé pour les nombreuses modifications.

A+
Guimauve
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Routine Spectre des couleurs Style Windows

Message par Le Soldat Inconnu »

Oui, la couleur de départ :)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre