Фоновое изображение на ListBox и Slider - VB

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

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

Хотелось бы узнать, можно установить изображение как фон в ListBox?

Решение задачи: «Фоновое изображение на ListBox и Slider»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. Private Declare Function CreatePatternBrush Lib "gdi32" (ByVal hBitmap As Long) As Long
  4. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  5. Private Declare Function SetBrushOrgEx Lib "gdi32" (ByVal hdc As Long, ByVal nXOrg As Long, ByVal nYOrg As Long, lppt As Any) As Long
  6. Private Declare Function MapWindowPoints Lib "user32" (ByVal hwndFrom As Long, ByVal hwndTo As Long, lppt As Any, ByVal cPoints As Long) As Long
  7. Private Declare Function InvalidateRect Lib "user32" (ByVal hwnd As Long, lpRect As Any, ByVal bErase As Long) As Long
  8. Private Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long
  9. Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
  10.  
  11. Private Const TRANSPARENT           As Long = 1
  12. Private Const WM_CTLCOLORLISTBOX    As Long = &H134
  13. Private Const WM_CTLCOLORSTATIC     As Long = &H138
  14. Private Const WM_VSCROLL            As Long = &H115
  15.  
  16. Dim WithEvents wndProc  As clsTrickSubclass ' Объект для сабклассинга формы
  17. Dim WithEvents lstProc  As clsTrickSubclass ' Объект для сабклассинга списка
  18.  
  19. Dim hBackBrush  As Long ' Фоновая кисть
  20.  
  21. Private Sub Form_Load()
  22.     ' Создаем кисть для отрисовки фона на основе фонового изображения формы
  23.    hBackBrush = CreatePatternBrush(Me.Picture.Handle)
  24.     ' Сабклассинг формы
  25.    Set wndProc = New clsTrickSubclass
  26.     Set lstProc = New clsTrickSubclass
  27.    
  28.     wndProc.Hook Me.hwnd
  29.     lstProc.Hook lstTestList.hwnd
  30.    
  31.     ' Добавляем в список тестовые значения
  32.    Do While lstTestList.ListCount < 100
  33.         lstTestList.AddItem Format(lstTestList.ListCount, "ITE\M 00")
  34.     Loop
  35.    
  36. End Sub
  37.  
  38. Private Sub Form_Unload(Cancel As Integer)
  39.     ' Удаляем кисть
  40.    DeleteObject hBackBrush
  41. End Sub
  42.  
  43. ' Оконная процедура списка
  44. Private Sub lstProc_wndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long, Ret As Long, DefCall As Boolean)
  45.    
  46.     Select Case Msg
  47.     ' При прокрутке списка
  48.    Case WM_VSCROLL
  49.         ' Объявляем всю область списка недействительной и требующей перерисовки
  50.        InvalidateRect hwnd, ByVal 0&, 0
  51.     End Select
  52.     ' Вызов по умолчанию
  53.    DefCall = True
  54.    
  55. End Sub
  56.  
  57. ' Оконная процедура формы
  58. Private Sub wndProc_WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long, Ret As Long, DefCall As Boolean)
  59.    
  60.     Select Case Msg
  61.     ' При запросе кисти фона списка или слайдера
  62.    Case WM_CTLCOLORSTATIC, WM_CTLCOLORLISTBOX
  63.         Dim pts(1)  As Long
  64.         ' Получаем координаты элемента
  65.        MapWindowPoints lParam, Me.hwnd, pts(0), 1
  66.         ' Сдвигаем точку отсчета координат кисти, чтобы она совпадала с фоновом изображением под контролом
  67.        SetBrushOrgEx wParam, -pts(0), -pts(1), ByVal 0&
  68.         ' Если это список
  69.        If lParam = lstTestList.hwnd Then
  70.             ' Устанавливаем прозрачный фон для текста
  71.            SetBkMode wParam, TRANSPARENT
  72.             ' Устанавливаем цвет текста
  73.            SetTextColor wParam, vbWhite
  74.        
  75.         End If
  76.         ' Возвращаем кисть
  77.        Ret = hBackBrush
  78.        
  79.     Case Else:  DefCall = True  ' Остальное оставляем без изменений
  80.    End Select
  81.    
  82. End Sub

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


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

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

10   голосов , оценка 3.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут