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".