Farbverlauf wie in PB Werkzeuge-Farbauswahl
Verfasst: 12.07.2008 16:22
erzeugt die Farbverlauf Boxen wie in der Farbauswahl unter Werkzeuge. Wenn man in die große RGB Box klickt, ändert sich auch die Farbe im Balken.
Funktioniert auch wunderbar, aber nun fehlt mir momentan der Ansatz für das bewegliche Fadenkreuz, bzw. den Schieber im Balken. Hat jemand dafür eine Idee ?
Funktioniert auch wunderbar, aber nun fehlt mir momentan der Ansatz für das bewegliche Fadenkreuz, bzw. den Schieber im Balken. Hat jemand dafür eine Idee ?
Code: Alles auswählen
;Farbverlauf wie in PB Werkzeuge-Farbauswahl
;HJBREMER 2008
;diese Structur fehlt immer noch in PB
Structure GRADIENT_TRIANGLE
Vertex1.l
Vertex2.l
Vertex3.l
EndStructure
Structure myFarbVerlauf
dc.l
trifarbe.l[3]
tripos.point[3]
trivert.TRIVERTEX[3]
trirect.GRADIENT_TRIANGLE
gradrect.GRADIENT_RECT
EndStructure
Procedure Api_FarbverlaufRect(*var.myFarbverlauf)
With *var
;UpperLeft = oben links vom Viereck
\trivert[0]\x = \tripos[0]\x
\trivert[0]\y = \tripos[0]\y
\trivert[0]\Red = Red(\trifarbe[0]) <<8
\trivert[0]\Green = Green(\trifarbe[0])<<8
\trivert[0]\Blue = Blue(\trifarbe[0]) <<8
;LowerRight = unten rechts
\trivert[1]\x = \tripos[1]\x
\trivert[1]\y = \tripos[1]\y
\trivert[1]\Red = Red(\trifarbe[1]) <<8
\trivert[1]\Green = Green(\trifarbe[1])<<8
\trivert[1]\Blue = Blue(\trifarbe[1]) <<8
\gradrect\UpperLeft = 0 ;an diesen Werten nicht rumspielen
\gradrect\LowerRight = 1 ;sonst Memory Fehler
Gradientfill_(\dc, \trivert, 2, \gradrect, 1, #GRADIENT_FILL_RECT_H)
EndWith
EndProcedure
Procedure Api_FarbverlaufTriangle(*var.myFarbverlauf)
With *var
;oben
\trivert[0]\x = \tripos[0]\x
\trivert[0]\y = \tripos[0]\y
\trivert[0]\Red = Red(\trifarbe[0]) <<8
\trivert[0]\Green = Green(\trifarbe[0])<<8
\trivert[0]\Blue = Blue(\trifarbe[0]) <<8
;links
\trivert[1]\x = \tripos[1]\x
\trivert[1]\y = \tripos[1]\y
\trivert[1]\Red = (Red(\trifarbe[1]) <<8)
\trivert[1]\Green = (Green(\trifarbe[1])<<8)
\trivert[1]\Blue = (Blue(\trifarbe[1]) <<8)
;rechts
\trivert[2]\x = \tripos[2]\x
\trivert[2]\y = \tripos[2]\y
\trivert[2]\Red = (Red(\trifarbe[2]) <<8)
\trivert[2]\Green = (Green(\trifarbe[2])<<8)
\trivert[2]\Blue = (Blue(\trifarbe[2]) <<8)
\trirect\Vertex1 = 0 ;nicht rumspielen
\trirect\Vertex2 = 1 ;sonst Memory Fehler
\trirect\Vertex3 = 2
Gradientfill_(\dc, \trivert, 3, \trirect, 1, #GRADIENT_FILL_TRIANGLE)
EndWith
EndProcedure
Procedure myFarbVerlaufRGBimage(pbnr,br,hh)
With var.myFarbverlauf
id =CreateImage(pbnr,br,hh)
\dc=StartDrawing(ImageOutput(pbnr))
farbemitte = $707070 ;grau
farbe_rot = #Red
farbe_blau = #Blue
farbe_gruen = $90ff00
farbe_gelb = #Yellow
; p[0] = mittelpunkt des Rechtecks bzw. Spitze des Dreiecks
; p[1] = linker punkt Basis des Dreiecks
; p[2] = rechter punkt Basis des Dreiecks
\tripos[0]\x=br / 2 ;spalte Mittelpunkt bzw. Spitze des Dreiecks
\tripos[0]\y=hh / 2 ;zeile Mittelpunkt
;Dreieck unten
\tripos[1]\x=0: \tripos[1]\y=hh ;linker punkt Basis des Dreiecks
\tripos[2]\x=br: \tripos[2]\y=hh ;rechter punkt Basis des Dreiecks
\trifarbe[0] = farbemitte ;Spitze des Dreiecks, bleibt immer gleich
\trifarbe[1] = farbe_rot ;linker punkt Basis des Dreiecks
\trifarbe[2] = farbe_blau ;rechter punkt Basis des Dreiecks
Api_FarbverlaufTriangle(var)
;Dreieck rechts
\tripos[1]\x=br: \tripos[1]\y=hh
\tripos[2]\x=br: \tripos[2]\y=0
\trifarbe[1] = farbe_blau
\trifarbe[2] = farbe_gruen
Api_FarbverlaufTriangle(var)
;Dreieck oben
\tripos[1]\x=br: \tripos[1]\y=0
\tripos[2]\x=0: \tripos[2]\y=0
\trifarbe[1] = farbe_gruen
\trifarbe[2] = farbe_gelb
Api_FarbverlaufTriangle(var)
;Dreieck links
\tripos[1]\x=0: \tripos[1]\y=0
\tripos[2]\x=0: \tripos[2]\y=hh
\trifarbe[1] = farbe_gelb
\trifarbe[2] = farbe_rot
Api_FarbverlaufTriangle(var)
SetRect_(r.rect,0,0,br,hh)
DrawEdge_(\dc,r, #EDGE_RAISED,#BF_RECT)
StopDrawing()
EndWith
ProcedureReturn id
EndProcedure
Procedure myFarbVerlaufBoximage(pbnr,br,hh,farbe)
With var.myFarbverlauf
;oben links vom halben Balken
\tripos[0]\x = 0 ;spalte
\tripos[0]\y = 0 ;zeile
;unten rechts vom halben Balken
\tripos[1]\x = br / 2
\tripos[1]\y = hh
id1 = CreateImage(#PB_Any, br / 2, hh)
\dc = StartDrawing(ImageOutput(id1))
\trifarbe[0] = #Black
\trifarbe[1] = farbe
Api_FarbverlaufRect(var)
StopDrawing()
id2 = CreateImage(#PB_Any, br / 2, hh)
\dc = StartDrawing(ImageOutput(id2))
\trifarbe[0] = farbe
\trifarbe[1] = #White
Api_FarbverlaufRect(var)
StopDrawing()
id = CreateImage(pbnr, br, hh)
dc = StartDrawing(ImageOutput(pbnr))
DrawImage(ImageID(id1),0,0)
DrawImage(ImageID(id2),br /2,0)
SetRect_(r.rect,0,0,br,hh)
DrawEdge_(dc,r, #EDGE_RAISED,#BF_RECT)
StopDrawing()
EndWith
ProcedureReturn id
EndProcedure
Procedure GetColorUnderMouse()
GetCursorPos_(p.point)
dc = GetDC_(0)
If dc <> 0
farbe = GetPixel_(dc,p\x,p\y)
ReleaseDC_(0, dc)
EndIf
ProcedureReturn farbe
EndProcedure
;=======================================================
Enumeration
#win = 1
#but1
#but2
#img1
#img2
EndEnumeration
#rgbboxsp = 15
#rgbboxze = 15
#rgbboxbr = 150
#rgbboxhh = 300
#balkensp = 15
#balkenze = 400
#balkenbr = 250
#balkenhh = 30
;=======================================================
farbe = GetColorUnderMouse()
hwnd=OpenWindow(#win, 0, 0, 640, 480, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(hwnd)
myFarbVerlaufBoximage(#img1,#balkenbr,#balkenhh,farbe)
ImageGadget(#but1,#balkensp,#balkenze,0,0,ImageID(#img1))
myFarbVerlaufRGBimage(#img2,#rgbboxbr,#rgbboxhh)
ImageGadget(#but2,#rgbboxsp,#rgbboxze,0,0,ImageID(#img2))
;=======================================================
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Gadget Or EventID = #PB_Event_Menu
wButton = EventGadget()
Select wButton
Case #but2
farbe = GetColorUnderMouse()
myFarbVerlaufBoximage(#img1,#balkenbr,#balkenhh,farbe)
SetGadgetState(#but1, ImageID(#img1))
EndSelect
EndIf
Until eventid = #PB_Event_CloseWindow
End