Hintergrundfarbe aller Gadgets im Container ändern

Für allgemeine Fragen zur Programmierung mit PureBasic.
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Hintergrundfarbe aller Gadgets im Container ändern

Beitrag 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
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: Hintergrundfarbe aller Gadgets im Container ändern

Beitrag 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
Bild

- formerly known as Bananenfreak -
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Hintergrundfarbe aller Gadgets im Container ändern

Beitrag 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 :(.
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Hintergrundfarbe aller Gadgets im Container ändern

Beitrag 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 ....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Hintergrundfarbe aller Gadgets im Container ändern

Beitrag 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
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
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Hintergrundfarbe aller Gadgets im Container ändern

Beitrag 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 ;)
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Hintergrundfarbe aller Gadgets im Container ändern

Beitrag 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€.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Hintergrundfarbe aller Gadgets im Container ändern

Beitrag 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.
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: Hintergrundfarbe aller Gadgets im Container ändern

Beitrag 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.
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
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Hintergrundfarbe aller Gadgets im Container ändern

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