CListCtrl & CImageList
-
Hi Ihr Experten im www,
ich hab da mal wieder ein Problem.
Und zwar geht es diesmal um eine Liste.Folgendes sollte umgesetzt werden:
Zu Beginn besteht eine leere Liste im Icon-View. In einer Add-Funktion wird dieser Liste ein Item hinzugefügt. Zudem wird ein CBitmap erstellt und in eine ImageListe hinzugefügt, welche dann als Bildquelle für die Liste dienen soll.
Allerdings besteht folgende Anforderung:
Um Speicherplatz zu sparen, soll die Image-Liste nur die Anzahl an Bildern beinhalten, die angezeigt werden kann, d.h., dass selbst wenn die ListCtrl 1000 Einträge beinhaltet, die ImageListe 4 Bilder aus dem sichtbaren Bereich der ListCtrl enthält.
Die entsprechenden Bilder, welche zu den Items gehören, sind bereits in die ImageListe geladen und müssen jetz nur noch angezeigt bzw. dem Items der Liste zugeordnet werden. Allerdings stoße ich hier auf ein Problem./* Member-Variablen: CListCtrl m_oImageList_ctrl; CImageList m_ImageList; int m_iFirstImage; //Index des ersten sichtbaren Listeneintrags int m_iCountPerPage; //Bildanzahl, die sichtbar sein kann OBJECT m_dadFullSizeObj; //eigene Objectklasse, die Bilddaten enthält */ void CInspectionImageOutput::UpdateListCtrl() { int i, iCPP; //temporaere Itemanzahl insichtbarem Bereich if(m_oImageList_ctrl.GetItemCount() < m_iCountPerPage) iCPP = m_oImageList_ctrl.GetItemCount(); else iCPP = m_iCountPerPage; //ImageListe leeren while(m_ImageList.GetImageCount()) m_ImageList.Remove(0); //Bild erzeugen und zur ImageListe addieren for(i = 0; i < iCPP; i++) { CBitmap bmpDest, bmpSrc; bmpSrc .CreateBitmap(dat_i2dx(m_dadFullSizeObj), dat_i2dy(m_dadFullSizeObj), 1, 32, dat_lnk(m_dadFullSizeObj)); bmpDest.CreateBitmap(IMG_SIZE,IMG_SIZE, 1,32, NULL); CDC cdcSrc, cdcDest; cdcSrc .CreateCompatibleDC(GetDC()); cdcDest.CreateCompatibleDC(GetDC()); HBITMAP hOldSrc = (HBITMAP)SelectObject(cdcSrc .m_hDC, bmpSrc); HBITMAP hOldDest = (HBITMAP)SelectObject(cdcDest.m_hDC, bmpDest); cdcDest.SetStretchBltMode(COLORONCOLOR); cdcDest.StretchBlt(0,0,IMG_SIZE,IMG_SIZE,&cdcSrc, 0,0,dat_i2dx(m_dadFullSizeObj),dat_i2dy(m_dadFullSizeObj),SRCCOPY); SelectObject(cdcSrc .m_hDC, hOldSrc); SelectObject(cdcDest.m_hDC, hOldDest); m_ImageList.Add(&bmpDest, (CBitmap*)NULL); } m_oImageList_ctrl.SetImageList(&m_ImageList, LVSIL_NORMAL); //Imageliste auf Items uebertragen for(i = 0; i < iCPP; i++) { LVITEM oItem; oItem.iItem = m_iFirstImage + i; oItem.mask = LVIF_IMAGE; m_oImageList_ctrl.GetItem(&oItem); oItem.iImage = i; m_oImageList_ctrl.SetItem(&oItem); m_oImageList_ctrl.GetItem(&oItem); this->Invalidate(); } }In der letzten for-Schleife, wenn ich den jeweiligen Items die Imagenummer aus der ImageList zuweisen will, werden diese Werte nicht gesetzt bzw. nicht übernommen. Geprüft habe ich das mit einer weiteren Schleife im Anschluß, in der ich noch einmal GetItem(...) aufgerufen hab und dieser Wert nicht inizialisiert war.
Alle Items außerhalb des sichtbaren Bereiches der Liste können uninizialisiert bleiben. Lediglich die angezeigten Listeneinträge sollen die auch entsprechenden Bilder darstellen.Kann mir von euch jemand helfen, wie ich die entsprechenden Bilder den Items zuweisen kann/ muss?

Ich bin für jeden Tipp sehr dankbar.LG
Antivirus
-
Hast Du überhaupt mit InsertItem etwas eingefügt?
-
Ja. Hab ich. Das is nur die Funktion, in der die Bilder überarbeitet werden sollten und den entsprechenden Items zugeordnet.
Zuvor füge ich der Liste schon Items hinzu und rufe anschließend diese Funktion auf.Aber ich hab meinen Fehler schon (nach weiteren 3,5 Std vervenzermürbender Suche) gefunden

Im Prinzip stand es auch schon in der Hilfe drin, wenn man lesen kann.
Der SubItem ist einsbasierend und wenn ich den vorher noch auf 0 inizialisiere, bezieht er den Item auf das gesamte und holt (GetItem(...)) bzw. setzt (SetItem(...)) die korrekten Werte ^^Sieht dann so aus für alle, die auch auf das Problem stoßen sollten:
... LVITEM oItem; oItem.iItem = m_iFirstImage + i; [b]oItem.iSubItem = 0;[/b] oItem.mask = LVIF_IMAGE; m_oImageList_ctrl.GetItem(&oItem); oItem.iImage = i; m_oImageList_ctrl.SetItem(&oItem); ...Dennoch danke für die Hilfsbereitschaft ^^
LG
Antivirus