Seite 1 von 2

panelgadget mit einem panel über ganze gadgetbreite

Verfasst: 04.11.2009 13:17
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

Re: panelgadget mit einem panel

Verfasst: 04.11.2009 13:25
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

Re: panelgadget mit einem panel

Verfasst: 04.11.2009 13:54
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

Re: panelgadget mit einem panel über ganze gadgetbreite

Verfasst: 04.11.2009 14:12
von 7x7
wow Josh, soviel Code für nichts? Cooler Tipp /:->

Re: panelgadget mit einem panel über ganze gadgetbreite

Verfasst: 04.11.2009 15:06
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

Re: panelgadget mit einem panel über ganze gadgetbreite

Verfasst: 04.11.2009 15:20
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.

Re: panelgadget mit einem panel über ganze gadgetbreite

Verfasst: 04.11.2009 15:30
von Josh
ach du warst das. na dann ist mir jetzt einiges klarer. danke für deinen hinweis.

Re: panelgadget mit einem panel über ganze gadgetbreite

Verfasst: 04.11.2009 18:04
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

Re: panelgadget mit einem panel über ganze gadgetbreite

Verfasst: 04.11.2009 18:27
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

Re: panelgadget mit einem panel über ganze gadgetbreite

Verfasst: 04.11.2009 19:01
von hjbremer
He Josh, ich finde deinen Beitrag ok, ignoriere das Gelaber und mach weiter so :allright: