Subclassing: Pozadφ ListBoxu

Na formulß° si p°idejte ListBox a prvek Image. Do ListBoxu zadejte pßr polo₧ek. Do prvku Image si naΦt∞te obrßzek, kter² chcete pou₧φt jako pozadφ pro ListBox. Do modulu zapiÜte:

Public gBGBrush As Long
Public Declare Function CreatePatternBrush Lib "gdi32" _
   (ByVal hBitmap As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" _
   (ByVal hObject As Long) As Long
Private Declare Function SetBkMode Lib "gdi32" _
   (ByVal hdc As Long, ByVal nBkMode As Long) As Long
Private Const WM_CTLCOLORLISTBOX = &H134

Nynφ je t°eba modifikovat udßlosti Load a Unload formulß°e:

Private Sub Form_Load()

    Image1.Visible = False
    gBGBrush = CreatePatternBrush(Image1.Picture.Handle)
    oldWindowProc = SetWindowLong(Me.hWnd, GWL_WNDPROC, _
      AddressOf NewWindowProc)

End Sub

Private Sub Form_Unload(Cancel As Integer)

    SetWindowLong Me.hWnd, GWL_WNDPROC, oldWindowProc
    DeleteObject gBGBrush

End Sub

Poslednφm krokem je modifikace vlastnφ procedury, kterß bude zpracovßvat zprßvy obdr₧enΘ z Windows:

Public Function NewWindowProc(ByVal hWnd As Long, _
    ByVal uMsg As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long

    Debug.Print "&H" & Hex(uMsg), wParam, lParam

    If uMsg = WM_CTLCOLORLISTBOX And gBGBrush <> 0 Then
       SetBkMode wParam, 1
'Tisk textu transparentn∞
       NewWindowProc = gBGBrush
   Else
      NewWindowProc = CallWindowProc(oldWindowProc, hWnd, _
        uMsg, wParam, lParam)
   End If

End Function

Nynφ projekt ulo₧te a potΘ spus¥te. Pokud je vÜe v po°ßdku, tak ListBox mß jako pozadφ obrßzek nata₧en² jako pozadφ.

Zp∞t DalÜφ

Autor: The Bozena