Farbe der Panel Lasche verändern ???

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Nicht perfekt aber so in etwa wuerde ich es machen:

Code: Alles auswählen

Global oldCallback

Structure color
	backcolor.l
	forecolor.l
EndStructure	

Procedure SetPanelColor(id,state,color)
	Protected *c.color
	
	*c = GetWindowLong_(GadgetID(id),#GWL_USERDATA)
	
	If Not *c
		*c = AllocateMemory(SizeOf(color))
		*c\backcolor = GetSysColor_(#COLOR_MENU)
		*c\forecolor = GetSysColor_(#COLOR_WINDOWTEXT)
	EndIf 
	
	If state = 1	
		*c\backcolor = color
	ElseIf state = 2
		*c\forecolor = color
	EndIf 
		
	SetWindowLong_(GadgetID(id),#GWL_USERDATA,*c)	
	SetWindowPos_(GadgetID(id),0,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE|#SWP_FRAMECHANGED|#SWP_NOZORDER)
	
EndProcedure

;...Our subclassed PanelGadget events
Procedure myPGcallback(hwnd, msg, wParam, lParam)
  Protected *c.color
  Protected bc,fc
  Protected backbrush    
  
  result = CallWindowProc_(oldCallback, hwnd, msg, wParam, lParam)
  Select msg
    Case #WM_DRAWITEM
      *PGdis.DRAWITEMSTRUCT = lParam
      If *PGdis\CtlType = #ODT_TAB
      
      	*c.color = GetWindowLong_(*PGdis\hwndItem,#GWL_USERDATA)
      	
				If Not *c
					bc = GetSysColor_(#COLOR_MENU)
					fc = GetSysColor_(#COLOR_WINDOWTEXT)
				Else
					bc = *c\backcolor
					fc = *c\forecolor  	
				EndIf 
      	
      	backbrush = CreateSolidBrush_(bc)
      	      
        Select *PGdis\itemState          
          Case #ODS_SELECTED
            tabText$ = GetGadgetItemText(*PGdis\ctlid, *PGdis\itemID, 0)
            FillRect_(*PGdis\hdc, *PGdis\rcItem, backbrush)            
            SetTextColor_(*PGdis\hdc, fc)
            SetBkMode_(*PGdis\hdc, #TRANSPARENT)
            DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)
          Default            
            tabText$ = GetGadgetItemText(*PGdis\ctlid, *PGdis\itemID, 0)
            SetTextColor_(*PGdis\hdc, 0)
            SetBkMode_(*PGdis\hdc, #TRANSPARENT)            
            DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)
        EndSelect
        
        DeleteObject_(backbrush)
        
      EndIf
  EndSelect
  
  
  
  ProcedureReturn result
EndProcedure

If OpenWindow(0, 0, 0, 322, 280,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  PanelGadget(0, 8, 8, 306, 203)
  AddGadgetItem (0, -1, "Panel 1")
  ButtonGadget(1, 10, 30, 50, 20, "Hello")
  AddGadgetItem (0, -1,"Panel 2")
  ButtonGadget(2, 10, 30, 50, 20, "World")
  AddGadgetItem (0, -1,"Panel 3")
  ButtonGadget(3, 10, 30, 80, 20, "PureBasic")
  CloseGadgetList()
  
  ScrollBarGadget(4,5,230,310,20,0,$FFFFFF,1)
  ScrollBarGadget(5,5,250,310,20,0,$FFFFFF,1)
  
  ; Ownderdraw and subcalss PanelGadget to colorize tabs
  SetWindowLong_(GadgetID(0), #GWL_STYLE, GetWindowLong_(GadgetID(0), #GWL_STYLE) | #TCS_OWNERDRAWFIXED)
  oldCallback = SetWindowLong_(GetParent_(GadgetID(0)), #GWL_WNDPROC, @myPGcallback()) 
 	  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget
    	If EventGadget() = 4
    		SetPanelColor(0,1,GetGadgetState(4))
    	EndIf 
    	If EventGadget() = 5
    		SetPanelColor(0,2,GetGadgetState(5))
    	EndIf     	
    EndIf 
    
  Until Event = #PB_Event_CloseWindow
EndIf
End 
Damit es nicht ganz so schwer wird, hab ich allerdings
auf das Loeschen des Speichers verzichtet.
Zuletzt geändert von edel am 03.02.2008 19:49, insgesamt 3-mal geändert.
Velz
Beiträge: 182
Registriert: 18.10.2004 22:20

Beitrag von Velz »

ok ich lass das mit meinem Grobmotorischen Beispiel...

das ist ja richtig elegant....

Dann werd ich mich wohl doch über den Tellerrand beugen müssen und mal was über WIN APIs lesen..

super und danke...
Win10/64|Ubuntu-Server|Mint WS // Programmiere Datenbankanwendungen und Tools mit PB-5.x und MySQL-5.x unter Win und Linux
Lord
Beiträge: 325
Registriert: 21.01.2008 19:11

Beitrag von Lord »

@edel:

Tolles Beispiel! Nach etwas Ähnlichem habe ich schon lange gesucht.
Läßt sich Dein Codebeispiel auch so 'umstricken', daß sich die Tab-Farben nicht bei jedem Klick ändern, sondern daß man einfach die Möglichkeit hat, die Text- und/oder Hintergrundfarbe permanent zu ändern?
SetGadgetColor() steht ja für das PanelGadget nicht zur Verfügung.
Die Suche hier und im englischen Board hat mich bisher zu dem Ergebnis geführt, daß sich die Farbe der Tab-Texte nicht ändern läßt.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Versuch mal das hier :

Code: Alles auswählen

Global oldCallback

Structure color
   backcolor.l
   forecolor.l
   CallBack.l
EndStructure   

Procedure GetPanelStaticItem(id,item)
	Protected tci.TC_ITEM\mask = #TCIF_PARAM
  If SendMessage_(GadgetID(id),#TCM_GETITEM,item,@tci)
    ProcedureReturn tci\lParam
  EndIf
EndProcedure 

Procedure mySTcallback(hwnd, msg, wParam, lParam)
	Protected *c.color = GetWindowLong_(hwnd,#GWL_USERDATA)
	Protected callback.l
	
	If *c
		callback = *c\callback		
	EndIf 

	If *c And msg = #WM_DESTROY		
		FreeMemory(*c)		
	EndIf 
		
	ProcedureReturn CallWindowProc_(callback, hwnd, msg, wParam, lParam)
EndProcedure

Procedure SetPanelColor(id,item,forecolor,backcolor)
  Protected *c.color
	Protected hwnd = GetPanelStaticItem(id,item)
	
	*c = GetWindowLong_(hwnd,#GWL_USERDATA) 
	
	If Not *c
	  *c = AllocateMemory(SizeOf(color))
	EndIf
	
	*c\backcolor = backcolor
	*c\forecolor = forecolor
		
	If Not *c\CallBack
		*c\CallBack = SetWindowLong_(hwnd,#GWL_WNDPROC,@mySTcallback())
	EndIf 
	
	SetWindowLong_(hwnd,#GWL_USERDATA,*c) 
	SetWindowPos_(GadgetID(id),0,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE|#SWP_FRAMECHANGED|#SWP_NOZORDER)   
EndProcedure

;...Our subclassed PanelGadget events
Procedure myPGcallback(hwnd, msg, wParam, lParam)
  Protected *c.color
  Protected bc,fc
  Protected backbrush   
  Protected TabHWND
  
  Select msg
    Case #WM_DRAWITEM
      *PGdis.DRAWITEMSTRUCT = lParam
      If *PGdis\CtlType = #ODT_TAB

					TabHWND = GetPanelStaticItem(*PGdis\ctlid, *PGdis\itemID)
										         
         	*c.color = GetWindowLong_(TabHWND,#GWL_USERDATA) 
         		         		
					If Not *c
					   bc = GetSysColor_(#COLOR_MENU)
					   fc = GetSysColor_(#COLOR_WINDOWTEXT)
					Else
					   bc = *c\backcolor
					   fc = *c\forecolor     
					EndIf                     
            
					backbrush = CreateSolidBrush_(bc)
					
					tabText$ = GetGadgetItemText(*PGdis\ctlid, *PGdis\itemID, 0)
					FillRect_(*PGdis\hdc, *PGdis\rcItem, backbrush)           
					SetTextColor_(*PGdis\hdc, fc)
					SetBkMode_(*PGdis\hdc, #TRANSPARENT)
					DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)
					
					DeleteObject_(backbrush)
       
      EndIf
  EndSelect

  ProcedureReturn CallWindowProc_(oldCallback, hwnd, msg, wParam, lParam)
EndProcedure

If OpenWindow(0, 0, 0, 322, 240,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  PanelGadget(0, 8, 8, 306, 203)
  AddGadgetItem (0, -1, "Panel 1")
  ButtonGadget(1, 10, 30, 50, 20, "Hello")
  AddGadgetItem (0, -1,"Panel 2")
  ButtonGadget(2, 10, 30, 50, 20, "World")
  AddGadgetItem (0, -1,"Panel 3")
  ButtonGadget(3, 10, 30, 80, 20, "PureBasic")
  CloseGadgetList()

  ; Ownderdraw and subcalss PanelGadget to colorize tabs
  SetWindowLong_(GadgetID(0), #GWL_STYLE, GetWindowLong_(GadgetID(0), #GWL_STYLE) | #TCS_OWNERDRAWFIXED)
  oldCallback = SetWindowLong_(GetParent_(GadgetID(0)), #GWL_WNDPROC, @myPGcallback())
     
  SetPanelColor(0,0,$54D3AB,$0000FF )    
  SetPanelColor(0,1,$FFFFFF,$D74C28 )   
  SetPanelColor(0,2,$8C2D73,$1967E6 ) 
  
  Repeat
    Event = WaitWindowEvent()
   
  Until Event = #PB_Event_CloseWindow
EndIf
End  
Zuletzt geändert von edel am 03.02.2008 19:49, insgesamt 1-mal geändert.
Lord
Beiträge: 325
Registriert: 21.01.2008 19:11

Beitrag von Lord »

Erkenntnis hat geschrieben:edel sei der Mensch, hilfreich und gut
Danke! Genau das habe ich gesucht. :allright:

Noch eine Frage:

Was soll

Code: Alles auswählen

  DeleteObject_(greenBrush) 
am Ende Deines Codes bewirken?

Gruß

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

Beitrag von edel »

gar nichts, ist aus dem alten code wohl uebrig geblieben
Lord
Beiträge: 325
Registriert: 21.01.2008 19:11

Beitrag von Lord »

Hab' ich mir fast gedacht, aber besser ist besser.

Nochmals Danke für die Hilfe.

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

Beitrag von edel »

Hab das ganze jetzt mal etwas erweitert
http://www.purebasic.fr/german/viewtopic.php?p=185625
Velz
Beiträge: 182
Registriert: 18.10.2004 22:20

Re: Farbe der Panel Lasche verändern ???

Beitrag von Velz »

Hallo

bin gerade dabei mein Programm von PB 4.2 in die Neuzeit zu holen. In Sachen Gadgetfarben hat sich ja einiges getan!

Gibt es den irgendeinen StandardBefehl mit dem ich die Textfarbe der "Lasche" auf dem PanelGadget verändern kann?

Habe einiges ausprobiert(ist ja nicht immer alles dokumentiert) aber nichts gefunden.

Hintergrund ist, dass ich die Lösung gerne für WIN und Linux einsetzen möchte! Oder gibt es eine andere Möglichkeit die Lasche zu markieren?
Win10/64|Ubuntu-Server|Mint WS // Programmiere Datenbankanwendungen und Tools mit PB-5.x und MySQL-5.x unter Win und Linux
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Farbe der Panel Lasche verändern ???

Beitrag von RSBasic »

Ist schwierig. Nimm lieber CanvasGadget bzw: http://www.purebasic.fr/german/viewtopi ... =8&t=24788
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten