А Header у Listview прозрачным сделать можно? - VB

Узнай цену своей работы

Формулировка задачи:

Убрать его нельзя.
Всего одна колонка (причем застопоренная от изменения ширины), но 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5