Hier ein handlicher, kleiner Color-Picker (Blitz+), der RGB-Werte dezimal oder hex zurückgibt. Kann für Web-Anwendungen (web-safe colors), aber auch als 'schönerer' und kompakter Ersatz für den hässlichen Windows-Standard-Picker verwendet werden.
Beispielprogramm:
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] Include "colorpicker.bb"
If Colorpicker_RequestColor() = 1 Then
Notify "R:" + ColorPicker_RequestedRed () Notify "G:" + ColorPicker_RequestedGreen() Notify "B:" + ColorPicker_RequestedBlue ()
Notify "R: #" + ColorPicker_RequestedRedHex () Notify "G: #" + ColorPicker_RequestedGreenHex() Notify "B: #" + ColorPicker_RequestedBlueHex ()
Notify "Column: " + ColorPicker_PickedCol() Notify " Row: " + ColorPicker_PickedRow() End If
End
Speichern als Datei "colorpicker.bb":
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN]
Global CP_cols% = 18 Global CP_rows% = 11 Global CP_boxsize% = 10 Global CP_boxspacing% = 1 Global CP_canvasX% = 2 Global CP_canvasY% = 2 Global CP_canvasWidth% = CP_cols * (CP_boxsize + CP_boxspacing) + CP_boxspacing Global CP_canvasHeight% = CP_rows * (CP_boxsize + CP_boxspacing) + CP_boxspacing Global CP_previewWidth% = 24 Global CP_previewHeight%= 17 Global CP_gradientWidth%= 10 Global CP_winWidth = CP_canvasWidth + CP_gradientWidth + 18 Global CP_winHeight = CP_canvasHeight + 48 Global CP_lastCol% Global CP_lastRow% Global CP_pickedR%, CP_pickedG%, CP_pickedB% Global CP_pickedRH$, CP_pickedGH$, CP_pickedBH$ Global CP_pickedCol%,CP_pickedRow% Global CP_now%
Type TColorBox Field col% Field row% Field r%,g%,b% End Type Global CP_ColorBox.TColorBox
Type TColorGradient Field y% Field r%,g%,b% End Type Global CP_ColorGradient.TColorGradient
For CP_i = 0 To CP_rows CP_ColorBox.TColorBox = New TColorBox CP_ColorBox\col = 0
CP_ColorBox\row = CP_i If CP_i <= 7 Then CP_ColorBox\r = CP_i * 34 CP_ColorBox\g = CP_i * 34 CP_ColorBox\b = CP_i * 34 Else If CP_i = 8 Then CP_ColorBox\r = 255 CP_ColorBox\g = 255 CP_ColorBox\b = 0 Else If CP_i = 9 Then CP_ColorBox\r = 255 CP_ColorBox\g = 0 CP_ColorBox\b = 0 Else If CP_i = 10 Then CP_ColorBox\r = 0 CP_ColorBox\g = 255 CP_ColorBox\b = 0 Else If CP_i = 11 Then CP_ColorBox\r = 0 CP_ColorBox\g = 0 CP_ColorBox\b = 255 End If Next
CP_red% = CP_grn% = CP_blu% = 0
For CP_col = 1 To CP_cols For CP_row = 0 To CP_rows If CP_col < 7 Then If CP_row < 6 Then CP_red = 0 Else CP_red = 9 Else If CP_col < 13 Then If CP_row < 6 Then CP_red = 3 Else CP_red = 12 Else If CP_row < 6 Then CP_red = 6 Else CP_red = 15 End If CP_ColorBox.TColorBox = New TColorBox CP_ColorBox\col = CP_col CP_ColorBox\row = CP_row CP_ColorBox\r = CP_red * 17 CP_ColorBox\g = CP_grn * 17 CP_ColorBox\b = CP_blu * 17 If CP_blu > 12 Then CP_blu = 0 Else CP_blu = CP_blu + 3 Next If CP_grn > 12 Then CP_grn = 0 Else CP_grn = CP_grn + 3 Next
Global CP_Window% = CreateWindow ("PICK A COLOR:",(ClientWidth(Desktop())-CP_winWidth)/2,(ClientHeight(Desktop())- CP_winHeight )/2,CP_winWidth, CP_winHeight,Win,1+16) Global CP_Canvas_Boxes = CreateCanvas (CP_canvasX,CP_canvasY,CP_canvasWidth,CP_canvasHeight,CP_Window,65536) Global CP_Canvas_Preview = CreateCanvas (CP_canvasX,CP_canvasY+CP_canvasHeight+2,CP_previewWidth,CP_previewHeight,CP_Window,65536) Global CP_Canvas_Gradient = CreateCanvas (CP_canvasX+CP_canvasWidth+2,CP_canvasY,CP_gradientWidth,CP_canvasHeight,CP_Window,65536) Global CP_Canvas_Marker = CreateCanvas (CP_canvasX+CP_canvasWidth+CP_gradientWidth+4,CP_canvasY+CP_canvasHeight/2,4,2,CP_Window,65536) Global CP_Label_Status% = CreateLabel ("",CP_canvasX+CP_previewWidth+2,CP_canvasY+CP_canvasHeight+4,50,16,CP_Window,0) Global CP_Button_Select% = CreateButton ("Apply",CP_winWidth-145,CP_canvasY+CP_canvasHeight+3,64,16,CP_Window) Global CP_Button_Cancel% = CreateButton ("Cancel",CP_winWidth-78,CP_canvasY+CP_canvasHeight+3,64,16,CP_Window)
SetBuffer CanvasBuffer (CP_Canvas_Boxes)
For CP_ColorBox.TColorBox = Each TColorBox CP_x% = CP_ColorBox\col * (CP_boxsize + CP_boxspacing) + CP_boxspacing CP_y% = CP_ColorBox\row * (CP_boxsize + CP_boxspacing) + CP_boxspacing
Color CP_ColorBox\r, CP_ColorBox\g, CP_ColorBox\b Rect CP_x, CP_y, CP_boxsize, CP_boxsize, 1 Next
Function Colorpicker_RequestColor% (c%=0,r%=0)
Local Event%, Item% CP_SelectColorBox(c,r)
Repeat CP_now = MilliSecs () Event = WaitEvent () Item = EventSource()
If Event = $803 Or KeyDown(1) Then HideGadget CP_Window : Return 0
If Event = $201 Then
If Item = CP_Canvas_Boxes Then CP_updateHighlight = 1 If Item = CP_Canvas_Gradient Then CP_updateGradient = 1
End If If Event = $202 Then CP_updateGradient = 0 : CP_updateHighlight = 0
If Event = $401 Then
If Item = CP_Button_Select Then HideGadget CP_Window : Return 1
If Item = CP_Button_Cancel Then HideGadget CP_Window : Return 0
End If If CP_updateGradient = 1 Then CP_PickGradientColor() If CP_updateHighlight = 1 Then CP_SelectColorBox() Forever
End Function
Function CP_SelectColorBox(col% = -1, row% = -1)
Local mx%,my%,x%,y%
mx = MouseX(CP_Canvas_Boxes) my = MouseY(CP_Canvas_Boxes) If col = -1 Then col = mx / (CP_boxsize + CP_boxspacing) If row = -1 Then row = my / (CP_boxsize + CP_boxspacing) If col >= 0 And col < CP_cols And row >= 0 And row < CP_rows Then For CP_ColorBox.TColorBox = Each TColorBox If CP_ColorBox\col = col And CP_ColorBox\row = row Then CP_pickedR% = CP_ColorBox\r CP_pickedG% = CP_ColorBox\g CP_pickedB% = CP_ColorBox\b CP_pickedRH$ = Right(Hex(CP_ColorBox\r),2) CP_pickedGH$ = Right(Hex(CP_ColorBox\g),2) CP_pickedBH$ = Right(Hex(CP_ColorBox\b),2) CP_pickedCol% = CP_ColorBox\col CP_pickedRow% = CP_ColorBox\row Exit End If Next
SetBuffer CanvasBuffer (CP_Canvas_Boxes) x = (CP_lastCol * (CP_boxsize + CP_boxspacing) + CP_boxspacing)-1 y = (CP_lastRow * (CP_boxsize + CP_boxspacing) + CP_boxspacing)-1 Color 0,0,0 Rect x, y, CP_boxsize+2, CP_boxsize+2, 0
x = (col * (CP_boxsize + CP_boxspacing) + CP_boxspacing)-1 y = (row * (CP_boxsize + CP_boxspacing) + CP_boxspacing)-1 Color 255,255,255 Rect x, y, CP_boxsize+2, CP_boxsize+2, 0
SetGadgetText CP_Label_Status,"#" + CP_pickedRH$ + CP_pickedGH$ + CP_pickedBH$ SetBuffer CanvasBuffer (CP_Canvas_Preview) Color CP_pickedR, CP_pickedG, CP_pickedB Rect CP_boxspacing, CP_boxspacing, CP_previewWidth-CP_boxspacing*2, CP_previewHeight-CP_boxspacing*2, 1
FlipCanvas CP_Canvas_Boxes FlipCanvas CP_Canvas_Preview CP_lastCol = col CP_lastRow = row CP_DrawGradient() End If End Function
Function CP_DrawGradient()
SetBuffer CanvasBuffer (CP_Canvas_Gradient)
colorPercent# = 255.0 / 100.0 wayPercent# = (Float(CP_canvasHeight)/2.0) / 100.0
For i% = 0 To CP_canvasHeight If i < CP_canvasHeight/2 Then offset# = 255.0 - (Float(i) / wayPercent) * colorPercent Else offset# = - ( (Float(i-CP_canvasHeight/2) / wayPercent) * colorPercent ) End If r% = CP_pickedR + offset g% = CP_pickedG + offset b% = CP_pickedB + offset If r < 0 Then r = 0 Else If r > 255 Then r = 255 If g < 0 Then g = 0 Else If g > 255 Then g = 255 If b < 0 Then b = 0 Else If b > 255 Then b = 255 Color r,g,b : Line 1,i,CP_gradientWidth-2,i Next
Color 0,0,0 : Line 0,0,CP_gradientWidth,0
FlipCanvas CP_Canvas_Gradient
SetGadgetShape CP_Canvas_Marker,CP_canvasX+CP_canvasWidth+CP_gradientWidth+4,CP_canvasY+CP_canvasHeight/2,4,2 End Function
Function CP_PickGradientColor()
my% = MouseY(CP_Canvas_Gradient) If my < 0 Or my >= CP_canvasHeight-1 Then Return
colorPercent# = 255.0 / 100.0 wayPercent# = (Float(CP_canvasHeight)/2.0) / 100.0
If my < CP_canvasHeight/2 Then offset# = 255.0 - (Float(my) / wayPercent) * colorPercent Else offset# = - ( (Float(my-CP_canvasHeight/2) / wayPercent) * colorPercent ) End If
For CP_ColorBox.TColorBox = Each TColorBox If CP_ColorBox\col = CP_pickedCol And CP_ColorBox\row = CP_pickedRow Then CP_pickedR% = CP_ColorBox\r + offset CP_pickedG% = CP_ColorBox\g + offset CP_pickedB% = CP_ColorBox\b + offset If CP_pickedR < 0 Then CP_pickedR = 0 Else If CP_pickedR > 255 Then CP_pickedR = 255 If CP_pickedG < 0 Then CP_pickedG = 0 Else If CP_pickedG > 255 Then CP_pickedG = 255 If CP_pickedB < 0 Then CP_pickedB = 0 Else If CP_pickedB > 255 Then CP_pickedB = 255 CP_pickedRH$ = Right(Hex(CP_pickedR),2) CP_pickedGH$ = Right(Hex(CP_pickedG),2) CP_pickedBH$ = Right(Hex(CP_pickedB),2) Exit End If Next
SetGadgetText CP_Label_Status,"#" + CP_pickedRH$ + CP_pickedGH$ + CP_pickedBH$ SetBuffer CanvasBuffer (CP_Canvas_Preview) Color CP_pickedR, CP_pickedG, CP_pickedB Rect CP_boxspacing, CP_boxspacing, CP_previewWidth-CP_boxspacing*2, CP_previewHeight-CP_boxspacing*2, 1 FlipCanvas CP_Canvas_Preview
SetGadgetShape CP_Canvas_Marker,CP_canvasX+CP_canvasWidth+CP_gradientWidth+4,CP_canvasY+my,4,2 End Function
Function ColorPicker_RequestedRed% () Return CP_pickedR End Function
Function ColorPicker_RequestedGreen% () Return CP_pickedG End Function
Function ColorPicker_RequestedBlue% () Return CP_pickedB End Function
Function ColorPicker_RequestedRedHex$ () Return CP_pickedRH$ End Function
Function ColorPicker_RequestedGreenHex$ () Return CP_pickedGH$ End Function
Function ColorPicker_RequestedBlueHex$ () Return CP_pickedBH$ End Function
Function ColorPicker_PickedCol% () Return CP_pickedCol End Function
Function ColorPicker_PickedRow% () Return CP_pickedRow End Function
|