SetGadgetColor enttäuschend!

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

SetGadgetColor enttäuschend!

Beitrag 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 :-(
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

weiß nicht warum, ist aber Windows-seitig so, ging unter VB auch nicht.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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.
Zuletzt geändert von bobobo am 12.07.2006 16:52, insgesamt 1-mal geändert.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag 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:
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag 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? ;)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag 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...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
pankgraf
Beiträge: 29
Registriert: 10.07.2006 21:36
Wohnort: Berlin
Kontaktdaten:

Colorierte Buttons

Beitrag 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
Benutzeravatar
shadow
Beiträge: 189
Registriert: 23.03.2005 17:52
Wohnort: Lübeck

Beitrag 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.
Gesperrt