Results 1 to 4 of 4

Thread: ListBox question

  1. #1

    Thread Starter
    Fanatic Member
    Join Date
    Aug 2000
    Location
    I'm right here!
    Posts
    849
    How can I make the font color of one item difrent
    from other colors?
    Dekel C.

  2. #2
    Addicted Member ShIzO's Avatar
    Join Date
    Apr 1999
    Location
    Bartlett, IL
    Posts
    189
    not possible with standard listbox that comes with VB.


    check www.vbaccelerator.com for FREE custom controls.
    www.HardFind.com -buy/sell/trade your used hardware.

  3. #3
    _______ HeSaidJoe's Avatar
    Join Date
    Jun 1999
    Location
    Canada
    Posts
    3,946

    <?>

    Posted by Aaron Young some time ago
    Code:
    You can do it with a Standard Listbox, you just have to subclass it, i.e. 
    
    Add a Listbox to a Form, set the Style to 1 - Checkbox then... 
    
    In a Module:
    
    Option Explicit
    
    Private Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
    End Type
    
    Private Type DRAWITEMSTRUCT
            CtlType As Long
            CtlID As Long
            itemID As Long
            itemAction As Long
            itemState As Long
            hwndItem As Long
            hdc As Long
            rcItem As RECT
            itemData As Long
    End Type
    
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    
    Private 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 SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
    Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
    Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
    Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
    Private Declare Function DrawFocusRect Lib "user32" (ByVal hdc As Long, lpRect As RECT) As Long
    Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
    
    Private Const COLOR_HIGHLIGHT = 13
    Private Const COLOR_HIGHLIGHTTEXT = 14
    Private Const COLOR_WINDOW = 5
    Private Const COLOR_WINDOWTEXT = 8
    Private Const LB_GETTEXT = &H189
    Private Const WM_DRAWITEM = &H2B
    Private Const GWL_WNDPROC = (-4)
    Private Const ODS_FOCUS = &H10
    Private Const ODT_LISTBOX = 2
    
    Private lPrevWndProc As Long
    
    Private Function SubClassedList(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Dim tItem As DRAWITEMSTRUCT
        Dim sBuff As String * 255
        Dim sItem As String
        Dim lBack As Long
        
        If Msg = WM_DRAWITEM Then
        
            'Redraw the listbox
            'This function only passes the Address of the DrawItem Structure, so we need to
            'use the CopyMemory API to Get a Copy into the Variable we setup:
            Call CopyMemory(tItem, ByVal lParam, Len(tItem))
            
            'Make sure we're dealing with a Listbox
            If tItem.CtlType = ODT_LISTBOX Then
            
                'Get the Item Text
                Call SendMessage(tItem.hwndItem, LB_GETTEXT, tItem.itemID, ByVal sBuff)
                
                sItem = Left(sBuff, InStr(sBuff, Chr(0)) - 1)
                If (tItem.itemState And ODS_FOCUS) Then
                
                    'Item has Focus, Highlight it, I'm using the Default Focus
                    'Colors for this example.
                    lBack = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT))
                    Call FillRect(tItem.hdc, tItem.rcItem, lBack)
                    Call SetBkColor(tItem.hdc, GetSysColor(COLOR_HIGHLIGHT))
                    Call SetTextColor(tItem.hdc, GetSysColor(COLOR_HIGHLIGHTTEXT))
                    TextOut tItem.hdc, tItem.rcItem.Left, tItem.rcItem.Top, ByVal sItem, Len(sItem)
                    DrawFocusRect tItem.hdc, tItem.rcItem
                Else
                
                    'Item Doesn't Have Focus
                    'Create a Brush using the Color of the Listbox Window
                    lBack = CreateSolidBrush(GetSysColor(COLOR_WINDOW))
                    
                    'Paint the Item Area
                    Call FillRect(tItem.hdc, tItem.rcItem, lBack)
                    
                    'Set the Text Colors, using the ForeColor specified in the ItemData of the Item
                    Call SetBkColor(tItem.hdc, GetSysColor(COLOR_WINDOW))
                    Call SetTextColor(tItem.hdc, tItem.itemData)
                    
                    'Display the Item Text
                    TextOut tItem.hdc, tItem.rcItem.Left, tItem.rcItem.Top, ByVal sItem, Len(sItem)
                End If
                Call DeleteObject(lBack)
                
                'Don't Need to Pass a Value on as we've just handled the Message ourselves
                SubClassedList = 0
                Exit Function
                        
            End If
                
        End If
        SubClassedList = CallWindowProc(lPrevWndProc, hWnd, Msg, wParam, lParam)
    End Function
    
    Public Sub SubLists(ByVal hWnd As Long)
        lPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf SubClassedList)
    End Sub
    
    Public Sub RemoveSubLists(ByVal hWnd As Long)
        Call SetWindowLong(hWnd, GWL_WNDPROC, lPrevWndProc)
    End Sub
    In the Form with the Listbox(s):
    
    Private Sub Form_Load()
        Dim I As Integer
        For I = 0 To 15
            'Load a List of 0 to 15 with the Item Data
            'Set to the QBColors 0 - 15
            List1.AddItem "Color " & I
            List1.itemData(List1.NewIndex) = QBColor(I)
        Next
        'Subclass the "Form", to Capture the Listbox Notification Messages
        SubLists hWnd
    End Sub
    
    Private Sub Form_Unload(Cancel As Integer)
        'Release the SubClassing, Very Import to Prevent Crashing!
        RemoveSubLists hWnd
    End Sub
    
    
    This sets the Forecolor of the Item to the value specified in it's 
    ItemData, allowing you to easily change an Items color.
    __________________
    Aaron Young 
    Analyst Programmer 
    [email protected] 
    Certified AllExperts Expert
    
    to set the backcolor and not the forecolor use this 
    
    Else
                
                    'Item Doesn't Have Focus
                    'Create a Brush using the Color of the Listbox Window
                    lBack = CreateSolidBrush(GetSysColor(COLOR_WINDOW))
                    
                    'Paint the Item Area
                    Call FillRect(tItem.hdc, tItem.rcItem, lBack)
                    
                    'Set the Text Colors, using the ForeColor specified in the ItemData of the Item
                    Call SetBkColor(tItem.hdc, GetSysColor(COLOR_WINDOW))
                    Call SetTextColor(tItem.hdc, tItem.itemData)
                    
                    'Display the Item Text
                    TextOut tItem.hdc, tItem.rcItem.Left, tItem.rcItem.Top, ByVal sItem, Len(sItem)
                End If
    to 
             Else
                
                    'Item Doesn't Have Focus
                    'Create a Brush using the Color of the Listbox Window
                    lBack = CreateSolidBrush(tItem.itemData)
                    
                    'Paint the Item Area
                    Call FillRect(tItem.hdc, tItem.rcItem, lBack)
                    
                    'Set the Text Colors, using the ForeColor specified in the ItemData of the Item
                    Call SetBkColor(tItem.hdc, tItem.itemData)
                    Call SetTextColor(tItem.hdc, GetSysColor(COLOR_WINDOWTEXT))
                    
                    'Display the Item Text
                    TextOut tItem.hdc, tItem.rcItem.Left, tItem.rcItem.Top, ByVal sItem, Len(sItem)
                End If
    "A myth is not the succession of individual images,
    but an integerated meaningful entity,
    reflecting a distinct aspect of the real world."

    ___ Adolf Jensen

  4. #4
    Member
    Join Date
    Aug 2001
    Posts
    53
    Hello,

    What if I need to assign data to itemdata?
    I can't do 'List1.itemData(List1.NewIndex) = QBColor(I)'?

    I have a listbox which contains job names and I need to itemdata
    to hold job id. I want to set the font to gray for jobs that are not
    active in this listbox.

    Thanks in advance for any help or suggestions.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width