Voici un petit code pour avoir le spectre des couleurs dans le style à MSPaint de windows. Code sans aucune prétention encore une fois lollll.
Une petite capture :

Et le code :
Code : Tout sélectionner
; +======================================================+
; | ROUTINE DE SELECTION DE COULEUR STYLE MSPAINT. |
; +------------------------------------------------------+
; | COPYRIGHT(C)2007-2012, ALL RIGHT RESERVED KOAKDESIGN |
; +--------------+---------------------------------------+
; | Program type | PUREBASIC 4.60 |
; +--------------+---------------------------------------+
; | VER & REV | 0.0.1 |
; +--------------+---------------------------------------+
; | Program name | main.pb |
; +======================================================+
; +======================================================+
; | Original Version: 0.0.1 RC0 |
; +--------------+---------------------------------------+
; | Created by | GallyHomeCorp |
; | Graphix by | GallyHomeCorp |
; +--------------+---------------------------------------+
; | Comments: | |
; +--------------+ |
; | |
; | |
; | |
; +======================================================+
; +======================================================+
; | Système d'Exploitation |
; +--------------+---------------------------------------+
; | Window | Oui |
; | Linux | Oui |
; | MacOS | Oui |
; +======================================================+
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
;- 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
#Text_7
#String_0
#String_1
#String_2
#String_3
#String_4
#String_5
#String_6
EndEnumeration
;}
;{ - CONSTANTE
#COLOR_SPECTRUM_SIZE_MAX = 255
;}
;{ - GLOBAL
Global lCH.l = 0
Global lCS.l = 0
Global lCL.l = 127
Global lImage.l
;}
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
Procedure GetWindowBackgroundColor()
; DONNE LA COULEUR DE FOND DU SYSTEME.
Define BackgroundColor.l
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
BackgroundColor = GetSysColor_(#COLOR_3DFACE)
CompilerCase #PB_OS_Linux
BackgroundColor = RGB(237,235,236)
CompilerCase #PB_OS_MacOS
BackgroundColor = RGB(237,235,236)
CompilerEndSelect
ProcedureReturn BackgroundColor
EndProcedure
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
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_SPECTRUM_SIZE_MAX)
fCL = fCL * #COLOR_SPECTRUM_SIZE_MAX
fCS = fCS * #COLOR_SPECTRUM_SIZE_MAX
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_SPECTRUM_SIZE_MAX
fCL = fCL / #COLOR_SPECTRUM_SIZE_MAX
fCS = fCS / #COLOR_SPECTRUM_SIZE_MAX
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_SPECTRUM_SIZE_MAX
lX + 1
EndIf
If lY < #COLOR_SPECTRUM_SIZE_MAX
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_SPECTRUM_SIZE_MAX + 2, #COLOR_SPECTRUM_SIZE_MAX + 2)
If lImage <> 0
If StartDrawing(ImageOutput(lImage))
Box(0, 0, #COLOR_SPECTRUM_SIZE_MAX + 2, #COLOR_SPECTRUM_SIZE_MAX + 2, $000000)
For lS = 1 To #COLOR_SPECTRUM_SIZE_MAX
For lH = 1 To #COLOR_SPECTRUM_SIZE_MAX
HLSToRGB(lH, #COLOR_SPECTRUM_SIZE_MAX / 2, lS, @lCR, @lCG, @lCB)
Plot(lH, ( #COLOR_SPECTRUM_SIZE_MAX - 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_SPECTRUM_SIZE_MAX - 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.
Define x1.l
Define y1.l
Define x2.l
Define y2.l
Define xm.l
If lY =< 5
lY = 5
EndIf
If lY => #COLOR_SPECTRUM_SIZE_MAX - 5
lY = #COLOR_SPECTRUM_SIZE_MAX - 5
EndIf
;Box(lX, lY, 8, 3, $000000)
Line(lX, lY, 5, -5, $000000)
Line(lX, lY, 5, 5 , $000000)
LineXY(lX + 5, lY - 5, lX + 5, lY + 5 , $000000)
FillArea(lX + 2, lY, 0, 0)
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_SPECTRUM_SIZE_MAX + 2, #COLOR_SPECTRUM_SIZE_MAX + 2, GetWindowBackgroundColor())
Box(0, 0, 20, #COLOR_SPECTRUM_SIZE_MAX + 2, $000000)
For i = 1 To #COLOR_SPECTRUM_SIZE_MAX
HLSToRGB(lCH, i, lCS, @lCR, @lCG, @lCB)
LineXY(1,( #COLOR_SPECTRUM_SIZE_MAX - i) + 1, 18,( #COLOR_SPECTRUM_SIZE_MAX - i) + 1, RGB(lCR, lCG, lCB))
Next i
setDrawArrow(22, #COLOR_SPECTRUM_SIZE_MAX - lCL)
HLSToRGB(lCH, lCL, lCS, @lCR, @lCG, @lCB)
SetGadgetColor(#Text_0, #PB_Gadget_BackColor, RGB(lCR, lCG, lCB))
StopDrawing()
EndIf
EndProcedure
Procedure DrawHSLText()
; ROUTINE D'AFFICHAGE DES INFOS HSL.
SetGadgetText(#String_0, Str(lCH))
SetGadgetText(#String_1, Str(lCS))
SetGadgetText(#String_2, Str(lCL))
EndProcedure
Procedure DrawRGBText()
; ROUTINE D'AFFICHAGE DES INFOS RGB.
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))
SetGadgetText(#String_6, "#" + RSet(Hex(lCR), 2, "0") + RSet(Hex(lCG), 2, "0") + RSet(Hex(lCB), 2, "0"))
EndProcedure
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
Define event.l
Define evenp.l
Define eveng.l
Define lMosX.l
Define lMosY.l
Define lMosP.l
Define Retour_H.l
Define Retour_S.l
Define Retour_L.l
Define Retour_R.l
Define Retour_G.l
Define Retour_B.l
Define hWnd.l = OpenWindow(#Window_main, 0, 0, #COLOR_SPECTRUM_SIZE_MAX + 46, #COLOR_SPECTRUM_SIZE_MAX + 110, "Spectre de couleurs", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If hWnd <> 0
SmartWindowRefresh(#Window_main, 1)
CanvasGadget(#Canvas_0, 5, 5, #COLOR_SPECTRUM_SIZE_MAX + 2, #COLOR_SPECTRUM_SIZE_MAX + 2)
CanvasGadget(#Canvas_1, 270, 5, 28, #COLOR_SPECTRUM_SIZE_MAX + 2)
TextGadget(#Text_0, 5, 270, 100, 64, "", #PB_Text_Border)
TextGadget(#Text_1, 122, 274, 40, 20, "Teinte", #PB_Text_Right)
TextGadget(#Text_2, 122, 295, 40, 20, "Satur", #PB_Text_Right)
TextGadget(#Text_3, 122, 316, 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, 274, 40, 20, "Rouge", #PB_Text_Right)
TextGadget(#Text_5, 210, 295, 40, 20, "Vert", #PB_Text_Right)
TextGadget(#Text_6, 210, 316, 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, "")
TextGadget(#Text_7, 140, 344, 80, 20, "Couleur Web", #PB_Text_Right)
StringGadget(#String_6, 231, 340, 63, 20, "")
setGenerateStectre()
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))
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_SPECTRUM_SIZE_MAX
lMosX = #COLOR_SPECTRUM_SIZE_MAX
EndIf
EndIf
If lMosY < 0
lMosY = 0
Else
If lMosY > #COLOR_SPECTRUM_SIZE_MAX
lMosY = #COLOR_SPECTRUM_SIZE_MAX
EndIf
EndIf
lCH = lMosX
lCS = #COLOR_SPECTRUM_SIZE_MAX - 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_SPECTRUM_SIZE_MAX
lMosY = #COLOR_SPECTRUM_SIZE_MAX
EndIf
EndIf
lCL = #COLOR_SPECTRUM_SIZE_MAX - 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

Cordialement,
GallyHC