Entwickler-Ecke

Windows API - Images in Listview (SysListView32)


UC-Chewie - Mo 30.06.03 19:42
Titel: Images in Listview (SysListView32)
In der DP konnte mir wohl keiner helfen, also bin ich auch mal hier gelandet.
Ich hab ein Listview (kein VCL!) mit dem VS_REPORT-Stil und will dort in einer Spalte (nicht in der ersten!) ein Image einfügen. Das Image hole ich aus einer Imagelist, die ich folgendermaßen erstelle und auffülle:



Delphi-Quelltext
1:
2:
3:
4:
5:
hLVImg := ImageList_Create(3216, ILC_COLOR, 03); 
        ImageList_AddIcon(hLVImg, LoadIcon(hInstance, MAKEINTRESOURCE(102))); 
        ImageList_AddIcon(hLVImg, LoadIcon(hInstance, MAKEINTRESOURCE(103))); 
        ImageList_AddIcon(hLVImg, LoadIcon(hInstance, MAKEINTRESOURCE(104))); 
        SendMessage(hIncIPView, LVM_SETIMAGELIST, LVSIL_SMALL, hLVImg);


Das gewünschte Image wird auch in der gewünschten Spalte angezeigt, allerdings nicht nur das. In der ersten Spalte wird immer vor dem Text das erste Image der Imagellist angezeigt, auch wenn dort kein Image stehen soll. So sieht die erste Spalte aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
VItem.mask := LVIF_TEXT;
      LVItem.iItem := rowIndex;
      GetTimeFormat(LOCALE_SYSTEM_DEFAULT, 0, @PacketRec.inTime, 'HH:mm:ss', @curTime, Length(curTime));
      LVItem.pszText := @curTime;
      SendMessage(hIncIPView, LVM_INSERTITEM, 0, Integer(@LVItem));


Hat einer eine Idee, woran das liegt und wie man es verhindert?

Ach ja, falls es hilft, das Listview wird so errzeugt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
//Listview erzeugen und initialisieren
        hIncIPView := CreateWindowEx(WS_EX_CLIENTEDGE, 'SysListView32'nil,
          WS_VISIBLE or WS_CHILD or LVS_REPORT or LVS_SINGLESEL, 1540465,
          150, hWnd, IDC_INCIPVIEW, hInstance, nil);
        SendMessage(hIncIPView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0,
          LVS_EX_FULLROWSELECT or LVS_EX_SUBITEMIMAGES or LVS_EX_GRIDLINES
          or LVS_EX_INFOTIP or LVS_EX_FLATSB);


Danke schonmal.


Anonymous - Mo 28.07.03 23:04

http://www.bendlins.de/nico ... da findest du eine Delphi-Version der Iczelion-Tuts. Da ist auch was zu Listviews dabei.

Oder direkt unter http://assarbad.net/stuff/!import/iczwin32.exe [http://assarbad.net/stuff/!import/iczwin32.exe]


Delete - Di 29.07.03 02:51

Da sthet es aber meines Wissens auch nicht drin. Allerdings bin ich auch gerade gescheitert. :roll:


Delete - Di 29.07.03 06:47

Die Anzeige des Items lässt sich zwar verhindern:

Delphi-Quelltext
1:
2:
LVItem.mask := LVIF_TEXT or LVIF_IMAGE;
LVItem.iImage := I_IMAGENONE; { I_IMAGENONE = -1}

aber dann hat man beim ersten Item trotzdem einen unschön wirkenden freien Bereich, in dem normalerweise das Bild zu sehen ist. IMHO liegt das aber generell an der Zuweisung einer ImageList.


UC-Chewie - Di 29.07.03 17:06

Oh, ich wusste gar nicht mehr, dass ich hier auch einen Thread aufgemacht hat :wink:

Aber ich habs inzwischen gelöst, und zwar eigentlich ganz simpel:

Die erste Spalte bekommt die Breite 0, und ich schieb den ganzen Rest eine Spalte nach rechts. Damit man sich die Spalte nicht mehr einblenden lassen kann, habe ich das Resizing für die erste Spalte deaktiviert, und zwar, indem ich die LVM_BEGINTRACKA bzw. LVM_BEGINTRACKW abgefangen hab.[/b]