Seite 1 von 2

Hintergrundfarbe aller Gadgets im Container ändern

Verfasst: 20.02.2014 16:30
von SBond
Hi Leute,

...tja ich habe mal wieder ein Problem ^^
Ich möchte gerne die Hintergrundfarbe alle Gadgets innerhalb eines Containers anpassen, so dass diese die gleiche Farbe wie der Containers haben.
In meinem Fall wird die Hintergrundfarbe weiß sein und es soll so aussehen, wie in einem PanelGadget (letztes Beispiel). Allersings soll es kein PanelGadget sein, sondern ein ContainerGadget.

SetGadgetColor() und SetWindowColor() helfen da scheinbar gar nicht weiter.


Bild

Code: Alles auswählen

OpenWindow(0, 0, 0, 740, 220, "ContainerGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ContainerGadget		( 0,  20, 20, 220, 180)
	FrameGadget		( 1,  10, 15, 200, 130, 	"Test")
	ButtonGadget	( 2,  20, 40, 80,   24, 	"Button 1")
	TextGadget		( 3,  20, 80, 80,   18, 	"Text")
	PanelGadget		( 4, 120, 40, 70,   80)
	AddGadgetItem 	( 4, -1, "Test")
	CloseGadgetList		()
CloseGadgetList		()
SetGadgetColor		(0, #PB_Gadget_BackColor, $FFFFFF)


PanelGadget 		( 5, 260, 20, 220, 180)
	FrameGadget		( 6,  10, 15, 200, 130, 	"Test")
	ButtonGadget	( 7,  20, 40, 80,   24, 	"Button 1")
	TextGadget		( 8,  20, 80, 80,   18, 	"Text")
	PanelGadget		( 9, 120, 40, 70,   80)
	AddGadgetItem 	( 9, -1, "Test")
	CloseGadgetList		()
CloseGadgetList		()


PanelGadget 		(10,  500, 20, 220, 180)
AddGadgetItem 		(10, -1, "")
	FrameGadget		(11,  10, 15, 200, 130, 	"Test")
	ButtonGadget	(12,  20, 40, 80,   24, 	"Button 1")
	TextGadget		(13,  20, 80, 80,   18, 	"Text")
	PanelGadget		(14, 120, 40, 70,   80)
	AddGadgetItem 	(14, -1, "Test")
	CloseGadgetList		()
CloseGadgetList		()
	
Repeat: Until WaitWindowEvent() = #PB_Event_CloseWindow
Weiß einer von euch Rat?

viele Grüße
SBond

Re: Hintergrundfarbe aller Gadgets im Container ändern

Verfasst: 21.02.2014 11:50
von Chimorin
Ich habe da mal ein bisschen rumgeforscht, bin aber nicht weit gekommen.
Ich habe gelesen, dass man bei den "alten" Buttons die Hintergrundfarbe nicht ändern kann.

Hier ist mal, was ich fabriziert habe. Malt eigentlich nur den Hintergrund des Fensters an.

Code: Alles auswählen

EnableExplicit


Define.i Event, Quit


#GCLP_HBRBACKGROUND = -10
#Fenster = 0


Enumeration
  #Button
  #Frame
  #Panel
EndEnumeration


Procedure SetGdgtClr1(hWnd.i, farbe.i)
  Protected.i g_hbBarva
  
  
  InvalidateRect_(hWnd, 0, #True)
  g_hbBarva = CreateSolidBrush_(farbe)
  SetClassLongPtr_(hWnd, #GCLP_HBRBACKGROUND, g_hbBarva)
EndProcedure


Procedure SetGdgtClr2(hdc.i, farbe.i)
  SetBkColor_(hdc, farbe)
  SetBkMode_(hdc, 1)       ;OPAQUE(2) OR TRANSPARENT(1)
EndProcedure


If OpenWindow(#Fenster, 100, 200, 500, 500, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  ButtonGadget(#Button, 100, 100, 50, 50, "Hi")
  FrameGadget(#Frame, 10, 10, 200, 200, "Hi")
  PanelGadget(#Panel, 200, 200, 200, 200)
  
  SetGdgtClr1(WindowID(#Fenster), RGB(30, 50, 60))
  SetGdgtClr1(GadgetID(#Button), RGB(30, 50, 60))
  SetGdgtClr1(GadgetID(#Panel), RGB(30, 50, 60))
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf
    
  Until Quit = 1
  
EndIf

End   ; All the opened windows are closed automatically by PureBasic

Dies kommt aus RSBasics WINAPI-Library und wurde von ts-soft erstellt:

Code: Alles auswählen

;Autor: ts-soft
;Ab Vista

EnableExplicit

Define Event
Global color = CreateSolidBrush_($FF0000)

Procedure myCallback(hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #WM_CTLCOLORBTN
      If lparam = GadgetID(1)
        SetBkMode_(wParam, #TRANSPARENT)
        SetTextColor_(wParam, $000000)
        ProcedureReturn color
      EndIf
  EndSelect
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

#BS_COMMANDLINK  = $0000000E

If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  ButtonGadget(1, 10, 10, 150, 58, "Step Back", #BS_COMMANDLINK)
  
  SetWindowCallback(@myCallback())
  
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_CloseWindow
      DeleteObject_(color)
      End
    EndIf
  ForEver
EndIf
; IDE Options = PureBasic 4.60 (Windows - x86)
; CursorPosition = 1
; Folding = -
; EnableXP

Re: Hintergrundfarbe aller Gadgets im Container ändern

Verfasst: 21.02.2014 14:04
von SBond
schade eigentlich. Ich habe ein wenig gehofft, dass es mit WinAPI möglich ist. Auch wenn ich mit WinAPI und Callback-Funktionen immernoch Probleme habe ^^.
Ich finde aber auch irgendwie keine Lösung in den Foren :(.

Re: Hintergrundfarbe aller Gadgets im Container ändern

Verfasst: 21.02.2014 17:38
von Bisonte
Falls nicht ausgefallene Gadgets benutzt werden sollen, sondern z.B. "nur" Buttons, Text, Container, Image usw.
kann dir evt. das CanvasGadget dienlich sein. Buttons oder TextGadgets sind damit sehr einfach zu realisieren
und das Aussehen der Gadgets ist dann eigenes Gusto ...

Bei etwas komplizierteren Gadgets wie ListIcon oder EditorGadget wirds schon etwas komplizierter, aber diese
bekommt man auch ohne Ränder hin ....

Re: Hintergrundfarbe aller Gadgets im Container ändern

Verfasst: 21.02.2014 18:53
von hjbremer
So was ?

Code: Alles auswählen

Enumeration
   #win
   #cont
   #frame
   #button
   #text
   #panel   
EndEnumeration

#backcolor = $DFFFFF ;oder #white

Global oldPanelWProc
Global backColorBrush = CreateSolidBrush_(#backcolor)

Procedure WindowCallback(hWnd, msg, wParam, lParam)
   
   Protected result = #PB_ProcessPureBasicEvents   
   Protected *drawitem.DRAWITEMSTRUCT, paneltabtext.s
   
   Select msg
      Case #WM_CLOSE
         DeleteObject_(backColorBrush) ;Brush löschen bei Progende
         
      Case #WM_CTLCOLORSTATIC              
         Select GetDlgCtrlID_(lparam)  ;holt Purebasic Gadgetnummer
            Case #frame, #text               
               SetBkMode_(wParam, #TRANSPARENT) ;wParam ist das DC
               ProcedureReturn backColorBrush
         EndSelect
         
      Case #WM_DRAWITEM
         *drawitem.DRAWITEMSTRUCT = lParam
         With *drawitem
            If \CtlType = #ODT_TAB	   ;ist es ein Panelgadget ?
               If wParam = #panel      ;ist es das richtige Panel
                  ;hier wird jedes PanelTab eingefärbt und der Text geschrieben
                  FillRect_(\hDC, \rcItem, backColorBrush)
                  SetBkMode_(\hDC, #TRANSPARENT)
                  paneltabtext = GetGadgetItemText(#panel, \itemID) 
                  \rcItem\top + 4
                  \rcItem\left + 4
                  TextOut_(\hDC, \rcItem\left, \rcItem\top, paneltabtext, Len(paneltabtext)) 
               EndIf
               ProcedureReturn #True
            EndIf
         EndWith
                  
   EndSelect
   
   ProcedureReturn result
EndProcedure

Procedure PanelProc(hWnd, msg, wParam, lParam)
   ;hier wird der Background des ganzen Panelgadgets eingefärbt   
   Protected rect.Rect
   
   Select msg
      Case #WM_ERASEBKGND
         GetClientRect_(hWnd, rect)
         FillRect_(wParam, rect, backColorBrush)
         ProcedureReturn #True
   EndSelect
   
   ProcedureReturn CallWindowProc_(oldPanelWProc, hWnd, msg, wParam, lParam)
EndProcedure


OpenWindow(#win, 0, 0, 740, 220, "ContainerGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ContainerGadget(#cont, 20, 20, 420, 180, #PB_Container_Double)
FrameGadget    (#frame, 10, 15, 400, 130, "Test")
ButtonGadget   (#button, 20, 40, 80, 24, "Button 1")
TextGadget     (#text, 20, 80, 80, 18, "Text")
PanelGadget    (#panel, 150, 40, 200, 80)
AddGadgetItem  (#panel, -1, "Test1 blabla")
AddGadgetItem  (#panel, -1, "Test2")
CloseGadgetList()
CloseGadgetList()

SetGadgetColor(#cont, #PB_Gadget_BackColor, #backcolor)

SetWindowCallback(@WindowCallback())

;old Panel Proc + Style
oldPanelWProc = GetWindowLongPtr_(GadgetID(#panel), #GWL_WNDPROC)
oldPanelStyle = GetWindowLongPtr_(GadgetID(#panel), #GWL_STYLE)

;new Panel Proc + Style
SetWindowLongPtr_(GadgetID(#panel), #GWL_WNDPROC, @PanelProc())
SetWindowLongPtr_(GadgetID(#panel), #GWL_STYLE, #TCS_OWNERDRAWFIXED | oldPanelStyle)


Repeat: Until WaitWindowEvent() = #PB_Event_CloseWindow

Re: Hintergrundfarbe aller Gadgets im Container ändern

Verfasst: 22.02.2014 12:27
von SBond
sieht schon sehr gut aus :)

...ich werde mich definitiv mal näher mit den WinAPI und den Callbacks beschäftigen müssen. Mal sehen ob ich etwas Einsteigerfreundliches finde :D

danke euch ;)

Re: Hintergrundfarbe aller Gadgets im Container ändern

Verfasst: 22.02.2014 13:04
von edel
Als Buch kann ich dir das hier empfehlen
http://www.amazon.de/Windows-Programmie ... es+Petzold

Warum das allerdings so teuer ist... Das Buch gab es schon unter 30€.

Re: Hintergrundfarbe aller Gadgets im Container ändern

Verfasst: 22.02.2014 14:17
von hjbremer
Stimmt, meins hat mal 29.90 euro gekostet

es werden zwar C Beispiele gebracht, diese sind aber relativ leicht mit PB umzusetzen
man sollte sich aber nicht zu viel erhoffen, es geht hauptsächlich um Grundlagen.

Billiger ist es sich die Beispiele hier im Forum anzusehen und bei Bedarf in der MSDN nach zulesen.

Re: Hintergrundfarbe aller Gadgets im Container ändern

Verfasst: 22.02.2014 14:28
von ts-soft
Ich hab den Originalpreis bezahlt, 59,90€ :(
Naja, im Fachbuchhandel (Hugendübel) sollte man nicht kaufen :mrgreen:

Überzeugt hat mich das Buch aber auch nicht, recht langweilig geschrieben und
das was man braucht, findet man meist nicht.

Re: Hintergrundfarbe aller Gadgets im Container ändern

Verfasst: 22.02.2014 15:02
von edel
Wer sich mit WinAPI beschaeftigt will, findet mit dem Buch einen sehr guten Einstieg.
Von Langeweile kann hier ueberhaupt nicht die Rede sein, sicher das du hier nicht dein "shades of grey" meinst? :twisted:
Das in einem Buch von 1999 keine Windows 8 Funktionen enthalten sind, sollte auch klar sein.