Farbverlauf wie in PB Werkzeuge-Farbauswahl

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Farbverlauf wie in PB Werkzeuge-Farbauswahl

Beitrag von hjbremer »

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 ?

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
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Bei mir ist die Struktur GRADIENT_TRIANGLE bereits vorhanden -> Hast Du noch PB4.10?
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Farbverlauf wie in PB Werkzeuge-Farbauswahl

Beitrag von Danilo »

hjbremer hat geschrieben: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 ?
Du meinst bestimmt für Windows (Dein Code läuft so nicht auf Linux, da Du
die Struktur POINT verwendest), und da ich momentan kein Windows
mehr habe, kann ich Dir keinen fertigen Code präsentieren.

Ich habe aber vor ein paar Jahren dieses Tool in den PB-Editor gebracht
und kann Dich vielleicht in die richtige Richtung lenken:

Du machst eine neue WindowProzedur (WinProc) für die 2 ImageGadgets,
und setzt Deine Prozedur mit 'oldProc = SetWindowLong_(GadgetID(x), #GWL_WNDPROC, @WindowProc())'

In dieser Prozedur fängst Du Mausnachrichten ab (#WM_MOUSEMOVE,
#WM_LBUTTONDOWN, #WM_LBUTTONUP etc.) und bekommst somit die
aktuellen Mauskoordinaten. Damit kannst Du dann auf Dein Bild entsprechend
ein Fadenkreuz, einen "Slider" etc. zeichnen.
Nachdem Du diese Nachrichten abgefangen hast, kannst Du Diese weiterleiten
oder mit ProcedureReturn zurückspringen.
Für alle anderen Nachrichten machst Du ein CallWindowProc_().

Also in etwa so:

Code: Alles auswählen

Global old_ImgBtnProc

Procedure ImgBtnProc(hWnd.l, Msg.l, wParam.l, lParam.l)
  ;Shared lButtonDown = #False

  Select Msg
    ;Case #WM_LBUTTONDOWN
    ;  lButtonDown = #True
    ;Case #WM_LBUTTONUP
    ;  lButtonDown = #False
    Case #WM_MOUSEMOVE
      ; If lButtonDown = #True
      If wParam = #MK_LBUTTON ; linke Mausetaste gedrückt
        x = lParam & $FFFF
        y = (lParam>>16) & $FFFF
        ;
        ; zeichne was mit x und y auf das bild
        ; und mache refresh
        ;
        ProcedureReturn 0 ; abgearbeitet, return 0
      EndIf
  EndSelect

  ProcedureReturn CallWindowProc_(old_ImgBtnProc,hWnd,Msg,wParam,lParam)
EndProcedure


ImageGadget(x,...)

old_ImgBtnProc = SetWindowLong_(GadgetID(x), #GWL_WNDPROC, @ImgBtnProc())
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

marco2006 hat geschrieben:Bei mir ist die Struktur GRADIENT_TRIANGLE bereits vorhanden -> Hast Du noch PB4.10?
<offtopic>
Die Strukture mag bei Dir vorhanden sein, aber sie kommt nicht von PB!
</offtopic>
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

Danilo, danke für den Code, werde mal probieren ob ich da was hinbekomme, bin leider mit WindowProc() noch nicht vertraut.

Aber ich könnte wohl damit ein Kreuz malen, nur das Kreuz muß ja auch wieder weg, und das hieße doch ich müßte mit einer Kopie vom Farbenimage arbeiten. Oder ?

PS: ich habe 4.2 und die Struktur taucht unter Werkzeuge-Strukturverzeichnis nicht auf !
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

hjbremer hat geschrieben:Aber ich könnte wohl damit ein Kreuz malen, nur das Kreuz muß ja auch wieder weg, und das hieße doch ich müßte mit einer Kopie vom Farbenimage arbeiten. Oder ?
Du kannst auch direkt zeichnen bei der Nachricht #WM_PAINT.

In PickColor.pb beim alten Editor sieht man sehr schön wie es lief:

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().
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

vielen Dank für die Mühe, werde mich damit beschäftigen. :allright:

EDIT:
soweit gelöst. siehe http://www.purebasic.fr/german/viewtopi ... 917#205917
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten