We used so called owner drawn items, when just "useful contents" are drawn. But in our case, to draw the whole item from scratch, we needed the general custom drawing technique available in the MS common controls. This means we should process the NM_CUSTOMDRAW notification message.
Here is an example from the real working code (the WindowProc for the control's parent):
Select Case uMsg
Case WM_NOTIFY
CopyMemory tNMH, ByVal lParam, LenB(tNMH)
Select Case tNMH.Code
Case NM_CUSTOMDRAW
Dim tNMCD As NMCUSTOMDRAW
CopyMemory tNMCD, ByVal lParam, Len(tNMCD)
Select Case tNMCD.dwDrawStage
Case CDDS_PREPAINT
WindowProcParent = CDRF_NOTIFYITEMDRAW Or CDRF_NOTIFYPOSTPAINT ' CDDS_ITEMPREPAINT (below) will be raised for every item
Exit Function
Case CDDS_ITEMPREPAINT
pDrawItem tNMCD
WindowProcParent = CDRF_SKIPDEFAULT ' totally draw the column header by ourselves
Exit Function
Case CDDS_POSTPAINT
pPostPaint
Exit Function
End Select