webForumDet fria alternativet

Listview + bakgrundsbild + ikon?

.NET

8 svar · 362 visningar · startad av krupp

Medlem sedan juni 200314 inlägg
Frågan#1

VB5. Common controls 5.
Jag har en listview. Har satt en bakgrundsbild. Och första kolumnen kan ha en ikon. Bakgrundsbilden fungerar, men bara om det inte finns någon ikon i någon rad. Om det finns en ikon så blir hela den kolumnen utan bakgrundsbild, vilket ser ganska dumt ut.

Finns det något sätt att kringå detta? Jag har ett indexnummer i första kolumnen också, så det är inte bara ikonen. Så kolumnen kan bli ganska bred och ful när den är helt vit medan alla andra kolumner får bakgrunden.

/dr Krupp

Medlem sedan juni 20022 599 inlägg
#2

Kan inte påstå att jag känner igen problemet (VB6 + sp5). Har du en skärmdump eller nåt exempelprojekt som illustrerar hur du menar?

Medlem sedan juni 200314 inlägg
#3

Naturligtvis är det bättre med en illustrerande bild, men jag trodde att det var ett förekommande fenomen. Nåja, det kanske fungerar bättre i VB6, men jag vågar inte byta Common controls 5 till 6 eftersom jag hört att det kan bli trubbel då.

Hur som helst, här är en skärmdump:
http://www.drkrupp.se/_bildexempel_listview_bakgrundsbild_ikon.gif

/dr Krupp

Medlem sedan juni 20022 599 inlägg
#4

När jag försöker göra likadant i VB6 så får jag iaf inget problem med transparensen mot bakgrundsbilden (se bilaga).

Lite frågor:

1. Är det likadant vilka ikoner och bakgrundbilder du än använder?
2. Har du den senaste service packen för VB5?
3. Hur har du fått fullrowselect i VB5? Är det via API:er? Och isåf: Är problemet kvar om du tar bort den?
4. På din bild ser det ut som om du har ikonen i andra kolumnen. Hur har du gjort det?

lview.jpg
Medlem sedan juni 200314 inlägg
#5

1. Ja, det är samma sak oavsett ikoner och bakgrundsbild.
2. Jag tror jag har den senaste service packen. men jag vet inte, jag har ingen aning om vare sig vilken jag har och vilken som finns.
3. Ja, jag har fullrowselect. Ja, det är via API. Märkligt nog fungerar det om jag tar bort fullrowselect.
4. Det råkade se ut som det, eftersom jag flyttat en annan kolumn till en plats före första kolumnen. Jag kan bara ha ikoner i kolumn#1, men jag behöver inte ha kolumn#1 på plats #1, om man säger så.

Vidare:
Jag har nog fullständigt tappat vettet eftersom jag inte blir klok på detta för fem öre. Jag kom på att jag ju har flera Listviews i programmet, och att de har samma API-grejer... och för dessa fungerar minsann bakgrundsbiden som den ska (och fullrowselect). Men lögn att få den viktigaste listviewn att fungera.... vb i ett nötskal känns det som. Alltid något att hänga upp sig på. Och när jag försöker flytta om en massa kod så får jag plötsligt obegripligt märkliga fel... som att programmet läser in inställningsfiler helt fel och annan knas, trots att jag inte varit i närheten av den koden. Verkar som att VB buggar ur när det börjar bli hett om öronen.

73.000 rader kod, och så lyckas man inte komma runt en sån här struntsak,... *suck*

Medlem sedan juni 20022 599 inlägg
#6

krupp skrev:

Märkligt nog fungerar det om jag tar bort fullrowselect.

Bingo ..

krupp skrev:

Jag kom på att jag ju har flera Listviews i programmet, och att de har samma API-grejer... och för dessa fungerar minsann bakgrundsbiden som den ska (och fullrowselect).

Nu kör jag inte VB5 och kan inte testa, men jag har för mig att man åstadkommer det via SendMessage och kan tänka mig att det spelar roll när man gör det (innan eller efter man lägger till sina listitems.) Kolla på koden för de listvyer som funkar och försök göra i samma ordningsföljd. Kolla också andra inställningar för listvyerna ifall det (eventuellt) är nåt annat som skiljer.

krupp skrev:

vb i ett nötskal känns det som. Alltid något att hänga upp sig på.

Hmm .. Förtal av Microsoftprodukt. Allvarliga saker .. ;)

Medlem sedan juni 200314 inlägg
#7

Alltså, tack för alla tips och så. Men här sitter man och blir alldeles röd av att inte komma någon vart alls.

- Det verkar inte spela någon roll om jag lägger till listinnehållet före eller efter jag sätter bakgrundsbilden. Jag provade att plocka ut koden för bakgrundsfärgen för en listview som funkar, och lägga den under en knapp istället. Och det fungerar att sätta bild vare sig listan är tom eller inte.

Bifogar lite rolig kod.

