panelgadget mit einem panel über ganze gadgetbreite

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

panelgadget mit einem panel über ganze gadgetbreite

Beitrag von Josh »

vieleicht kanns ja mal wer brauchen oder zumindest ein bischen was raus holen:

Code: Alles auswählen

  EnableExplicit

  Procedure Form_Size()
    Define TabWidth.l
    
    If IsGadget(0) = #False
      ProcedureReturn
    EndIf
    
   ;Gadget der Fenstergröße anpassen
    ResizeGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20)

   ;Tabbreite über ganze Gadgetbreite 
    TabWidth = GadgetWidth(0) - 4
    If IsThemeActive_()
      TabWidth = GadgetWidth(0) - 6
    EndIf
    SetWindowLongPtr_(GadgetID(0), #GWL_STYLE, GetWindowLongPtr_(GadgetID(0), #GWL_STYLE)|#TCS_FIXEDWIDTH)
    SendMessage_(GadgetID(0), #TCM_SETITEMSIZE, 0, TabWidth)

  EndProcedure
  Procedure Form_DrawItem (wParam.l, lParam.l)
    Define *ItemInfo.DRAWITEMSTRUCT
    Define rcClip.RECT
    Define hTheme.l
    Define ItemText.s
  
   ;Wenn kein Theme aktiv, nix tun
    If IsThemeActive_() = #False
      ProcedureReturn
    EndIf
  
   ;Konstanten für DrawTheme
    #TABP_TABITEMLEFTEDGE = 2
    #TABP_PANE = 9            ;TABP = TabParts
    #TIS_SELECTED = 3         ;TIS  = TabItemState
  
   ;Für DrawTheme vorbereiten
    *ItemInfo = lParam
    hTheme = OpenThemeData_(WindowID(0), @"Tab")
  
     ;Itemtext wieder herstellen 
      ItemText = GetGadgetItemText(*ItemInfo\CtlID, 0, 0)
      SetBkMode_(*ItemInfo\hdc, #TRANSPARENT)
      DrawText_(*ItemInfo\hdc, ItemText, Len(ItemText), *ItemInfo\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)
  
     ;Ein Pixel am linken Rand korrigieren
      rcClip\left   = *ItemInfo\rcItem\left
      rcClip\top    = *ItemInfo\rcItem\bottom - 1
      rcClip\right  = *ItemInfo\rcItem\left + 1
      rcClip\bottom = *ItemInfo\rcItem\bottom
      DrawThemeBackground_(hTheme, *ItemInfo\hDC, #TABP_TABITEMLEFTEDGE, #TIS_SELECTED, *ItemInfo\rcItem, @rcClip)
  
     ;Rect wegen rechten Schatten vergrößern
      *ItemInfo\rcItem\right + 2
  
     ;Rect wegen unterem Schattenauslauf vergrößern
      *ItemInfo\rcItem\bottom + 4
  
     ;Rechten Rand korrigieren und Schatten von Grundkörper übernehmen
      rcClip\left   = *ItemInfo\rcItem\right - 3
      rcClip\top    = *ItemInfo\rcItem\top + 3
      rcClip\right  = *ItemInfo\rcItem\right
      rcClip\bottom = *ItemInfo\rcItem\bottom - 4
      DrawThemeBackground_(hTheme, *ItemInfo\hDC, #TABP_PANE, 0, *ItemInfo\rcItem, @rcClip)
  
   ;Themedata schließen
    CloseThemeData_(hTheme)
  
  EndProcedure

  Procedure Callback_Windows(hWnd.l, msg.l, wParam.l, lParam.l)

    Select msg
      Case #WM_SIZE     : Form_Size()
      Case #WM_DRAWITEM : Form_DrawItem(wParam, lParam)
    EndSelect

    ProcedureReturn #PB_ProcessPureBasicEvents

  EndProcedure

  OpenWindow(0, 0, 0, 200, 300, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)

  PanelGadget     (0, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore)
    AddGadgetItem (0, -1, "Test")
  CloseGadgetList()

 ;Tab soll durch Benutzer gezeichnet werden
  SetWindowLong_(GadgetID(0), #GWL_STYLE, GetWindowLong_(GadgetID(0), #GWL_STYLE) | #TCS_OWNERDRAWFIXED)

 ;Windows Callbackfunktion benutzen
  SetWindowCallback(@Callback_Windows())

 ;Gadgets zeichnen
  Form_Size()

  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Zuletzt geändert von Josh am 04.11.2009 13:48, insgesamt 1-mal geändert.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: panelgadget mit einem panel

Beitrag von STARGÅTE »

Könntest du kurz erklären was "es" darstellen soll,
bei mir kommt nämlich das hier raus :
Bild
Win XP SP3 , PB 4.40 B5

Und wnmen ich n PanelGadget mit einem Panel haben will, mach ich das "normal" so:

Code: Alles auswählen

OpenWindow(0, 0, 0, 200, 300, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
  PanelGadget(0, 10, 10, 180, 280)
    AddGadgetItem(0, -1, "Test")
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Zuletzt geändert von STARGÅTE am 09.07.2010 16:01, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: panelgadget mit einem panel

Beitrag von Josh »

STARGÅTE hat geschrieben:Könntest du kurz erklären was "es" darstellen soll
titel war ein bischen falsch gewählt, habe ihn geändert

wenn du styles benutzt und du machst den tab über die gesamte breite, dann kommt das raus. da sind ein paar unschöne fehler im oberen bereich des randes und des schattens:

Bild

mit meinen änderungen kommt das raus:

Bild
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: panelgadget mit einem panel über ganze gadgetbreite

Beitrag von 7x7 »

wow Josh, soviel Code für nichts? Cooler Tipp /:->
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: panelgadget mit einem panel über ganze gadgetbreite

Beitrag von Josh »

7x7 hat geschrieben:wow Josh, soviel Code für nichts?
naja, meine absicht war ja eigentlich, dass vieleicht mal irgendwer was damit anfangen kann. vieleicht habe ich die such-funktion hier im forum auch immer falsch benutzt, aber gerade zum thema styles habe ich nicht gerade viel gefunden. vieleicht mal einen über einen tab geklatschten blauen balken, aber bei der änderung eines rahmens wars dann schon vorbei mit meinen suchergebnissen.

ich gehöre hier leider nicht zur gruppe der profis, die sich alles so einfach aus dem ärmel schütteln und bin oft über jedes codeschnippsel das ich finden kann froh und ich glaube, dass es hier außer mir noch einige andere auch gibt.

aber egal, wenn eh für die würst ist, dann thema erledigt:

KANN BITTE EIN MOD DIESEN THREAD LÖSCHEN
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: panelgadget mit einem panel über ganze gadgetbreite

Beitrag von 7x7 »

josh hat geschrieben:ich gehöre hier leider nicht zur gruppe der profis
Wie war das nochmal? Keine Ahnung haben von der Praxis, aber Maul aufreissen?

Von mir aus kann dieser Thread auch gelöscht werden.
Zuletzt geändert von 7x7 am 04.11.2009 15:26, insgesamt 1-mal geändert.
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: panelgadget mit einem panel über ganze gadgetbreite

Beitrag von Josh »

ach du warst das. na dann ist mir jetzt einiges klarer. danke für deinen hinweis.
Little John

Re: panelgadget mit einem panel über ganze gadgetbreite

Beitrag von Little John »

Ich kenn mich ja mit Styles nicht aus ...

Aber sowas

Code: Alles auswählen

   ;Gadget der Fenstergröße anpassen
    ResizeGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20)
kann man jedenfalls nicht in der "Tipps & Tricks"-Abteilung stehen lassen. Denn das funktioniert ausschließlich mit einem Gadget Nummer 0 in einem Fenster Nummer 0.
Hinweis: Parameter für die betr. Prozedur verwenden. :D

Gruß, Little John
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: panelgadget mit einem panel über ganze gadgetbreite

Beitrag von ts-soft »

hab jetzt mal Little John tip umgesetzt :mrgreen:
das ganze x64 compatible gemacht
und den code um die allernotwendigsten Hinweise ergänzt (siehe die ersten beiden Kommentare)

Code: Alles auswählen

; erfordert PB 4.3x, x86 oder x64
; OS: windows XP oder höher

EnableExplicit

Procedure Form_Size(GadgetID, WindowID)
  Define TabWidth.l

  If IsGadget(GadgetID) = #False
    ProcedureReturn
  EndIf

  ;Gadget der Fenstergröße anpassen
  ResizeGadget(GadgetID, 10, 10, WindowWidth(WindowID) - 20, WindowHeight(WindowID) - 20)

  ;Tabbreite über ganze Gadgetbreite
  TabWidth = GadgetWidth(GadgetID) - 4
  If IsThemeActive_()
    TabWidth = GadgetWidth(GadgetID) - 6
  EndIf
  SetWindowLongPtr_(GadgetID(GadgetID), #GWL_STYLE, GetWindowLongPtr_(GadgetID(GadgetID), #GWL_STYLE) | #TCS_FIXEDWIDTH)
  SendMessage_(GadgetID(GadgetID), #TCM_SETITEMSIZE, 0, TabWidth)

EndProcedure
Procedure Form_DrawItem (wParam, lParam)
  Define *ItemInfo.DRAWITEMSTRUCT
  Define rcClip.RECT
  Define hTheme.l
  Define ItemText.s

  ;Wenn kein Theme aktiv, nix tun
  If IsThemeActive_() = #False
    ProcedureReturn
  EndIf

  ;Konstanten für DrawTheme
  #TABP_TABITEMLEFTEDGE = 2
  #TABP_PANE            = 9            ;TABP = TabParts
  #TIS_SELECTED         = 3         ;TIS  = TabItemState

  ;Für DrawTheme vorbereiten
  *ItemInfo = lParam
  hTheme    = OpenThemeData_(WindowID(0), @"Tab")

  ;Itemtext wieder herstellen
  ItemText = GetGadgetItemText(*ItemInfo\CtlID, 0, 0)
  SetBkMode_(*ItemInfo\hdc, #TRANSPARENT)
  DrawText_(*ItemInfo\hdc, ItemText, Len(ItemText), *ItemInfo\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER | #DT_NOCLIP)

  ;Ein Pixel am linken Rand korrigieren
  rcClip\left   = *ItemInfo\rcItem\left
  rcClip\top    = *ItemInfo\rcItem\bottom - 1
  rcClip\right  = *ItemInfo\rcItem\left + 1
  rcClip\bottom = *ItemInfo\rcItem\bottom
  DrawThemeBackground_(hTheme, *ItemInfo\hDC, #TABP_TABITEMLEFTEDGE, #TIS_SELECTED, *ItemInfo\rcItem, @rcClip)

  ;Rect wegen rechten Schatten vergrößern
  *ItemInfo\rcItem\right + 2

  ;Rect wegen unterem Schattenauslauf vergrößern
  *ItemInfo\rcItem\bottom + 4

  ;Rechten Rand korrigieren und Schatten von Grundkörper übernehmen
  rcClip\left   = *ItemInfo\rcItem\right - 3
  rcClip\top    = *ItemInfo\rcItem\top + 3
  rcClip\right  = *ItemInfo\rcItem\right
  rcClip\bottom = *ItemInfo\rcItem\bottom - 4
  DrawThemeBackground_(hTheme, *ItemInfo\hDC, #TABP_PANE, 0, *ItemInfo\rcItem, @rcClip)

  ;Themedata schließen
  CloseThemeData_(hTheme)

EndProcedure

Procedure Callback_Windows(hWnd, msg, wParam, lParam)

  Select msg
    Case #WM_SIZE     : Form_Size(0, 0)
    Case #WM_DRAWITEM : Form_DrawItem(wParam, lParam)
  EndSelect

  ProcedureReturn #PB_ProcessPureBasicEvents

EndProcedure

OpenWindow(0, 0, 0, 200, 300, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)

PanelGadget     (0, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore)
AddGadgetItem (0, -1, "Test")
CloseGadgetList()

;Tab soll durch Benutzer gezeichnet werden
SetWindowLong_(GadgetID(0), #GWL_STYLE, GetWindowLong_(GadgetID(0), #GWL_STYLE) | #TCS_OWNERDRAWFIXED)

;Windows Callbackfunktion benutzen
SetWindowCallback(@Callback_Windows())

;Gadgets zeichnen
Form_Size(0, 0)

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Wofür das ganze jetzt gut ist, hab ich aber nicht verstanden, aber mir war gerade langweilig :)

Gruß
Thomas
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: panelgadget mit einem panel über ganze gadgetbreite

Beitrag von hjbremer »

He Josh, ich finde deinen Beitrag ok, ignoriere das Gelaber und mach weiter so :allright:
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
Antworten