ListIconGadget Spaltenüberschrift zentrieren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

ListIconGadget Spaltenüberschrift zentrieren

Beitrag 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!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: ListIconGadget Spaltenüberschrift zentrieren

Beitrag 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.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: ListIconGadget Spaltenüberschrift zentrieren

Beitrag 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!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: ListIconGadget Spaltenüberschrift zentrieren

Beitrag von Thorsten1867 »

Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: ListIconGadget Spaltenüberschrift zentrieren

Beitrag 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
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: ListIconGadget Spaltenüberschrift zentrieren

Beitrag 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!
Zuletzt geändert von Velindos am 11.01.2020 12:52, insgesamt 1-mal geändert.
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: ListIconGadget Spaltenüberschrift zentrieren

Beitrag 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.?
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: ListIconGadget Spaltenüberschrift zentrieren

Beitrag von Velindos »

Hallo Leute,

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

Gruss ... Velindos!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: ListIconGadget Spaltenüberschrift zentrieren

Beitrag 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
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: ListIconGadget Spaltenüberschrift zentrieren

Beitrag 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".
Bild
Antworten