Modul:
Public Const LVS_EX_GRIDLINES = &H1
Public Const LVS_EX_SUBITEMIMAGES = &H2
Public Const LVS_EX_CHECKBOXES = &H4
Public Const LVS_EX_TRACKSELECT = &H8
Public Const LVS_EX_HEADERDRAGDROP = &H10
Public Const LVS_EX_FULLROWSELECT = &H20
Public Const LVS_EX_ONECLICKACTIVATE = &H40
Public Const LVS_EX_TWOCLICKACTIVATE = &H80
Public Type LVBKIMAGE
uFlags As Long
hBmp As Long
pszImage As String
cchImageMax As Long
xOffsetPercent As Long
yOffsetPercent As Long
End Type
Public Declare Function SendMessageAny Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const LVM_FIRST = &H1000
Public Const LVM_SETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 54
Public Const LVM_GETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 55
Public Const LVS_FULLROWSELECT = &H20
Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

'-------------------------------------------------------
Private Sub Form_Load()

Dim lStyle As Long
Dim tmp As Long
'Set ListView Extended Styles
lStyle = SendMessageLong(ListView1.hWnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0&, 0&) 'Just uncomment the styles
If frmmain.mnufilmlista_gridlines.Checked = True Then lStyle = lStyle Or LVS_EX_GRIDLINES 'Gridlines in ListView
'lStyle = lStyle Or LVS_EX_GRIDLINES 'Gridlines in ListView
'lStyle = lStyle Or LVS_EX_SUBITEMIMAGES 'Dont know
'lStyle = lStyle Or LVS_EX_CHECKBOXES 'Inserts checkbox beside eachItem
'lStyle = lStyle Or LVS_EX_TRACKSELECT 'Selection follows the mousecursor
lStyle = lStyle Or LVS_EX_HEADERDRAGDROP 'Columns can be moved by draging them
lStyle = lStyle Or LVS_EX_FULLROWSELECT 'Selects the whole row instead of the column one
'lStyle = lStyle Or LVS_EX_ONECLICKACTIVATE 'I don't know, what itsays?
'lStyle = lStyle Or LVS_EX_TWOCLICKACTIVATE 'I don't know, what itsays?
tmp = SendMessageLong(ListView1.hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0&, lStyle)

End Sub

'--------------------------------------------------------

Public Sub Form_Activate()

'sätt färg i listan
ListView1.ForeColor = frmsetupTab.lblexempel.ForeColor
ListView1.BackColor = frmsetupTab.lblexempel.BackColor
ListView1.Font.Bold = frmsetupTab.lblexempel.FontBold
ListView1.Font.Size = frmsetupTab.lblexempel.FontSize
ListView1.Font.Name = frmsetupTab.lblexempel.FontName

Dim BKIMG As LVBKIMAGE
Dim PixPathTile As String
PixPathTile = App.Path & "\bg.gif"
'prepare the backimage structure data
With BKIMG
'use the file provided in pszImage and tile
.uFlags = LVBKIF_SOURCE_URL Or LVBKIF_STYLE_TILE
'the imagefile to display
.pszImage = (PixPathTile)
'h&v offsets for the pix (only if tiled not specified)
'.xOffsetPercent = 0
'.yOffsetPercent = 0
End With
'set the text background to none (transparent) to
'allow image to show through. A RGB() value can
'also be passed to colour the text background
'(to the edge of the control)
Call SendMessageLong(ListView1.hWnd, LVM_SETTEXTBKCOLOR, 0&, CLR_NONE)
'set the image to the listview
Call SendMessageAny(ListView1.hWnd, LVM_SETBKIMAGE, 0&, BKIMG)
End Sub

'----------------------------------------------------------------------

Typ så ser det ut... nånting... Ganska obegripligt. Och det har blivit så mycket api-krafs att jag inte vet riktigt vad som hör till vad... och vad det ska vara bra för.

Och hur får man tag på Visual Basic 6? Vad kostar det? Finns det att köpa i butik?
(knycklar ihop VB5 och kastar ut genom ... ozonlagret!)

Medlem sedan juni 200314 inlägg
#8

Okej, fellas... känns som att jag ger upp nu. Har provat det mesta, med bedrövliga resultat. :r

Bara att deklarera det fakto att programmet inte har support för bakgrundsbild i vissa listor. §jr

Kul i alla fall att ett av mina (betydligt) mindre program plötsligt tittar fram ur PC för Allas tidning, med ett vackert betyg. *smygreklam* ... kanske är det såna här små erkännelser som håller en amatörprogramerare rakryggad...

Bild bifogad. (glöm länken de angett... jag har inte längre Passagen som "webbhotell" )

/dr Krupp

backup_pcforalla_nr5juni2003.jpg
Medlem sedan juni 200314 inlägg
#9

Jag klurade ut problemet. Utan att egentligen göra, eller lösa, nånting.

* Jag använder API för att kunna ändra kolumnordningen.
* Om jag stängde av funktionen fungerade bakgrundsbilden.
* Om jag satte på funktionen, men valde att ha kolumn#1 på plats#1 så blev det ju plötsligt bra.

Summa: Bakgrundsbild + ikon i listview fungerar bara om ikon-kolumnen är på sin rätta plats, dvs plats 1.

Skumt, sa räven.

Kan ni som kör VB6 kolla ifall det är samma fenomen där? (fast det spelar ju egentligen ingen roll)

Tack ändå.

Tjohej.

/dr Krupp

274 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)