Du kannst auch direkt zeichnen bei der Nachricht #WM_PAINT.
Code: Alles auswählen
;
; < ------------------------- >
; PureBasic IDE - PickColor
; < ------------------------- >
;
; This program is free software; you can redistribute it and/or modify it under
; the terms of the GNU General Public License as published by the Free Software
; Foundation; either version 2 of the License, or (at your option) any later
; version. See the License.txt file for more details.
;
; (c) 2002 Fantaisie Software
;
; Powered by NeoCitron
;
XIncludeFile "Common.pb"
#WINDOW_PickColor_Width = 314
#WINDOW_PickColor_Height = 400
Global PickColor_hBmp_ColorTable , PickColor_hBmp_ColorTableBar, PickColor_hBmp_ColorTableCol
Global PickColor_hWnd_ColorTable , PickColor_hWnd_ColorTableBar, PickColor_hWnd_ColorTableCol
Global PickColor_ColorTable_X , PickColor_ColorTable_Y , PickColor_ColorTable_Color
Global PickColor_Open_X , PickColor_Open_Y , PickColor_Open_Color
Global PickColor_FinalCol , PickColor_ColorTableBar_Y
Global PickColor_Color1 , PickColor_Color2 , PickColor_Count
Global PickColor_temp1 , PickColor_temp2 , PickColor_temp3
Global PickColor_Offset , PickColor_Decimal
Global PickColor_MainWin , PickColor_FinalColor
Structure myDrawing
Type.l
WindowHandle.l
DC.l
ReleaseProcedure.l
EndStructure
Global PickColor_ImageDrawMain.myDrawing
Global PickColor_ImageDrawBar.myDrawing
Global PickColor_ImageDrawCol.myDrawing
PickColor_ImageDrawMain\Type = 1
PickColor_ImageDrawBar\Type = 1
PickColor_ImageDrawCol\Type = 1
Declare PickColor_OpenColorView()
Declare PickColor_ColorView_CallBack(Window,Message,wParam,lParam)
Declare PickColor_GetMainColor(lParam)
Declare PickColor_DrawGradient(Image,Color1,Color2,Count,Offset)
Declare PickColor_ColorChanged(Color)
Declare PickColor_TrackbarMoved()
Declare PickColor_CheckStayOnTop()
Procedure.s PickColor_ColorValue(Value)
If PickColor_Decimal
ProcedureReturn RSet(Str(Value),3,"0")
Else
ProcedureReturn "$"+RSet(Hex(Value),2,"0")
EndIf
EndProcedure
Procedure PickColor_Open()
If PickColor_MainWin = 0
PickColor_MainWin = OpenWindow(#WINDOW_PickColor, 0, 0, #WINDOW_PickColor_Width, #WINDOW_PickColor_Height, #PB_Window_SystemMenu | #PB_Window_WindowCentered | #PB_Window_Invisible, Langage(103)) ;, WindowID(#WINDOW_Main)) ; "Pick Color"
If PickColor_MainWin
PickColor_CheckStayOnTop()
CreateGadgetList(WindowID())
CheckBoxGadget(#GADGET_PickColor_StayOnTop , 10,10, 80,20, Langage(94)) ; "Stay on Top"
CheckBoxGadget(#GADGET_PickColor_CloseAfterDone,100,10,100,20, Langage(95)) ; "Close after done"
CheckBoxGadget(#GADGET_PickColor_Decimal ,210,10,100,20, Langage(96)) ; "Decimal values"
TrackBarGadget(#GADGET_PickColor_Track1, 10,300,200,20,0,255)
TextGadget(#GADGET_PickColor_Track1Text,220,302, 45,20, Langage(97)+PickColor_ColorValue(0)) ; "R: "
TrackBarGadget(#GADGET_PickColor_Track2, 10,320,200,20,0,255)
TextGadget(#GADGET_PickColor_Track2Text,220,322, 45,20, Langage(98)+PickColor_ColorValue(0)) ; "G: "
TrackBarGadget(#GADGET_PickColor_Track3, 10,340,200,20,0,255)
TextGadget(#GADGET_PickColor_Track3Text,220,342, 45,20, Langage(99)+PickColor_ColorValue(0)) ; "B: "
ButtonImageGadget(#GADGET_PickColor_Middle ,302,154, 14,14,LoadImage_(0,32740,#IMAGE_BITMAP,0,0,0))
ButtonGadget(#GADGET_PickColor_InsertRGB ,10 ,370,91,20, Langage(100)) ; "Insert RGB"
ButtonGadget(#GADGET_PickColor_InsertColor ,111,370,91,20, Langage(101)) ; "Insert Color"
ButtonGadget(#GADGET_PickColor_Close ,212,370,91,20, Langage(102)) ; "Close"
SetGadgetState(#GADGET_PickColor_StayOnTop , 0+PickColor_StayOnTop)
SetGadgetState(#GADGET_PickColor_CloseAfterDone, 0+PickColor_CloseAfterDone)
SetGadgetState(#GADGET_PickColor_Decimal , 0+PickColor_Decimal)
PickColor_OpenColorView()
HideWindow(#WINDOW_PickColor, 0)
EndIf
Else
PickColor_CheckStayOnTop()
EndIf
EndProcedure
Procedure PickColor_Events(EventID)
If EventID = #PB_Event_Menu ; Little wrapper to map the shortcut events (identified as menu)
EventID = #PB_Event_Gadget ; to normal gadget events...
GadgetID = EventMenuID()
Else
GadgetID = EventGadgetID()
EndIf
Select EventID
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Gadget
Select GadgetID
Case #GADGET_PickColor_Ok
Quit = 1
Case #GADGET_PickColor_Middle
PickColor_ColorTableBar_Y = 128
InvalidateRect_(PickColor_hWnd_ColorTableBar,0,1)
Case #GADGET_PickColor_Track1
PickColor_TrackbarMoved()
Case #GADGET_PickColor_Track2
PickColor_TrackbarMoved()
Case #GADGET_PickColor_Track3
PickColor_TrackbarMoved()
Case #GADGET_PickColor_InsertRGB
RichEdit_InsertString("RGB(" +PickColor_ColorValue(Red(PickColor_FinalColor))+"," +PickColor_ColorValue(Green(PickColor_FinalColor))+"," +PickColor_ColorValue(Blue(PickColor_FinalColor))+")")
Quit = PickColor_CloseAfterDone
Case #GADGET_PickColor_InsertColor
If PickColor_Decimal
RichEdit_InsertString(StrU(PickColor_FinalColor,2))
Else
RichEdit_InsertString(PickColor_ColorValue(Blue(PickColor_FinalColor))+Right(PickColor_ColorValue(Green(PickColor_FinalColor)),2)+Right(PickColor_ColorValue(Red(PickColor_FinalColor)),2))
EndIf
Quit = PickColor_CloseAfterDone
Case #GADGET_PickColor_Close
Quit = 1
Case #GADGET_PickColor_StayOnTop
PickColor_StayOnTop = GetGadgetState(#GADGET_PickColor_StayOnTop)
PickColor_CheckStayOnTop()
Case #GADGET_PickColor_CloseAfterDone
PickColor_CloseAfterDone = GetGadgetState(#GADGET_PickColor_CloseAfterDone)
Case #GADGET_PickColor_Decimal
PickColor_Decimal = GetGadgetState(#GADGET_PickColor_Decimal)
PickColor_TrackbarMoved()
EndSelect
SetFocus_(WindowID(#WINDOW_PickColor))
EndSelect
If Quit
FreeImage(#IMAGE_PickColorMain)
FreeImage(#IMAGE_PickColorBar)
FreeImage(#IMAGE_PickColorCol)
CloseWindow(#WINDOW_PickColor)
UseWindow(#WINDOW_Main)
PickColor_MainWin = 0
EndIf
EndProcedure
Procedure PickColor_OpenColorView()
PickColor_ColorTable_X = 127
PickColor_ColorTable_Y = 128
PickColor_hBmp_ColorTable = CreateImage(#IMAGE_PickColorMain,256,256)
StartDrawing( ImageOutput() )
PickColor_Open_X = 0
PickColor_Open_Y = 0
label_X:
label_Y:
!XOr dword EAX, EAX
!MOV byte AH , byte [v_PickColor_Open_X]
!ROL dword EAX, 8
!MOV byte AH , 255
!SUB byte AH , byte [v_PickColor_Open_Y]
!MOV byte AL , 255
!SUB byte AL , byte [v_PickColor_Open_X]
!MOV dword [v_PickColor_Open_Color], EAX
Plot(PickColor_Open_X, PickColor_Open_Y, PickColor_Open_Color)
PickColor_Open_Y + 1
If PickColor_Open_Y < 256
Goto label_Y
EndIf
PickColor_Open_X + 1
PickColor_Open_Y = 0
If PickColor_Open_X < 256
Goto label_X
EndIf
StopDrawing()
PickColor_ColorTable_Color = $808080
class$ = "PureBasic_PickColor"
wc.WNDCLASSEX
wc\cbSize = SizeOf(WNDCLASSEX)
wc\lpfnWndProc = GetWindowLong_(WindowID(#WINDOW_PickColor),#GWL_WNDPROC)
wc\hCursor = LoadCursor_(0, #IDC_Arrow)
wc\lpszClassName = @class$
RegisterClassEx_(@wc)
#PickColor_Style = #WS_CHILD|#WS_CLIPSIBLINGS|#WS_CLIPCHILDREN|#WS_VISIBLE|#WS_BORDER
#PickColor_XStyle = #WS_EX_OVERLAPPEDWINDOW
PickColor_hWnd_ColorTable = CreateWindowEx_( #PickColor_XStyle,class$,"",#PickColor_Style,10,30,262,262,WindowID(#WINDOW_PickColor),0,0,0)
PickColor_ImageDrawMain\WindowHandle = PickColor_hWnd_ColorTable
SetWindowLong_(PickColor_hWnd_ColorTable,#GWL_WNDPROC,@PickColor_ColorView_CallBack())
PickColor_ColorTableBar_Y = 128
PickColor_hBmp_ColorTableBar = CreateImage(#IMAGE_PickColorBar,34,263)
PickColor_hBmp_ColorTableCol = CreateImage(#IMAGE_PickColorCol,44,60)
PickColor_DrawGradient(#IMAGE_PickColorBar , $FFFFFF ,PickColor_ColorTable_Color,128,0)
PickColor_DrawGradient(#IMAGE_PickColorBar , PickColor_ColorTable_Color, 0 ,128,128)
class$ = "PureBasic_PickColorBar"
wc\cbSize = SizeOf(WNDCLASSEX)
wc\lpfnWndProc = GetWindowLong_(WindowID(#WINDOW_PickColor),#GWL_WNDPROC)
wc\hCursor = LoadCursor_(0, #IDC_Arrow)
wc\lpszClassName = @class$
RegisterClassEx_(@wc)
PickColor_hWnd_ColorTableBar = CreateWindowEx_( #PickColor_XStyle,class$,"",#PickColor_Style,275,30,29,263,WindowID(#WINDOW_PickColor),0,0,0)
PickColor_hWnd_ColorTableCol = CreateWindowEx_( #PickColor_XStyle,class$,"",#PickColor_Style,265,300,39,60,WindowID(#WINDOW_PickColor),0,0,0)
PickColor_ImageDrawBar\WindowHandle = PickColor_hWnd_ColorTableBar
PickColor_ImageDrawCol\WindowHandle = PickColor_hWnd_ColorTableCol
SetWindowLong_(PickColor_hWnd_ColorTableBar,#GWL_WNDPROC,@PickColor_ColorView_CallBack())
SetWindowLong_(PickColor_hWnd_ColorTableCol,#GWL_WNDPROC,@PickColor_ColorView_CallBack())
;InvalidateRect_(PickColor_hWnd_ColorTableBar,0,0)
;InvalidateRect_(PickColor_hWnd_ColorTableCol,0,0)
EndProcedure
Procedure PickColor_ColorView_CallBack(Window,Message,wParam,lParam)
If Message = #WM_ERASEBKGND
ProcedureReturn 1
EndIf
Select Window
Case PickColor_hWnd_ColorTable
Select Message
Case #WM_LBUTTONDOWN
GetClientRect_(PickColor_hWnd_ColorTable,clip.RECT)
MapWindowPoints_(PickColor_hWnd_ColorTable,0,clip,2)
ClipCursor_(clip.RECT)
PickColor_GetMainColor(lParam)
Result = 0
Case #WM_LBUTTONUP
ClipCursor_(0)
Result = 0
Case #WM_MOUSEMOVE
If wParam = #MK_LBUTTON
PickColor_GetMainColor(lParam)
Result = 0
EndIf
Case #WM_PAINT
DefWindowProc_(Window,Message,wParam,lParam)
BeginPaint_(PickColor_hWnd_ColorTable,ps.PAINTSTRUCT)
StartDrawing( PickColor_ImageDrawMain )
DrawImage(PickColor_hBmp_ColorTable,0,0)
Box(PickColor_ColorTable_X-3,PickColor_ColorTable_Y,8,2,0)
Box(PickColor_ColorTable_X,PickColor_ColorTable_Y-3,2,8,0)
StopDrawing()
EndPaint_(PickColor_hWnd_ColorTable,ps)
Result = 0
Default
Result = DefWindowProc_(Window,Message,wParam,lParam)
EndSelect
Case PickColor_hWnd_ColorTableBar
Select Message
Case #WM_LBUTTONDOWN
PickColor_ColorTableBar_Y = lParam >> 16
GetClientRect_(PickColor_hWnd_ColorTableBar,clip.RECT)
MapWindowPoints_(PickColor_hWnd_ColorTableBar,0,clip,2)
ClipCursor_(clip.RECT)
InvalidateRect_(PickColor_hWnd_ColorTableBar,0,0)
Result = 0
Case #WM_LBUTTONUP
ClipCursor_(0)
Result = 0
Case #WM_MOUSEMOVE
If wParam = #MK_LBUTTON
PickColor_ColorTableBar_Y = lParam >> 16
InvalidateRect_(PickColor_hWnd_ColorTableBar,0,0)
Result = 0
EndIf
Case #WM_PAINT
DefWindowProc_(Window,Message,wParam,lParam)
BeginPaint_(PickColor_hWnd_ColorTableBar,ps.PAINTSTRUCT)
hDC = GetDC_(PickColor_hWnd_ColorTableBar)
StartDrawing( PickColor_ImageDrawBar )
DrawImage(PickColor_hBmp_ColorTableBar,0,0)
Color = Point(10,PickColor_ColorTableBar_Y)
Box(0,PickColor_ColorTableBar_Y-2,23,4,0)
Box(2,PickColor_ColorTableBar_Y-1,19,2,$FFFFFF)
StopDrawing()
ReleaseDC_(PickColor_hWnd_ColorTableBar,hDC)
EndPaint_(PickColor_hWnd_ColorTableBar,ps)
PickColor_ColorChanged(Color)
Result = 0
Default
Result = DefWindowProc_(Window,Message,wParam,lParam)
EndSelect
Case PickColor_hWnd_ColorTableCol
Select Message
Case #WM_PAINT
DefWindowProc_(Window,Message,wParam,lParam)
BeginPaint_(PickColor_hWnd_ColorTableCol,ps.PAINTSTRUCT)
StartDrawing( PickColor_ImageDrawCol )
DrawImage(PickColor_hBmp_ColorTableCol,0,0)
StopDrawing()
EndPaint_(PickColor_hWnd_ColorTableCol,ps)
Default
Result = DefWindowProc_(Window,Message,wParam,lParam)
EndSelect
EndSelect
ProcedureReturn Result
EndProcedure
Procedure PickColor_GetMainColor(lParam)
PickColor_ColorTable_X = lParam & $FFFF
PickColor_ColorTable_Y = lParam >> 16
InvalidateRect_(PickColor_hWnd_ColorTable,0,0)
UseImage(#IMAGE_PickColorMain)
StartDrawing(ImageOutput())
PickColor_ColorTable_Color = Point(PickColor_ColorTable_X, PickColor_ColorTable_Y)
StopDrawing()
PickColor_DrawGradient(#IMAGE_PickColorBar , $FFFFFF ,PickColor_ColorTable_Color,128,0)
PickColor_DrawGradient(#IMAGE_PickColorBar , PickColor_ColorTable_Color, 0 ,128,128)
InvalidateRect_(PickColor_hWnd_ColorTableBar,0,0)
EndProcedure
Procedure PickColor_ColorChanged(Color)
PickColor_FinalColor = Color
Red = Red(Color) : Green = Green(Color) : Blue = Blue(Color)
SetGadgetState(#GADGET_PickColor_Track1,Red)
SetGadgetText (#GADGET_PickColor_Track1Text,Langage(97)+PickColor_ColorValue(Red))
SetGadgetState(#GADGET_PickColor_Track2,Green)
SetGadgetText (#GADGET_PickColor_Track2Text,Langage(98)+PickColor_ColorValue(Green))
SetGadgetState(#GADGET_PickColor_Track3,Blue)
SetGadgetText (#GADGET_PickColor_Track3Text,Langage(99)+PickColor_ColorValue(Blue))
UseImage(#IMAGE_PickColorCol)
StartDrawing(ImageOutput())
Box(0,0,44,60,PickColor_FinalColor)
StopDrawing()
InvalidateRect_(PickColor_hWnd_ColorTableCol,0,0)
EndProcedure
Procedure PickColor_TrackbarMoved()
Red = GetGadgetState(#GADGET_PickColor_Track1)
Green = GetGadgetState(#GADGET_PickColor_Track2)
Blue = GetGadgetState(#GADGET_PickColor_Track3)
PickColor_ColorChanged(RGB(Red,Green,Blue))
EndProcedure
Procedure PickColor_CheckStayOnTop()
If PickColor_StayOnTop
SetWindowPos_(WindowID(#WINDOW_PickColor),#HWND_TOPMOST ,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE)
Else
SetWindowPos_(WindowID(#WINDOW_PickColor),#HWND_NOTOPMOST,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE)
EndIf
UseWindow(#WINDOW_PickColor)
EndProcedure
Procedure PickColor_DrawGradient(Image,Color1,Color2,Count,Offset)
PickColor_Color1 = Color1
PickColor_Color2 = Color2
PickColor_Count = Count
PickColor_Offset = Offset
UseImage(Image)
StartDrawing(ImageOutput())
!MOV dword ECX, [v_PickColor_Color1]
!MOV dword EDI, [v_PickColor_Color2]
!SAL dword ECX, 7
!SAL dword EDI, 7
!MOV dword EAX, ECX
!MOV dword EBX, EDI
!And dword EAX, 0FF000000h / 2
!And dword EBX, 0FF000000h / 2
!SUB dword EAX, EBX
!CDQ
!IDIV dword [v_PickColor_Count]
!MOV dword [v_PickColor_temp1], EAX
!MOV dword EAX, ECX
!MOV dword ESI, EDI
!And dword EAX, 0FF0000h / 2
!And dword ESI, 0FF0000h / 2
!SUB dword EAX, ESI
!CDQ
!IDIV dword [v_PickColor_Count]
!MOV dword [v_PickColor_temp2], EAX
!MOV dword EAX, ECX
!And dword EAX, 0FF00h / 2
!And dword EDI, 0FF00h / 2
!SUB dword EAX, EDI
!CDQ
!IDIV dword [v_PickColor_Count]
!MOV dword [v_PickColor_temp3], EAX
!MOV dword EAX, [v_PickColor_Color2]
!PickColor_Loop:
!PUSH dword EBX
!PUSH dword ESI
!PUSH dword EDI
Line( 0, PickColor_Count+PickColor_Offset, 34,0,PickColor_Color2)
!POP dword EDI
!POP dword ESI
!POP dword EBX
!add dword EBX, [v_PickColor_temp1]
!mov dword EAX, EBX
!And dword EAX, 0FF000000h / 2
!ADD dword ESI, [v_PickColor_temp2]
!MOV dword EDX, ESI
!And dword EDX, 0FF0000h / 2
!Or dword EAX, EDX
!ADD dword EDI, [v_PickColor_temp3]
!MOV dword EDX, EDI
!And dword EDX, 0FF00h / 2
!Or dword EAX, EDX
!SHR dword EAX, 7
!MOV dword [v_PickColor_Color2], EAX
!DEC dword [v_PickColor_Count]
!CMP dword [v_PickColor_Count], -1
!JNZ NEAR PickColor_Loop
StopDrawing()
EndProcedure
Was Du mal durchlesen könntest ist die Prozedur PickColor_ColorView_CallBack().