Фон листбокса

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Фон листбокса

Сообщение MOV » 11.09.2006 (Пн) 10:01

Берем стандартную форму
добавляем на нее листбокс
файллистбокс и имэдж (имиджу присваивем картинку, свойство стретч ставим в труе, визибл ставим в фальш)

в модуле формы пишем:
Код: Выделить всё
Private Sub Form_Load()
    hBrush = CreatePatternBrush(Image1.Picture.Handle)
    prevFuncPointer = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf frmWndProc)
    prevListboxFuncPointer = SetWindowLong(List1.hWnd, GWL_WNDPROC, AddressOf lbWndProc)
End Sub


к проекту добавляем модуль и пишем в нем:

Код: Выделить всё
Public Path As String
Public DataDir As String
Public INNPridorog As String
Public INNMaxMix As String
Public Npost As String
Public NumNukl As Long
Public FileN As String
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
           (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
           (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _
           ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function InvalidateRect Lib "user32" (ByVal hwnd As Long, _
           ByVal lpRect As Long, ByVal bErase As Long) As Long
Public Declare Function CreatePatternBrush Lib "gdi32" (ByVal hBitmap As Long) _
           As Long
Private Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) _
           As Long
Private Const WM_CTLCOLOREDIT = &H133
Private Const WM_CTLCOLORLISTBOX = &H134
Private Const WM_VSCROLL = &H115
Private Const WM_ERASEBKGND = &H14
Public Const GWL_WNDPROC = (-4)
Public hBrush As Long
Public prevFuncPointer As Long
Public prevListboxFuncPointer As Long

Public Function frmWndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, _
            ByVal lParam As Long) As Long

    If (uMsg = WM_CTLCOLORLISTBOX) And hBrush <> 0 Then
        ' Make the words print transparently
        SetBkMode wParam, 1

        ' Allow the original process to set text color, etc. from the lbx properties.
        CallWindowProc prevFuncPointer, hwnd, uMsg, wParam, lParam

        ' Return our custom brush instead of the default one
        frmWndProc = hBrush
    Else
        frmWndProc = CallWindowProc(prevFuncPointer, hwnd, uMsg, wParam, lParam)
    End If
End Function

Public Function lbWndProc(ByVal hwnd As Long, ByVal uMsg As Long, _
           ByVal wParam As Long, ByVal lParam As Long) As Long
    ' Force the control to repaint itself every time  the scroll message is received.
    If uMsg = WM_VSCROLL Then
        ' Force windows to repaint the listbox
        InvalidateRect hwnd, 0, 0
        ' Invoke the default process
        lbWndProc = CallWindowProc(prevListboxFuncPointer, hwnd, uMsg, wParam, lParam)
    ElseIf uMsg = WM_ERASEBKGND Then
        ' Don't return anything. Processing the default routine will actually cause
        ' flickering when' scrolling.
        lbWndProc = 1
    Else
        ' Invoke the default process
        lbWndProc = CallWindowProc(prevListboxFuncPointer, hwnd, uMsg, wParam, lParam)
    End If
End Function


Запускаем. Все это сделано для того, чтобы дать листбоксу фон от image1
Но у меня почему этот фон распространяется и на filelistbox (в прицепе),
как этого избежать?

Да в общем сколько листбоксов не помести, он все их раскарис, а охота, чтобы только один.
Вложения
Безымянный.rar
(80.84 Кб) Скачиваний: 40

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 11.09.2006 (Пн) 12:12

If (uMsg = WM_CTLCOLORLISTBOX) And lparam=form1.list1.hwnd Then

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 11.09.2006 (Пн) 12:21

гуд! спасиб. оно.

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 13.09.2006 (Ср) 13:02

Да не все-таки есть косяки небольшие,
в частности этот фон может быть затерт другим окном и потом он не перерисовывается.
Что можно сделать?
То есть как сделать перерисовку этого фона?
Если то, что в проце form_load
запихнуть в отдельную процу, то при повторном ее вызове
проект вылетает.

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 13.09.2006 (Ср) 15:29

Ну как же все-таки перерисовывать этот фон
Если при повторном вызове
Код: Выделить всё
    hBrush = CreatePatternBrush(Image1.Picture.Handle)
    prevFuncPointer = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf frmWndProc)
    prevListboxFuncPointer = SetWindowLong(List1.hWnd, GWL_WNDPROC, AddressOf lbWndProc)

приложение вылетает

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 14.09.2006 (Чт) 2:06

MOV писал(а):Да не все-таки есть косяки небольшие,
в частности этот фон может быть затерт другим окном и потом он не перерисовывается.


странно, у меня почему-то не затирается


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 93

    TopList