Click to See Complete Forum and Search --> : Each Listbox item with a different colour
Milleniux
Nov 4th, 1999, 08:03 PM
I would like to add an item to a listbox and give it a different colour to another item in the same listbox. I shall accept all help graciously.
Thanx
johnpc
Nov 4th, 1999, 09:19 PM
It can't be done. The ListBox Foreground Property sets the color of the Text for the
complete ListBox.
If you wanted just one line of data to have
a different color you could make three ListBoxes with the top and bottom red and the middle blue. Then you would show the line that you wanted to highlight in the middle box, however this takes quite a bit of coding
------------------
Milleniux
Nov 4th, 1999, 09:40 PM
Surely there has to be a way to do it.
There is so many other spectacular things than can be achieved using VB, yet you cant have a list of items of different colours.
M.
Aaron Young
Nov 4th, 1999, 10:07 PM
Sure it can be done, just not easily, here's the code I created and posted a while back, it adds the Items to the Listbox with Different Colored Backgrounds, but can be easily modified to have different colored ForeColors instead:
Add a Listbox to a Form with the Style set to 1 - Checkbox
In a Module..
Option Explicit
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public 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
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public 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
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Public Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Public Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Public 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
Public Declare Function DrawFocusRect Lib "user32" (ByVal hdc As Long, lpRect As RECT) As Long
Public Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
Public Const COLOR_HIGHLIGHT = 13
Public Const COLOR_HIGHLIGHTTEXT = 14
Public Const COLOR_WINDOW = 5
Public Const COLOR_WINDOWTEXT = 8
Public Const LB_GETTEXT = &H189
Public Const WM_DRAWITEM = &H2B
Public Const GWL_WNDPROC = (-4)
Public Const ODS_FOCUS = &H10
Public Const ODT_LISTBOX = 2
Public lPrevWndProc As Long
Public 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, Draw it's Colored Background
'Create a Brush using the Color we stored in ItemData
lBack = CreateSolidBrush(tItem.itemData)
'Paint the Item Area
Call FillRect(tItem.hdc, tItem.rcItem, lBack)
'Set the Text Colors
Call SetBkColor(tItem.hdc, tItem.itemData)
Call SetTextColor(tItem.hdc, IIf(tItem.itemData = vbBlack, vbWhite, vbBlack))
'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
In the Form..
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
lPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf SubClassedList)
End Sub
Private Sub Form_Unload(Cancel As Integer)
'Release the SubClassing, Very Import to Prevent Crashing!
Call SetWindowLong(hwnd, GWL_WNDPROC, lPrevWndProc)
End Sub
------------------
Aaron Young
Analyst Programmer
aarony@redwingsoftware.com
adyoung@win.bright.net
Milleniux
Nov 7th, 1999, 03:28 PM
Cheers Aaron ... Works great!
Cimperiali
Oct 15th, 2002, 11:05 AM
Hi, man!
Happy to read from you again!
Cesare Imperiali
(ex Codeguru Rater)
vishalpatel
Oct 29th, 2004, 12:06 AM
dear friends,
actully i want toset diffrent back color of each items of a listbox.
i have tried "Aaron Young "'s code , its working but the style property which we set to "Checkbox" at design time ,though the checkboxes were not displyed when we run this code.
so can u suggest me to wht should i do if iwant to set diff back /fore color of each item and also want to checkboxes of each item?
vishal patel
toughcoder
Oct 29th, 2004, 01:10 AM
3 cheers for Aaron. Gr8 code buddy :afrog:
crptcblade
Oct 29th, 2004, 05:55 AM
Originally posted by vishalpatel
dear friends,
actully i want toset diffrent back color of each items of a listbox.
i have tried "Aaron Young "'s code , its working but the style property which we set to "Checkbox" at design time ,though the checkboxes were not displyed when we run this code.
so can u suggest me to wht should i do if iwant to set diff back /fore color of each item and also want to checkboxes of each item?
vishal patel
The listbox is set to owner drawn when it displays checkboxes. You are overriding the default code that draws each listitem, so you'll have to draw the checkboxes yourself as well.
vishalpatel
Oct 29th, 2004, 06:35 AM
tell me first how can i draw checkbox manually?
do u meto say using putting checkboxcontrol over listbox?
plz explain me again.
or giv me code of doing so
vishal
toughcoder
Oct 29th, 2004, 07:00 AM
Hello vishal,
u shud draw the checkbox using the API calls like Line, Rectangle. I mean draw the basic checkbox look like a windows control. Search around on www.planet-source-code.com for some examples.
crptcblade
Oct 29th, 2004, 07:18 AM
The DrawFrameControl will do it as well.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/pantdraw_4b3g.asp
Bombdrop
Oct 29th, 2004, 07:40 AM
You could also have a look at the following FREE activeX control MBListEX Control (http://www.vbcity.com/mbgallery/default.asp?comp=mblistex) Yhis allows tou to have different fonts for each list item change back colour for each item and also to add pic to each iteam pluse helps with search of the Listbox all in in a great control
Hope this helps
vishalpatel
Nov 2nd, 2004, 10:57 PM
thanx Bombdrop,
but as i have mention previously. irequired the listbox with checkbox and the diffrent back color for each item.
as u have told the control "MBListEX Control " do the diffrent back color for each item but not have any property to diplay item with checkbox .
so do u have any other suggetion.
if , then plz help me.
waiting for ur reply and agin thax.
vishal
vbforums.com
Copyright Internet.com Inc., All Rights Reserved.