webForumDet fria alternativet

Färga visa listbox inlägg

.NET

2 svar · 200 visningar · startad av PishtheDJ

Medlem sedan feb. 200222 inlägg
Frågan#1

Hej..
Går det att färga visa listbox inlägg??
Skulle varit skitbra till mitt RPG-spel!!

------------------
Marcus
-------------
"Kroppen är en koagulerad tanke."

Medlem sedan dec. 19991 072 inlägg
#2

Ja och nej... :)

Du kan egentligen inte färga om varje rad i en listbox...men däremot så kan man använda API för att färga texten på varje rad i en listbox.

Detta kräver dock att listbox.ens "style" är satt till "1" (checkbox).

Du får använda en teknik som kallas "subclassing".

Kod till formuläret:
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">
' // Remeber you are subcalssing so close with the x and not the vbStop
' // if not you will crash vb

'// This sets the Forecolor of the Item to the value specified in it's
'// ItemData, allowing you to easily change an Items color.

'// Listbox style must be 1 Checkbox for this to work.
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)
End If
Next
'// Subclass the "Form", to Capture the Listbox Notification Messages
SubLists hWnd

End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
'Release the SubClassing, Very Import to Prevent Crashing!
RemoveSubLists hWnd
End Sub

Lägg följande kod i en ny modul:
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">
' // 888888888888888888888888888888888888888888888888888888
' // Module code
'// 8888888888888888888888888888888888888888888888888888888

' // Remeber you are subcalssing so close with the x and not the vbStop
' // if not you will crash vb
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

Det är inte jag själv som skrivit exemplet.

Var noga med att stänga fönstret på "X"-knappen och INTE med stopp-knappen, för då kraschar VB.

------------------
Fredrik Klarqvist
f.klarqvist@spray.se
http://server.webwerkstaden.se/fredde/

Medlem sedan feb. 200222 inlägg
#3

Många tack!!!
De blir bara hem och testa!!!

------------------
Marcus
-------------
"Kroppen är en koagulerad tanke."

265 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)