Seite 1 von 4

SetGadgetColor enttäuschend!

Verfasst: 12.07.2006 13:12
von Delle
Hallo,

wieso kann man den Hintergrund eines Buttons nicht einfärben,
die anderen ganzen (unwichtigen) Gadgets aber schon?

Verstehe nicht, warum ausgerechnet der Button ausgelassen
wurde.

Jetzt muss ja doch wieder PureCOLOR herhalten :-(

Verfasst: 12.07.2006 13:32
von Kaeru Gaman
weiß nicht warum, ist aber Windows-seitig so, ging unter VB auch nicht.

Verfasst: 12.07.2006 13:44
von bobobo
Es gibt dafür eigentlich extra die ImageKnöppe

Aber was wirklich enttäuschend ist, dass es in Pb nicht die Funktion
PB_Mach_Mir_Mal_Die_Ultralgeile_Anwendung_Aber_Zack_Zack()
gibt.

Verfasst: 12.07.2006 16:43
von Laurin
bobobo hat geschrieben:Aber was wirklich enttäuschend ist, dass es in Pb nicht die Funktion
PB_Mach_Mir_Mal_Die_Ultralgeile_Anwenung_Aber_Zack_Zack()
gibt.
Siehe meine Signatur :mrgreen:

Verfasst: 12.07.2006 16:50
von Delle
Kaeru Gaman hat geschrieben:weiß nicht warum, ist aber Windows-seitig so, ging unter VB auch nicht.
Warum geht's dann aber mit PureCOLOR? ;)

Verfasst: 12.07.2006 16:53
von Kaeru Gaman
> Warum geht's dann aber mit PureCOLOR?

hab ich löcher in den händen?

ich hab nicht den blassesten, was PureCOLOR überhaupt ist.
und ich weiß auch nicht, wie es das macht.

aber es ist mAn kein einfaches ändern eines Objektparameters,
wie das bei anderen Gadgets der Fall ist.

Verfasst: 12.07.2006 16:55
von Delle
PureCOLOR ist eine relative bekannte UserLib zum Einfärben von fast allen Gadgets.

Soweit ich weiß, wird grob per API irgendwie ein Brush erzeugt und dann auf den Button gelegt oder sowas in der Art...

Verfasst: 12.07.2006 16:59
von Kaeru Gaman
> eine relative bekannte UserLib

ich benutze keine Userlibs.


> per API irgendwie ein Brush erzeugt und dann auf den Button gelegt

joah, so brush-geschichten hab ich schon mal gesehen, und dass das mit API-funktionen geht, ist klar.
aber wie ich sagte: es ist nicht das simple ändern eines Registers, wie bei anderen Gadgets.
SetGadgetColor() tut aber nichts anderes, als diesen Wert zu ändern.
Wenn das Buttongadget diese funktion nun mal nicht unterstützt,
kann SetGadgetColor() das auch nicht leisten, und man braucht ein API-workaround.

Colorierte Buttons

Verfasst: 14.07.2006 06:22
von pankgraf
Kaeru Gaman hat geschrieben:ich benutze keine Userlibs.
Eine Userlib braucht es nicht, denn für diesen Zweck (frei nach bobobo)
gibt es dafür eigentlich extra die ImageKnöppe.
Die Idee ButtonImageGadget´s zu verwenden, wurde schon von vielen Foren-Autoren praktiziert und funktioniert ausgezeichnet. Beispiel:

Code: Alles auswählen

;- Beginn 
Enumeration
  #Window_0 : #Button_0 : #Button_1 : #Button_2 : #Button_3 : #Button_4
  #Gadget_5 : #Gadget_6 : #Gadget_7 : #Shortcut_0 : #Shortcut_1 
EndEnumeration

#ButtonStart = 99
Enumeration #ButtonStart + 1
  #Knopf_0 : #Knopf_1 : #Knopf_2 : #Knopf_3
EndEnumeration 

gold = RGB(255,215,0) : forest = RGB(34,139,34) : royal = RGB(60, 150, 200)
kingblue = RGB(60,15,255) : orange = RGB(205,133,0) : pink = RGB(139,10,80)
chartreuse = RGB(127,255,0) : gelb = RGB(253,250,150) : roetlich = RGB(255,48,48)

;- Prozeduren

Procedure.l MyLabeledImage(ImageNumber,width,height,Color,Datei$,Schrift) 
  ImageID = CreateImage(ImageNumber,width,height) 
  If StartDrawing(ImageOutput(ImageNumber)) : Box(0,0,width,height,Color) 
    Select Schrift ; Anzahl der Schriften kann vergrößert werden 
      Case 0 : FrontColor(RGB(255,215,0)) 
      Case 1 : FrontColor(RGB(255,48,48)) 
      Case 2 : FrontColor(RGB(0,0,51)) 
      Case 3 : FrontColor(RGB(128,0,0)) 
      Case 4 : FrontColor(RGB(34,139,34)) 
      Case 5 : FrontColor(RGB(60,150,200)) 
      Case 6 : FrontColor(RGB(255,255,255)) 
      Case 7 : FrontColor(RGB(139,10,80)) 
      Case 8 : FrontColor(RGB(60,15,255))  
    EndSelect
    DrawingFont(#PB_Default) : DrawingMode(1)
    If TextWidth(Datei$) < width : XPos = (width - TextWidth(Datei$)) / 2
    Else : XPos = 4
    EndIf
    If TextWidth("M") < height : YPos = (height - TextWidth("M")) / 2 - 2
    Else : YPos = 0
    EndIf : DrawText(XPos,YPos,Datei$) : StopDrawing()
  EndIf
  ProcedureReturn ImageID 
EndProcedure

Procedure ColoredButton(Nb,x,y,w,h,Datei$,ImageNumber,Color,i) 
  ButtonImageGadget(Nb,x,y,w,h,MyLabeledImage(ImageNumber,w,h,Color,Datei$,i)) 
EndProcedure

;- Main

hwnd = OpenWindow(#Window_0,0,0,200,250,"DefaultButton",#PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
  
If hwnd And CreateGadgetList(hwnd) 
  brush.l = CreateSolidBrush_(royal)
  SetClassLong_(hwnd,#GCL_HBRBACKGROUND,brush)
  ; ColoredButton(#Gadget, x, y, Breite, Hoehe, ImageID, Hintergrundfarbe, Schriftfarbe)
  ; ImageID braucht eine eigene ID (!), kann z. B. mit 1,2,3, ... usw.
  ; oder wie hier mit eigenen Konstanten (!) numeriert werden
  ColoredButton(#Button_0,5, 5,190,25,"Button_0",#Knopf_0,orange,7)
  ColoredButton(#Button_1,5,32,190,25,"Button_1",#Knopf_1,kingblue,4)
  ColoredButton(#Button_2,5,59,190,25,"Button_2",#Knopf_2,forest,2)
  ColoredButton(#Button_3,5,86,190,25,"Schließen (3)",4,gold,1) 
  ColoredButton(#Button_4,45,113,120,25,"Button_4",#Knopf_3,chartreuse,5) 
  StringGadget(#Gadget_5 ,5,140,190,20," StringGadget  5")
  TextGadget(#Gadget_6 ,5,162,190,20," TextGadget      6")
  ListViewGadget(#Gadget_7,5,184,190,65)
  AddGadgetItem(#Gadget_7, -1, "Das ist ListViewGadget 7") 
  SetGadgetColor(#Gadget_5, #PB_Gadget_FrontColor, royal)
  SetGadgetColor(#Gadget_5, #PB_Gadget_BackColor, gold)
  SetGadgetColor(#Gadget_6, #PB_Gadget_FrontColor, pink)
  SetGadgetColor(#Gadget_6, #PB_Gadget_BackColor, chartreuse)
  SetGadgetColor(#Gadget_7, #PB_Gadget_FrontColor, kingblue)
  SetGadgetColor(#Gadget_7, #PB_Gadget_BackColor, gelb) 
  SetActiveGadget(#Button_0) 
  AddKeyboardShortcut(#Window_0,#PB_Shortcut_Return,#Shortcut_0) 
  AddKeyboardShortcut(#Window_0,#PB_Shortcut_Escape,#Shortcut_1) 
  
  Repeat 
    event.l = WaitWindowEvent() : EventType.l = EventType()
    Tastendr.l = EventGadget()
    
    Select  event 
      Case #PB_Event_Menu  
        Select EventMenu() 
          Case #Shortcut_0 ; Return 
            AddGadgetItem(#Gadget_7,-1,"<Return> gedrückt") 
          Case #Shortcut_1 : event = #PB_Event_CloseWindow ; Escape
        EndSelect 
        EventType = #PB_EventType_LeftClick
    EndSelect 
    
    If EventType = #PB_EventType_LeftClick 
      Select Tastendr 
        Case #Button_0  
          SetGadgetText(#Gadget_5,"Konstante "+Str(#Button_0))
          SetGadgetText(#Gadget_6,"EventGadget "+Str(Tastendr))
          AddGadgetItem(#Gadget_7,-1,"Button 0 gedrückt") 
        Case #Button_1  
          SetGadgetText(#Gadget_5,"Konstante "+Str(#Button_1))
          SetGadgetText(#Gadget_6,"EventGadget "+Str(Tastendr))
          AddGadgetItem(#Gadget_7,-1,"Button 1 gedrückt") 
        Case #Button_2  
          SetGadgetText(#Gadget_5,"Konstante "+Str(#Button_2))
          SetGadgetText(#Gadget_6,"EventGadget "+Str(Tastendr))
          AddGadgetItem(#Gadget_7,-1,"Button 2 gedrückt") 
        Case #Button_3 : event = #PB_Event_CloseWindow
        Case #Button_4 
          SetGadgetText(#Gadget_5,"Pressed: 4")
          SetGadgetText(#Gadget_6,"Gedrückt: 4")
          AddGadgetItem(#Gadget_7,-1,"Button 4 gedrückt") 
      EndSelect
    EndIf : Delay(15)
    
  Until event = #PB_Event_CloseWindow 
  
EndIf 
;- Ende
End

Verfasst: 14.07.2006 08:46
von shadow
@Delle PureCOLOR verwendet bestimmt die WindowMessage-Callback. An die wird eine Nachricht WM_CTLCOLOR oder so ähnlich verschickt, und da kannst du individuell für jedes Steuerelement eine eigene Hinter- und Vordergundfarbe setzen. Also schon was für Experten oder diejenigen, die sich mit der WinAPI auskennen. Der Nachteil ist, dass das dann nicht auf anderen Betriebssystemen läuft. D. h. ich würde auch die ImageButtons bevorzugen.