FarbEinsteller

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

FarbEinsteller

Beitrag von hjbremer »

Hallo, ich habe mal meinen FarbEinsteller überarbeitet.

Wenn man den Code mit 4.3 zu einer Exe compiliert, ist diese ca 30 Kb groß
mit 4.5rc2 leider ca 60 Kb. Man sollte also die alten Versionen ncht löschen.

Code: Alles auswählen

;PB ab 4.3 x86 - Windows XP - von HJBremer 
;Design nach einer Idee aus dem Codearchiv

Structure FarbEinsteller 
  window.i 
  wFarbe.i
  eventid.i 
  wButton.i
  
  consp.i   ;normalerweise null
  conze.i   ;normalerweise null
  conbr.i   ;Containerbreite wird in INI festgelegt
  conhh.i   ;Containerhöhe 
  connr.i   ;Container pbnr
  confb.i   ;Container BackColor, 
  
  zr.i      ;Abstand von Button zu Button, Zwischenraum  
  hh.i      ;Höhe der Buttons
  tbr1.i    ;Breite der Buttons
  tbr2.i
  tbr3.i  
  trackbr.i    ;Breite Trackbar
  imagebr.i    ;Breite Image
  tracktic.f   ;für Callback
  
  zeile.i[6]
  spalte.i[8]
 
  tracknr.i[4]  ;PB Buttonnummern
  charLks.i[4]
  charRts.i[4]
  textHex.i[6]
  textDez.i[6]    
  img1.i        ;PB Imagenummern
  img2.i
  imgnr1.i
  imgnr2.i
  
  r.c           ;Farbwerte intern
  g.c
  b.c  
  farbwert.i    ;Farbwert intern
  RGBwert.i     ;Rückgabewert als Zahl
  RGBhex.s      ;oder als String
  
EndStructure

EnableExplicit

Global farbEinsteller.FarbEinsteller

Macro SetHex(x,y)
  RSet(Hex(x),y,"0")
EndMacro

Procedure myFarbEinstellerCallback(hwnd, msg, wParam, lParam) 
Protected result = #PB_ProcessPureBasicEvents 
Protected point.point, pp.f
Static flag

With farbEinsteller
   
   If msg = #WM_HSCROLL
      
      GetCursorPos_(point)
      ScreenToClient_(lparam, point)
      pp = (point\x - 7) / farbEinsteller\tracktic ; Justage ist hier -7
      
          If lparam = GadgetID(\tracknr[1]): SetGadgetState(\tracknr[1], pp)
      ElseIf lparam = GadgetID(\tracknr[2]): SetGadgetState(\tracknr[2], pp)
      ElseIf lparam = GadgetID(\tracknr[3]): SetGadgetState(\tracknr[3], pp)
      EndIf          
      
   ElseIf msg = #WM_NCLBUTTONDBLCLK And wParam = #HTCAPTION
      Select flag 
         Case 0
            flag = 1
            StickyWindow(\window, 0) 
            StatusBarText(0, 1, "StickyWindow: off")
            
         Case 1
            flag = 0
            StickyWindow(\window, 1)
            StatusBarText(0, 1, "StickyWindow: on")   
            
      EndSelect
   EndIf     

EndWith
ProcedureReturn result
EndProcedure 

Procedure myFarbEinstellerToolTip()

With farbEinsteller
    
    GadgetToolTip(\textHex[1], "rot, Hexwert, Klick = minus 16") 
    GadgetToolTip(\charLks[1], "rot, Klick = minus 1") 
    GadgetToolTip(\charRts[1], "rot, Klick = plus 1") 
    GadgetToolTip(\textDez[1], "rot, Dezimalwert, Klick = plus 16") 
    
    GadgetToolTip(\textHex[2], "grün, Hexwert, Klick = minus 16") 
    GadgetToolTip(\charLks[2], "grün, Klick = minus 1") 
    GadgetToolTip(\charRts[2], "grün, Klick = plus 1") 
    GadgetToolTip(\textDez[2], "grün, Dezimalwert, Klick = plus 16") 
    
    GadgetToolTip(\textHex[3], "blau, Hexwert, Klick = minus 16") 
    GadgetToolTip(\charLks[3], "blau, Klick = minus 1") 
    GadgetToolTip(\charRts[3], "blau, Klick = plus 1") 
    GadgetToolTip(\textDez[3], "blau, Dezimalwert, Klick = plus 16") 
    
    GadgetToolTip(\textHex[4], "Hexwert 24 Bit, Klick = alle minus 16") 
    GadgetToolTip(\textDez[4], "Dezimalwert 24 Bit, Klick = alle plus 16") 
    GadgetToolTip(\textHex[5], "Hexwert RGB, Klick = Hex to Clipboard") 
    GadgetToolTip(\textDez[5], "Dezimalwert RGB, Klick = Dez to Clipboard") 

    GadgetToolTip(\imgnr2, "mit F5 Farbwert der Mausposi holen, FarbEinsteller muß den Focus haben") 
    
EndWith

EndProcedure

Procedure myFarbEinstellerIni()

With farbEinsteller

  \zr = 5
  \hh = 20
  \tbr1 = 26
  \tbr2 = 15
  \tbr3 = 56
  
  \trackbr = 500 - (4*\zr) - (2*\tbr1) - (2*\tbr2) - 4
  \imagebr = 500 - (4*\zr) - (2*\tbr3) - \zr
  
  \zeile[1] = \zr + 1
  \zeile[2] = \zeile[1] + \zr + \hh
  \zeile[3] = \zeile[2] + \zr + \hh
  \zeile[4] = \zeile[3] + \zr + \hh
  \zeile[5] = \zeile[4] + \zr + \hh
  
  \conhh = \zeile[5] + \hh + \zr + \zr
    
  \spalte[1] = \zr
  \spalte[2] = \spalte[1] + \tbr1
  \spalte[3] = \spalte[2] + \tbr2 + \zr 
  \spalte[4] = \spalte[3] + \trackbr + \zr
  \spalte[5] = \spalte[4] + \tbr2
  \spalte[6] = \spalte[1] + \tbr3 + \zr
  \spalte[7] = \spalte[6] + \imagebr + \zr 
  
  \conbr = \spalte[7] + \tbr3 + \zr + \zr
  
  \connr = ContainerGadget(#PB_Any,\consp,\conze,\conbr,\conhh,#PB_Container_Double)
      
  ;die Container BackColor 
  If \confb = 0: \confb = $DBDBDB: EndIf 
  SetGadgetColor(\connr, #PB_Gadget_BackColor, \confb)
    
    ;rot
    \textHex[1] = TextGadget    (#PB_Any, \spalte[1], \zeile[1], \tbr1,   \hh, "0",  #WS_DLGFRAME|#SS_NOTIFY) 
    \charLks[1] = TextGadget    (#PB_Any, \spalte[2], \zeile[1], \tbr2,   \hh, "R",  #WS_DLGFRAME|#SS_NOTIFY) 
    \tracknr[1] = TrackBarGadget(#PB_Any, \spalte[3], \zeile[1], \trackbr,\hh, 0, 255) 
    \charRts[1] = TextGadget    (#PB_Any, \spalte[4], \zeile[1], \tbr2,   \hh, "R",  #WS_DLGFRAME|#SS_NOTIFY) 
    \textDez[1] = TextGadget    (#PB_Any, \spalte[5], \zeile[1], \tbr1,   \hh, "0",  #WS_DLGFRAME|#SS_NOTIFY) 
    
    ;grün
    \textHex[2] = TextGadget    (#PB_Any, \spalte[1], \zeile[2], \tbr1,   \hh, "0",  #WS_DLGFRAME|#SS_NOTIFY) 
    \charLks[2] = TextGadget    (#PB_Any, \spalte[2], \zeile[2], \tbr2,   \hh, "G" , #WS_DLGFRAME|#SS_NOTIFY) 
    \tracknr[2] = TrackBarGadget(#PB_Any, \spalte[3], \zeile[2], \trackbr,\hh, 0, 255) 
    \charRts[2] = TextGadget    (#PB_Any, \spalte[4], \zeile[2], \tbr2,   \hh, "G",  #WS_DLGFRAME|#SS_NOTIFY) 
    \textDez[2] = TextGadget    (#PB_Any, \spalte[5], \zeile[2], \tbr1,   \hh, "0",  #WS_DLGFRAME|#SS_NOTIFY) 

    ;blau
    \textHex[3] = TextGadget    (#PB_Any, \spalte[1], \zeile[3], \tbr1,   \hh, "0",  #WS_DLGFRAME|#SS_NOTIFY) 
    \charLks[3] = TextGadget    (#PB_Any, \spalte[2], \zeile[3], \tbr2,   \hh, "B",  #WS_DLGFRAME|#SS_NOTIFY) 
    \tracknr[3] = TrackBarGadget(#PB_Any, \spalte[3], \zeile[3], \trackbr,\hh, 0, 255) 
    \charRts[3] = TextGadget    (#PB_Any, \spalte[4], \zeile[3], \tbr2,   \hh, "B",  #WS_DLGFRAME|#SS_NOTIFY) 
    \textDez[3] = TextGadget    (#PB_Any, \spalte[5], \zeile[3], \tbr1,   \hh, "0",  #WS_DLGFRAME|#SS_NOTIFY) 
    
    \tracktic = (\trackbr - 13) / 256  ; Justage ist hier 13 für Rand vom Trackbar, 256 ist maxwert 0 bis 255
    
      SetGadgetColor(\charLks[1],#PB_Gadget_FrontColor,#Red)
      SetGadgetColor(\charLks[2],#PB_Gadget_FrontColor,$B000) ;#Green
      SetGadgetColor(\charLks[3],#PB_Gadget_FrontColor,#Blue)
      SetGadgetColor(\charRts[1],#PB_Gadget_FrontColor,#Red)
      SetGadgetColor(\charRts[2],#PB_Gadget_FrontColor,$B000) ;#Green
      SetGadgetColor(\charRts[3],#PB_Gadget_FrontColor,#Blue)
    
    ;untere Buttons
    \textHex[4] = TextGadget(#PB_Any, \spalte[1], \zeile[4], \tbr3, \hh, "$000000",#WS_DLGFRAME|#SS_NOTIFY) 
    \textDez[4] = TextGadget(#PB_Any, \spalte[7], \zeile[4], \tbr3, \hh, "0"      ,#WS_DLGFRAME|#SS_NOTIFY) 
    \textHex[5] = TextGadget(#PB_Any, \spalte[1], \zeile[5], \tbr3, \hh, "$000000",#WS_DLGFRAME|#SS_NOTIFY) 
    \textDez[5] = TextGadget(#PB_Any, \spalte[7], \zeile[5], \tbr3, \hh, "0"      ,#WS_DLGFRAME|#SS_NOTIFY) 

    \img1   = CreateImage(#PB_Any, \imagebr, \hh-2) 
    \img2   = CreateImage(#PB_Any, \imagebr, \hh-2) 
    \imgnr1 = ImageGadget(#PB_Any, \spalte[6]-2, \zeile[4],0,0,ImageID(\img1),#PB_Image_Border) 
    \imgnr2 = ImageGadget(#PB_Any, \spalte[6]-2, \zeile[5],0,0,ImageID(\img2),#PB_Image_Border) 
    
EndWith

myFarbEinstellerToolTip()

EndProcedure

Procedure myFarbEinstellerState() 
  
With farbEinsteller
   
  Select \wButton 
    
    ;rot
    Case \tracknr[1], \textHex[1], \textDez[1], \charLks[1], \charRts[1]
      
        \r = GetGadgetState(\tracknr[1]) 
                
        Select \wButton
            Case \tracknr[1]
            Case \textHex[1]: \r - 16
            Case \textDez[1]: \r + 16
            Case \charLks[1]: \r - 1
            Case \charRts[1]: \r + 1
            
        EndSelect
      
        SetGadgetState(\tracknr[1], \r) 
        SetGadgetText(\textHex[1], SetHex(\r,2)) 
        SetGadgetText(\textDez[1], Str(\r)) 
        SetGadgetText(\textHex[4], "$0000" + SetHex(\r,2)) 
        SetGadgetColor(\textHex[4],#PB_Gadget_FrontColor,#Red)
        \farbwert = \r
    
    ;grün
    Case \tracknr[2], \textHex[2], \textDez[2], \charLks[2], \charRts[2]
      
        \g = GetGadgetState(\tracknr[2]) 
        Select \wButton
            Case \tracknr[2]
            Case \textHex[2]: \g - 16
            Case \textDez[2]: \g + 16
            Case \charLks[2]: \g - 1
            Case \charRts[2]: \g + 1            
        EndSelect
      
        SetGadgetState(\tracknr[2], \g) 
        SetGadgetText(\textHex[2], SetHex(\g,2)) 
        SetGadgetText(\textDez[2], Str(\g)) 
        SetGadgetText(\textHex[4], "$00" + SetHex(\g,2)+"00") 
        SetGadgetColor(\textHex[4],#PB_Gadget_FrontColor,$B000) ;#Green
        \farbwert = \g << 8
    
    ;blau
    Case \tracknr[3], \textHex[3], \textDez[3], \charLks[3], \charRts[3]
      
        \b = GetGadgetState(\tracknr[3]) 
        Select \wButton
            Case \tracknr[3]
            Case \textHex[3]: \b - 16
            Case \textDez[3]: \b + 16
            Case \charLks[3]: \b - 1
            Case \charRts[3]: \b + 1            
        EndSelect
      
        SetGadgetState(\tracknr[3], \b) 
        SetGadgetText (\textHex[3], SetHex(\b,2)) 
        SetGadgetText (\textDez[3], Str(\b)) 
        SetGadgetText (\textHex[4], "$" + SetHex(\b,2) + "0000") 
        SetGadgetColor(\textHex[4], #PB_Gadget_FrontColor, #Blue)
        \farbwert = \b << 16
    
    ;rgb 
    Case \textHex[4], \textDez[4]
      
        \r = GetGadgetState(\tracknr[1]) 
        \g = GetGadgetState(\tracknr[2]) 
        \b = GetGadgetState(\tracknr[3]) 
        
        If \wButton = \textHex[4]
          \r - 16: \g - 16: \b - 16
        Else
          \r + 16: \g + 16: \b + 16
        EndIf         
        
        SetGadgetState(\tracknr[1], \r) 
        SetGadgetState(\tracknr[2], \g) 
        SetGadgetState(\tracknr[3], \b) 
        
        SetGadgetText(\textHex[1], SetHex(\r,2)) 
        SetGadgetText(\textHex[2], SetHex(\g,2)) 
        SetGadgetText(\textHex[3], SetHex(\b,2)) 

        SetGadgetText(\textDez[1], Str(\r)) 
        SetGadgetText(\textDez[2], Str(\g)) 
        SetGadgetText(\textDez[3], Str(\b)) 

        SetGadgetText(\textHex[4], "$"+SetHex(\b,2) + "0000") 
        SetGadgetColor(\textHex[4],#PB_Gadget_FrontColor,#Blue)
        \farbwert = \b << 16

     Case \textHex[5]: SetClipboardText(GetGadgetText(\textHex[5]))
                       ;\eventid = #PB_Event_CloseWindow
        
    Case \textDez[5]: SetClipboardText(GetGadgetText(\textDez[5]))
                      ;\eventid = #PB_Event_CloseWindow
    
    Default: ProcedureReturn -1 ;oder null etc. also tue nix
  
  EndSelect 
    
  SetGadgetText(\textDez[4], StrU(\farbwert,#PB_Long)) 
  
  \RGBwert = (\b << 16) | (\g << 8) | (\r)
  \RGBhex  = Hex(\RGBwert)

  SetGadgetText(\textHex[5], "$"+SetHex(\b,2)+SetHex(\g,2)+SetHex(\r,2)) 
  SetGadgetText(\textDez[5], StrU(\RGBwert,#PB_Long)) 

  StartDrawing(ImageOutput(\img1)) 
    ;Box(0, 0,         \imagebr, \hh, \confb) 
    Box(0, 0,         \imagebr, \hh/3, \r) 
    Box(0, 1*(\hh/3), \imagebr, \hh/3, \g << 8) 
    Box(0, 2*(\hh/3), \imagebr, \hh/3, \b << 16) 
  StopDrawing() 
  SetGadgetState(\imgnr1,ImageID(\img1)) 

  StartDrawing(ImageOutput(\img2)) 
    Box(0, 0, \imagebr, \hh, \RGBwert) 
    DrawingMode(#PB_2DDrawing_Transparent)
    FrontColor(~ \RGBwert & $FFFFFF)  ;invertiert die Farbe
    DrawText(0,2,"RGB")
  StopDrawing() 
  SetGadgetState(\imgnr2,ImageID(\img2)) 
  
  ProcedureReturn \RGBwert

EndWith

EndProcedure 

Procedure myFarbEinstellerSet()

With farbEinsteller
    
   \r = Red(\wfarbe)
      SetGadgetState(\tracknr[1],\r)
      \wButton = \tracknr[1]
      myFarbEinstellerState()
      
   \g = Green(\wfarbe)
      SetGadgetState(\tracknr[2],\g)
      \wButton = \tracknr[2]
      myFarbEinstellerState()
      
   \b = Blue(\wfarbe)
      SetGadgetState(\tracknr[3],\b)
      \wButton = \tracknr[3]
      myFarbEinstellerState()

EndWith

EndProcedure

Procedure GetColorUnderMouse() 
Protected cursorPos.POINT
Protected hDC = GetDC_(0)

GetCursorPos_(cursorPos) 
   
Protected farbe = GetPixel_(hDC, cursorPos\x, cursorPos\y) 
ReleaseDC_(0, hDC) 

ProcedureReturn farbe
EndProcedure 

;===============================

With farbEinsteller
   
   \window = OpenWindow(#PB_Any, 220, 220, 0, 0, " FarbEinsteller by HJBremer", #PB_Window_SystemMenu)  
   SetWindowLongPtr_(WindowID(\window), #GWL_EXSTYLE, #WS_EX_TOOLWINDOW)
   
   CreateStatusBar(0, WindowID(\window))
      AddStatusBarField(#PB_Ignore)
      AddStatusBarField(#PB_Ignore)
      StatusBarText(0, 0, "F5 = GetColorUnderMouse", #PB_StatusBar_Center)
      StatusBarText(0, 1, "DoppelClick auf Titelleiste = StickyWindow on/off")
   
   AddKeyboardShortcut(\window, #PB_Shortcut_F5, #PB_Shortcut_F5)
   AddKeyboardShortcut(\window, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
    
   \wFarbe = GetColorUnderMouse()
   
   myFarbEinstellerIni() 
   myFarbEinstellerSet()      
       
   ResizeWindow(\window,#PB_Ignore,#PB_Ignore,\conbr,\conhh + StatusBarHeight(0))
    
   StickyWindow(\window, 1)
      
   SetWindowCallback(@myFarbEinstellerCallback()) 
    
   Repeat: \EventID = WaitWindowEvent() ;:Debug \eventid
     
        If \EventID = #PB_Event_Gadget Or \EventID = #PB_Event_Menu 
                      
           \wButton = EventGadget() 
            
           Select \wButton
            
            Case #PB_Shortcut_Escape: Break   
                  
            Case #PB_Shortcut_F5: 
                 \wFarbe = GetColorUnderMouse(): myFarbEinstellerSet()                     
            
            Default: myFarbEinstellerState()
            
           EndSelect
                      
        EndIf
  
   Until \EventID = #PB_Event_CloseWindow 

   CloseWindow(\window)

EndWith
                          
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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: FarbEinsteller

Beitrag von STARGÅTE »

Also irgendwie werden die Events vollkommen falsch bearbeitet!

Wenn ich ein TrackBar Gadget anklicke und dann versuche mit den Pfeiltasten den Regler zu verschieben passiert garnix, stattdessen springt der Regler immer zur Maus ... /:->
Genauso gilt das für ScrollRad der Maus.
Mir ist klar das man eigentlich auf diese [R] klicken soll für +1 oder -1 in der Farbe, aber ich bin ehr Tastaturfixiert.
Und das hineinklicken mit der Maus in die TrackBar, den Regler an genau diese Positon schiebt, was ja eigentlich im normalfall nicht der fall ist.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: FarbEinsteller

Beitrag von hjbremer »

STARGÅTE hat geschrieben:Also irgendwie werden die Events vollkommen falsch bearbeitet!
Dann entfernst du halt die #HScroll Abteilung im Callback, und alles ist beim Trackbargadget wie sonst. Mich nervt hingegen das Standard Verhalten.
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
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

Re: FarbEinsteller

Beitrag von ts-soft »

:allright:
Darf man das frei in einer Freeware verwenden?

Gruß
Thomas

// Nachtrag:
Beim klicken wird 255 überschritten, da fehlt eine Überprüfung!
// Nachtrag2:
Der Fehler kommt durch Unicode :mrgreen:
r g b nach .a geändert, jetzt funktioniert es.
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

Re: FarbEinsteller

Beitrag von hjbremer »

jeder darf alles damit machen, was er will, dafür stelle ich es hier ein :D
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