Shardik hat geschrieben:Bei Kompilierung mit 64 Bit wird zwar ein Header-Handle in *NMHeader\hdr\hwndFrom erkannt und in Case #CDDS_PREPAINT wird #CDRF_NOTIFYITEMDRAW zurückgegeben, aber Case #CDDS_ITEMPREPAINT wird dann in einem zweiten Durchgang nicht mehr aufgerufen, sodass keine Zentrierung erfolgt.
Leider scheint dieses Problem an einem Bug in Windows x64 zu liegen, wenn man einen Window Callback verwendet. Bei dem von mir schon gezeigten Subclassing des ListIconGadget tritt dieser Fehler bei 64-Bit Kompilierung dagegen nicht auf.
Ich musste daher in einem WindowCallback den Alternativweg einschlagen, statt nur den Text in einer Titelzelle zu zentrieren, die ganze Spalte zu zentrieren und alle Zelleinträge (mit Ausnahme der Titelzelle) linksbündig auszugeben. Leider bietet das Win32 ListView Control keine native Möglichkeit, nur den Text einer Titelzelle oder einer einzelnen Zelle zu zentrieren.
Ich habe das folgende WindowCallback-Beispiel erfolgreich auf folgenden Windows-Versionen getestet:
- Windows XP SP1 mit PB 5.71 x86
- Windows 7 SP1 x64 mit PB 5.71 x86 und x64
- Windows 8.1 x64 mit PB 5.71 x86 und x64
- Windows 10 x64 V1809 mit PB 5.46 x86 und x64 im ASCII- und Unicode-Modus und PB 5.71 x86 und x64
Code: Alles auswählen
EnableExplicit
#ColumnOfCenteredHeader = 1
Define HeaderItem.HDITEM
Define HeaderHandle.I
Procedure WindowCallback(WindowHandle.I, Msg.I, WParam.I, LParam.I)
Protected Brush.I
Protected CellText.S
Protected Column.I
Protected LVHitTestInfo.LVHITTESTINFO
Protected *NMLVCustomDraw.NMLVCUSTOMDRAW
Protected *NMHdr.NMHDR
Protected Rectangle.RECT
Protected Result.I = #PB_ProcessPureBasicEvents
Protected Row.I
If Msg = #WM_NOTIFY
*NMHdr = LParam
If *NMHdr\hwndFrom = GadgetID(0)
If *NMHdr\code = #NM_CUSTOMDRAW
*NMLVCustomDraw = LParam
Column = *NMLVCustomDraw\iSubItem
Select *NMLVCustomDraw\nmcd\dwDrawStage
Case #CDDS_PREPAINT
If Column = #ColumnOfCenteredHeader And Column <> 0
Result = #CDRF_NOTIFYITEMDRAW
EndIf
Case #CDDS_ITEMPREPAINT
Result = #CDRF_NOTIFYSUBITEMDRAW
Case #CDDS_SUBITEMPREPAINT
Row = *NMLVCustomDraw\nmcd\dwItemSpec
CellText = GetGadgetItemText(0, Row, Column)
LVHitTestInfo\iItem = Row
LVHitTestInfo\iSubItem = Column
Rectangle\top = Column
SendMessage_(GadgetID(0), #LVM_GETSUBITEMRECT, LVHITTESTINFO\iItem,
Rectangle)
Rectangle\right = Rectangle\left + SendMessage_(GadgetID(0),
#LVM_GETSTRINGWIDTH, 0, @CellText) + 8
If Column = 0
; ----- Detect if row is selected and highlight cell if yes
If GetGadgetItemState(0, Row)
Brush = CreateSolidBrush_(GetSysColor_(#COLOR_HIGHLIGHT))
Else
Brush = CreateSolidBrush_(#White)
EndIf
FillRect_(*NMLVCustomDraw\nmcd\hdc, @Rectangle, Brush)
DeleteObject_(Brush)
EndIf
; ----- Draw left justified text into cell
Rectangle\left + 5
DrawText_(*NMLVCustomDraw\nmcd\hdc, @CellText, Len(CellText),
Rectangle, #DT_LEFT | #DT_VCENTER | #DT_SINGLELINE)
Result = #CDRF_SKIPDEFAULT
EndSelect
EndIf
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")
; ----- Center text in specified header and column
HeaderHandle = SendMessage_(GadgetID(0), #LVM_GETHEADER, 0, 0)
HeaderItem\mask = #HDI_FORMAT
HeaderItem\fmt = #HDF_STRING | #HDF_CENTER
SendMessage_(HeaderHandle, #HDM_SETITEM , #ColumnOfCenteredHeader, @HeaderItem)
; ----- Initialize window callback
SetWindowCallback(@WindowCallback(), 0)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow