Panelgadget, aktiver Reiter in Fettschrift bzw. farbig

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Panelgadget, aktiver Reiter in Fettschrift bzw. farbig

Beitrag von NicknameFJ »

Hallo zusammen,

ich habe ein Panelgadget und würde hier gerne den aktiven TAB/Reiter entweder,

1. die Schriftart bzw. Größe
2. die Schriftfarbe
oder
3. den Schriftstyle (fett)

ändern.

Habe schon etwas gesucht (Code Archiv, Win API Library von RS-Basic, Google) bin aber leider noch auf kein Codeschnipsel gestoßen.

Ich brauche das nur unter Windows, daher auch gerne WIN-API Lösungen.

Hat da jemand eine Idee bzw. ein Code-Schnipsel für mich?

Danke schon mal im Voraus.

Grüße

NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Panelgadget, aktiver Reiter in Fettschrift bzw. farbig

Beitrag von NicknameFJ »

Kaum geschrieben, schon was gefunden im englischen Forum

Wer es auch gebrauchen kann:

http://www.purebasic.fr/english/viewtop ... or&start=0


Ich schaue mir das mal an ob es genau das ist was ich suche, sonst melde ich mich nochmal

NicknameFj
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Panelgadget, aktiver Reiter in Fettschrift bzw. farbig

Beitrag von NicknameFJ »

Sorry fürs mehrfach posten.

Das mit dem Einfärben des aktiven Reiters habe ich Dank des Codeschnipsels aus dem englischen Forum hingekriegt. (Solange nur 1 PanelGadget da ist)

Ich habe aber zwei Panelgadget´s - sh. Code unten.

Wenn ich den Callback nur für ein Panel aktiviere klappt auch alles (Zeilen 55 und 56 sind im Code auskommentiert). Aktiviere ich den Callback auch fürs zweite Panel wird zwar dort auch der aktive Reiter eingefärbt. Klickt man aber im zweiten Panel auf die Reiter TAB1 bis TAB5 sieht man an der Beschriftung des Buttons (TXT1 der sich nicht ändert) das die Fläche des Panels nicht mehr aktualisiert wird. Ist nur für ein Panel der Callback aktiviert ändert sich beim Klick auf TAB1 bis TAb5 auf der Text des Button, sprich die Fläche des Panels wird dort dann auch aktualisiert.

Ich checke das gerade nicht, da mein Callback ja eigentlich nur auf die "REPAINT" des Tab´s reagiert (was bei einem Panel ja auch klappt).

Wenn da einer der API-Profis vielleicht mal drüber schauen könnte... *** NicknameFJ schön bitte bitte sagt***

Danke

NicknameFJ


//EDIT:

Habe XP SP3 und PB 4.60

//noch ein Edit:
Jetzt brat mir einer einen Storch:

Habe noch Openwindow folgendes eingefügt:

Code: Alles auswählen

  CreateGadgetList(WindowID(#MainWindow))
und das Ganze mit PB 4.10 compiliert und es läuft wie es soll. Wenn da jetzt aber jemand noch eine Lösung für PB 4.60 / 4.61 hat.

// ENDEDIT

Hier noch der Code:

Code: Alles auswählen

Global defaultBrush = CreateSolidBrush_(GetSysColor_(#COLOR_3DFACE))
Global OldProc

#MainWindow = 1

#PanelMain = 1
#PanelExt  = 2

Procedure myPGcallback(hwnd, msg, wParam, lParam) 
      Result = CallWindowProc_(OldProc, hwnd, msg, wParam, lParam) 

  Select msg 
    Case #WM_DRAWITEM 

      *PGdis.DRAWITEMSTRUCT = lParam 
      If *PGdis\CtlType = #ODT_TAB 
        
       Gadget = GetProp_(*PGdis\hwnditem, "PB_ID")

        If *PGdis\itemID = GetGadgetState(Gadget)
          
            Color = #Red
            If Gadget = #PanelExt
              Color = #Blue  
            EndIf
     
            tabText$ = GetGadgetItemText(Gadget, *PGdis\itemID)
            FillRect_(*PGdis\hdc, *PGdis\rcItem, defaultBrush)
            SetTextColor_(*PGdis\hdc, Color) 
            SetBkMode_(*PGdis\hdc, #TRANSPARENT) 
            DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP) 
          Else 
            tabText$ = GetGadgetItemText(Gadget, *PGdis\itemID)
            FillRect_(*PGdis\hdc, *PGdis\rcItem, defaultBrush)
            SetTextColor_(*PGdis\hdc, #Black) 
            SetBkMode_(*PGdis\hdc, #TRANSPARENT) 
            DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP) 
        EndIf 
      EndIf 
  EndSelect 
  ProcedureReturn  Result
EndProcedure 

If OpenWindow(#MainWindow,10,10,800,500,"TEST")
  PanelGadget(#PanelMain,10,10,750,450)
  SetWindowLong_(GadgetID(#PanelMain), #GWL_STYLE, GetWindowLong_(GadgetID(#PanelMain), #GWL_STYLE) | #TCS_OWNERDRAWFIXED) 
  OldProc = SetWindowLong_(GetParent_(GadgetID(#PanelMain)), #GWL_WNDPROC, @myPGcallback()) 

  For i = 1 To 10
    OpenGadgetList(#PanelMain)
    AddGadgetItem(#PanelMain,-1,"Reiter # "+Str(i))  
    
    If i = 1 ; im ersten Reiter des Hauptpanel (und nur dort) ein weiteres Panelgadget erstellen
      PanelGadget(#PanelExt,10,10,600,350)
   ;   SetWindowLong_(GadgetID(#PanelExt), #GWL_STYLE, GetWindowLong_(GadgetID(#PanelExt), #GWL_STYLE) | #TCS_OWNERDRAWFIXED) 
   ;   Old = SetWindowLong_(GetParent_(GadgetID(#PanelExt)), #GWL_WNDPROC, @myPGcallback()) 
      
      If OldProc = 0
        OldProc = Old  
      EndIf
      

      For lp = 1 To 5  
        AddGadgetItem(#PanelExt,-1,"Tab "+Str(lp)  )
        ButtonGadget(10+lp,10,10,80,20,"TXT"+Str(lp))
      Next
      
    EndIf
    
  Next
  
  Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

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

Re: Panelgadget, aktiver Reiter in Fettschrift bzw. farbig

Beitrag von edel »

TCS_OWNERDRAWFIXED ueberlaesst das Parent Fenster das Zeichnen. Beim ersten Tab ist es das oberste Fenster, beim 2. Tab ist es ein Staticfenster. Das Mainfenster kann also nichts malen, was nicht auch auf dem Fenster liegt. Du musst also, jedes Parentfenster "subclassen".

Code: Alles auswählen



#MainWindow = 1

#PanelMain = 1
#PanelExt  = 2

Procedure myPGcallback(hwnd, msg, wParam, lParam) 
	OldProc = GetProp_(hWnd, "OldProc")
	result = CallWindowProc_(OldProc, hwnd, msg, wParam, lParam)
	
	Select msg 
		Case #WM_DRAWITEM 
			
			*PGdis.DRAWITEMSTRUCT = lParam 
			If *PGdis\CtlType = #ODT_TAB 
				
				defaultBrush = CreateSolidBrush_(GetSysColor_(#COLOR_3DFACE))
				
				Gadget = GetProp_(*PGdis\hwnditem, "PB_ID")
				
				If *PGdis\itemID = GetGadgetState(Gadget)
					
					Color = #Red
					If Gadget = #PanelExt
						Color = #Blue  
					EndIf
					
					tabText$ = GetGadgetItemText(Gadget, *PGdis\itemID)
					FillRect_(*PGdis\hdc, *PGdis\rcItem, defaultBrush)
					SetTextColor_(*PGdis\hdc, Color) 
					SetBkMode_(*PGdis\hdc, #TRANSPARENT) 
					DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP) 
				Else 
					tabText$ = GetGadgetItemText(Gadget, *PGdis\itemID)
					FillRect_(*PGdis\hdc, *PGdis\rcItem, defaultBrush)
					SetTextColor_(*PGdis\hdc, #Black) 
					SetBkMode_(*PGdis\hdc, #TRANSPARENT) 
					DrawText_(*PGdis\hdc, tabText$, Len(tabText$), *PGdis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP) 
				EndIf 
				
				DeleteObject_(defaultBrush)
				
			EndIf       
			
	EndSelect 
	
	ProcedureReturn  result 
EndProcedure 

If OpenWindow(#MainWindow,10,10,800,500,"TEST")
	PanelGadget(#PanelMain,10,10,750,450)
	SetWindowLong_(GadgetID(#PanelMain), #GWL_STYLE, GetWindowLong_(GadgetID(#PanelMain), #GWL_STYLE) | #TCS_OWNERDRAWFIXED) 
	OldProc = SetWindowLong_(GetParent_(GadgetID(#PanelMain)), #GWL_WNDPROC, @myPGcallback()) 
	
	;edit
	SetProp_(GetParent_(GadgetID(#PanelMain)),"OldProc",OldProc)
	
	For i = 1 To 10
		OpenGadgetList(#PanelMain)
		AddGadgetItem(#PanelMain,-1,"Reiter # "+Str(i))  
		
		If i = 1 ; im ersten Reiter des Hauptpanel (und nur dort) ein weiteres Panelgadget erstellen
			PanelGadget(#PanelExt,10,10,600,350)
			SetWindowLong_(GadgetID(#PanelExt), #GWL_STYLE, GetWindowLong_(GadgetID(#PanelExt), #GWL_STYLE) | #TCS_OWNERDRAWFIXED) 
			Old = SetWindowLong_(GetParent_(GadgetID(#PanelExt)), #GWL_WNDPROC, @myPGcallback()) 
			
			;edit
			SetProp_(GetParent_(GadgetID(#PanelExt)),"OldProc",OldProc)
			
			If OldProc = 0
				OldProc = Old  
			EndIf
			
			
			For lp = 1 To 5  
				AddGadgetItem(#PanelExt,-1,"Tab "+Str(lp)  )
				ButtonGadget(10+lp,10,10,80,20,"TXT"+Str(lp))
			Next
			
		EndIf
		
	Next
	
	Repeat
	Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Panelgadget, aktiver Reiter in Fettschrift bzw. farbig

Beitrag von NicknameFJ »

Hallo Edel,

komme erstmal nicht dazu es zu testsen, aber trotzdem Danke.

Bei Problemen melde ich mich wieder.

Grüße

NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Antworten