А Header у Listview прозрачным сделать можно? - VB
Формулировка задачи:
Убрать его нельзя.
Всего одна колонка (причем застопоренная от изменения ширины), но header отвечает за направление сортировки, ну плюс как заголовок содержания.
В 7-ке и 8-ке у меня конечно есть на вооружении стиль "прозрачная кнопка" (спертый из штатной кнопки "свернуть все окна"), которую можно "прилепить" к ListView сверху (как вариант). Но все же хотелось бы разобраться именно с header и инвариантно относительно стилей.
Listview прозрачный, Toolbar прозрачный, кнопки - прозрачные, header сволочь - белое пятно на рисунке.
Всего одна колонка (причем застопоренная от изменения ширины), но header отвечает за направление сортировки, ну плюс как заголовок содержания.
В 7-ке и 8-ке у меня конечно есть на вооружении стиль "прозрачная кнопка" (спертый из штатной кнопки "свернуть все окна"), которую можно "прилепить" к ListView сверху (как вариант). Но все же хотелось бы разобраться именно с header и инвариантно относительно стилей.
Listview прозрачный, Toolbar прозрачный, кнопки - прозрачные, header сволочь - белое пятно на рисунке.
Решение задачи: «А Header у Listview прозрачным сделать можно?»
textual
Листинг программы
'для событий ListView1
Public Function NewListView1WindowProc _
(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
...
Dim uNMHDR As NMHDR
Select Case Msg
...
Case WM_NOTIFY:
MoveMemory uNMHDR, ByVal lParam, Len(uNMHDR)
Select Case uNMHDR.code
Case NM_CUSTOMDRAW
'Debug.Print "NM_CUSTOMDRAW"
Static lvcd As NMCUSTOMDRAW
MoveMemory lvcd, ByVal lParam, Len(lvcd) ' every structs' member is a Long
Select Case lvcd.dwDrawStage
' ====================================================
Case CDDS_PREPAINT
' Tell the listview we want CDDS_ITEMPREPAINT for each item
NewListView1WindowProc = CDRF_NOTIFYITEMDRAW
Exit Function
' ====================================================
Case CDDS_ITEMPREPAINT
DrawListViewHeader lvcd.hdc, lvcd.hdr.hwndFrom
Exit Function
Case Else
End Select
Case Else
End Select
...
Public Sub DrawListViewHeader(the_hdc As Long, the_hwnd As Long)
Dim rc As RECT
Dim tPt As POINTAPI
Dim hbmDstOld As Long
SetBkMode the_hdc, TRANSPARENT
SetTextColor the_hdc, vbWhite
SetBkColor the_hdc, CLR_NONE
hbmDstOld = SelectObject(the_hdc, hbshBackDigits)
GetWindowRect the_hwnd, rc
tPt.x = rc.Left
tPt.y = rc.Top
MapWindowPoints 0, Form1.PictureDigits.hwnd, tPt, 2
rc.Left = tPt.x
rc.Top = tPt.y
SetBrushOrgEx the_hdc, -rc.Left, -rc.Top, tPt
Dim rRB As RECT
GetClientRect the_hwnd, rRB
PatBlt the_hdc, 0, 0, (rRB.Right - rRB.Left), (rRB.Bottom - rRB.Top), PATCOPY
If Form1.ListView1.ColumnHeaders(1).Tag = 1 Then
DrawIconEx the_hdc, 6, (rRB.Bottom - rRB.Top - 12) / 2, lngIconAscending, 12, 12, 0, 0, DI_NORMAL
Else
DrawIconEx the_hdc, 6, (rRB.Bottom - rRB.Top - 12) / 2, lngIconDescending, 12, 12, 0, 0, DI_NORMAL
End If
SelectObject the_hdc, hbmDstOld
End Sub