Seite 1 von 2

ListIconGadget Spaltenüberschrift zentrieren

Verfasst: 09.01.2020 13:51
von Velindos
Hallo Leute,

möchte beim ListIconGadget Spaltenüberschrift zentrieren!

Keine Ahnung wie das geht!

Code: Alles auswählen

If OpenWindow(0, 100, 100, 300, 100, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ListIconGadget(0, 5, 5, 290, 90, "Name", 290, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
   ; Hier der EINTRAG den ich zentrieren möchte
   SetGadgetItemText(0, -1, "EINTRAG", 0 )
   Repeat
     Event = WaitWindowEvent()
   Until Event = #PB_Event_CloseWindow
 EndIf
Jemand vielleicht eine Ahnung?


Gruss ... Velindos!

Re: ListIconGadget Spaltenüberschrift zentrieren

Verfasst: 09.01.2020 14:33
von Shardik
Velindos hat geschrieben:möchte beim ListIconGadget Spaltenüberschrift zentrieren!
Bei solchen Fragen sollte man als erstes einen Blick in RSBasics WinAPI-Bibliothek werfen. Dort kann man dann dieses Beispiel finden.

Re: ListIconGadget Spaltenüberschrift zentrieren

Verfasst: 09.01.2020 15:15
von Velindos
Hallo,

Hatte ich vergessen - Danke für deinen Tip!

Hab nur ein Problem das die ganze Spalte jetzt zentriert ist.

Wollte jedoch
das nur die Spaltenüberschrift
zentriert ist!

Gruss .. Velindos!

Re: ListIconGadget Spaltenüberschrift zentrieren

Verfasst: 09.01.2020 16:59
von Thorsten1867

Re: ListIconGadget Spaltenüberschrift zentrieren

Verfasst: 10.01.2020 11:04
von Shardik
Velindos hat geschrieben:Wollte jedoch
das nur die Spaltenüberschrift
zentriert ist!

Gruss .. Velindos!

Code: Alles auswählen

EnableExplicit

#ColumnOfCenteredHeader = 1

Define DefaultListIconCallback.I

Procedure CustomListIconCallback(WindowHandle.I, Msg.I, WParam.I, LParam.I)
  Shared DefaultListIconCallback.I

  Protected HeaderText.S
  Protected *NMCustomDraw.NMCUSTOMDRAW
  Protected *NMHdr.NMHDR
  Protected Result.I

  Result = CallWindowProc_(DefaultListIconCallback, WindowHandle.I, Msg.I,
    WParam.I, LParam.I)

  If Msg = #WM_NOTIFY
    *NMHdr = LParam

    If *NMHdr\code = #NM_CUSTOMDRAW
      *NMCustomDraw = LParam

      Select *NMCustomDraw\dwDrawStage
        Case #CDDS_PREPAINT
          Result = #CDRF_NOTIFYITEMDRAW
        Case #CDDS_ITEMPREPAINT
          If *NMCustomDraw\dwItemSpec = #ColumnOfCenteredHeader
            SetBkMode_(*NMCustomDraw\hdc, #TRANSPARENT) 
            HeaderText = GetGadgetItemText(0, -1, *NMCustomDraw\dwItemSpec) 
            DrawText_(*NMCustomDraw\hdc, @HeaderText, Len(HeaderText),
              *NMCustomDraw\rc,
              #DT_CENTER | #DT_VCENTER | #DT_SINGLELINE) 
            Result = #CDRF_SKIPDEFAULT
          EndIf
      EndSelect
    EndIf
  EndIf

  ProcedureReturn Result
EndProcedure

OpenWindow(0, 200, 100, 400, 100,
  "ListIconGadget mit zentriertem Titeltext in 2.Spalte")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20,
  "Name", 110, #PB_ListIcon_GridLines)
AddGadgetColumn(0, 1, "Address", GadgetWidth(0) - GetGadgetItemAttribute(0, 0,
  #PB_ListIcon_ColumnWidth) - 4)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ +
  "12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "Ginger Brokeit" + #LF$ +
  "130 PureBasic Road, BigTown, CodeCity")
AddGadgetItem(0, -1, "Didi Foundit" + #LF$ +
  "321 Logo Drive, Mouse House, Downtown")

DefaultListIconCallback = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC,
  @CustomListIconCallback())

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

Re: ListIconGadget Spaltenüberschrift zentrieren

Verfasst: 10.01.2020 15:53
von Velindos
Hallo Leute,

Danke für eure Unterstützung. Hab mal das auf mein Beispiel gebracht!

Code: Alles auswählen

EnableExplicit
; Define *DefaultListIconCallback.I
Global *DefaultListIconCallback
Enumeration
EndEnumeration
#ColumnOfCenteredHeader = 0
Global Work_L_ListIcon

Global b

Procedure Callback_Work_ListIcon(WindowHandle.I, Msg.I, WParam.I, LParam.I)
;   Shared *DefaultListIconCallback.I
  
  Protected HeaderText.S
  Protected *NMCustomDraw.NMCUSTOMDRAW
  Protected *NMHdr.NMHDR
  Protected Result.I
  
  Result = CallWindowProc_(*DefaultListIconCallback, WindowHandle.I, Msg.I,WParam.I, LParam.I)
  
  If Msg = #WM_NOTIFY
    *NMHdr = LParam
    
    If *NMHdr\code = #NM_CUSTOMDRAW
      *NMCustomDraw = LParam
      
      Select *NMCustomDraw\dwDrawStage
        Case #CDDS_PREPAINT
          Result = #CDRF_NOTIFYITEMDRAW
        Case #CDDS_ITEMPREPAINT
          If *NMCustomDraw\dwItemSpec = #ColumnOfCenteredHeader
            SetBkMode_(*NMCustomDraw\hdc, #TRANSPARENT)
            HeaderText = GetGadgetItemText(Work_L_ListIcon, -1, *NMCustomDraw\dwItemSpec)
            DrawText_(*NMCustomDraw\hdc, @HeaderText, Len(HeaderText),
                      *NMCustomDraw\rc,
                      #DT_CENTER | #DT_VCENTER | #DT_SINGLELINE)
            Result = #CDRF_SKIPDEFAULT
          EndIf
      EndSelect
    EndIf
  EndIf
  
  ProcedureReturn Result
EndProcedure
If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  Work_L_ListIcon = ListIconGadget(#PB_Any,10,10,480,230,"Test-Überschrift",400,0)
  For b = 0 To 14          
    AddGadgetItem(Work_L_ListIcon, b,  "Column " + Str(b) )
  Next
  *DefaultListIconCallback = SetWindowLongPtr_(GadgetID(Work_L_ListIcon), #GWL_WNDPROC,@Callback_Work_ListIcon())
  
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Da ich bereits einen ListiconCallback habe, habe ich die Sache anschliessend
integriert und getest. Was zu Folge hatte das mein Windowsfenster nur teilweise angezeigt wird!

Keine Ahnung was jetzt falsch ist, wobei Demo läuft!

Gruss ... Velindos!

Re: ListIconGadget Spaltenüberschrift zentrieren

Verfasst: 10.01.2020 18:32
von Shardik
Ich kann Dir nur weiterhelfen, wenn Du Dir die Mühe machst, ein kleines, zusammengestrichenes Beispiel zu erstellen, das lauffähig ist oder zumindest auf einen Fehler läuft. Nur mit der Prozedur Callback_Work_ListIcon() alleine komme ich nicht weiter, z.B. wo ist die wahrscheinlich globale Variable VelindosModus definiert, welche Gadgets werden verwendet, wie sieht die Event-Schleife aus, wie erfolgt das Subclassing des ListIconGadgets usw.?

Re: ListIconGadget Spaltenüberschrift zentrieren

Verfasst: 11.01.2020 15:49
von Velindos
Hallo Leute,

habe die Sache verworfen und einfach Leerzeichen eingefügt zur Zentrierung!
Danke für eure Unterstützung!

Gruss ... Velindos!

Re: ListIconGadget Spaltenüberschrift zentrieren

Verfasst: 14.01.2020 09:56
von Shardik
Ich habe Dir einmal eine Alternativlösung mit WindowCallback erstellt, die nicht mit dem schon vorhandenen Subclassing Deines ListIconGadget kollidiert:

Code: Alles auswählen

EnableExplicit

#ColumnOfCenteredHeader = 1

Procedure WindowCallback(WindowHandle.I, Msg.I, WParam.I, LParam.I)
  Protected HeaderHandle.I
  Protected HeaderText.S
  Protected *NMCustomDraw.NMCUSTOMDRAW
  Protected *NMHeader.NMHEADER
  Protected Result.I = #PB_ProcessPureBasicEvents

  If Msg = #WM_NOTIFY
    *NMHeader = LParam
    HeaderHandle = SendMessage_(GadgetID(0), #LVM_GETHEADER, 0, 0)

    If *NMHeader\hdr\hwndFrom = HeaderHandle
      *NMCustomDraw = LParam

      Select *NMCustomDraw\dwDrawStage
        Case #CDDS_PREPAINT
          Result = #CDRF_NOTIFYITEMDRAW
        Case #CDDS_ITEMPREPAINT
          If *NMCustomDraw\dwItemSpec = #ColumnOfCenteredHeader
            SetBkMode_(*NMCustomDraw\hdc, #TRANSPARENT) 
            HeaderText = GetGadgetItemText(0, -1, *NMCustomDraw\dwItemSpec) 
            DrawText_(*NMCustomDraw\hdc, @HeaderText, Len(HeaderText),
              *NMCustomDraw\rc, #DT_CENTER | #DT_VCENTER | #DT_SINGLELINE) 
            Result = #CDRF_SKIPDEFAULT
          EndIf
      EndSelect
    EndIf
  EndIf

  ProcedureReturn Result
EndProcedure

OpenWindow(0, 200, 100, 400, 100,
  "ListIconGadget mit zentriertem Titeltext in 2.Spalte")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20,
  "Name", 110, #PB_ListIcon_GridLines)
AddGadgetColumn(0, 1, "Address", GadgetWidth(0) - GetGadgetItemAttribute(0, 0,
  #PB_ListIcon_ColumnWidth) - 4)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ +
  "12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "Ginger Brokeit" + #LF$ +
  "130 PureBasic Road, BigTown, CodeCity")
AddGadgetItem(0, -1, "Didi Foundit" + #LF$ +
  "321 Logo Drive, Mouse House, Downtown")

SetWindowCallback(@WindowCallback(), 0)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

Re: ListIconGadget Spaltenüberschrift zentrieren

Verfasst: 14.01.2020 10:58
von Lord
Shardik hat geschrieben:Ich habe Dir einmal eine Alternativlösung mit WindowCallback erstellt, die nicht mit dem schon vorhandenen Subclassing Deines ListIconGadget kollidiert:
Ich sehe da keinen zentrierten Text im ColumnHeader.
"Select *NMCustomDraw\dwDrawStage" hat nie den Wert "#CDDS_ITEMPREPAINT".