CListCtrl und CComboBoxEx: Bild des selektierten Eintrags verschwindet
-
Hi,
ich habe sowohl mit einem CListCtrl als auch mit einer CComboBoxEx das Problem, dass das Bild (Bitmap) des selektierten Eintrags nicht angezeigt wird. Die Bilder der nicht selektierten Einträge sind sichtbar.
Ich vermute, dass in beiden Fällen die mit dem jeweiligen Control verknüpfte CImageList dafür verantwortlich ist, weiß aber nicht, wo der Fehler liegen könnte. Kann das mit der Maske der ImageList zu tun haben?
Ein paar zusätzliche Infos:
Im Fall des ListControls habe ich das Problem so umgangen, dass ich als erweiterten Stil LVS_EX_BORDERSELECT verwendet habe. Es wird also beim Selektieren eines Eintrags das Bild nicht markiert ("ge-highlighted") sondern ein Rahmen um das Bild gezeichnet.
Im Fall der ComboBox habe ich für den selektierten und den unselektierten Zustand dasselbe Bild der ImageList gewählt. Trotzdem wird das Bild nicht mehr angezeigt, sobald ein Item selektiert wurde.
COMBOBOXEXITEM cbi; CString str; int nItem; cbi.mask = CBEIF_IMAGE | CBEIF_SELECTEDIMAGE | CBEIF_TEXT; iter = container.begin(); int itemCount = 0; while(iter != container.end()) { cbi.iItem = itemCount; str = ((*iter)->GetName()).c_str(); cbi.pszText = (LPTSTR)(LPCTSTR)str; cbi.cchTextMax = 256; cbi.iImage = itemCount; // (*) cbi.iSelectedImage = itemCount; // (*) nItem = m_Combo.InsertItem(&cbi); ASSERT(nItem == itemCount); itemCount++; iter++; }Meine Imgagelists habe ich folgendermaßen erstellt:
m_pImageList = new CImageList; m_pImageList->Create(32, 32, ILC_COLOR32, 0, 50);und die Bitmaps so hinzugefügt:
m_pImageList->Add(&image, RGB(0, 0, 0));wobei der zweite Parameter ignoriert werden sollte (wenn ich die Dokumentation in der MSDN http://msdn2.microsoft.com/en-us/library/b9h1bwdk(VS.80).aspx richtig verstehe), weil ich das Flag ILC_MASK nicht mit angegeben habe...
Hätte ich trotzdem eine andere "Überladung" von CImageList::Create verwenden sollen?
Wie gesagt: ich vermute, dass in beiden Fällen beim Selektieren eines Eintrags derselbe Vorgang ausgeführt wird (z.B. irgendein Overlay-Image visualisiert wird oder dem Bild eine Maske überlagert wird, o.ä.) und mit meinen ImageLists etwas nicht stimmt.
Ich hoffe, mir kann jemand einen Rat geben.
Vielen Dank im Voraus!
-
Hast Du wirklich für jedes Item ein anderes Symbol?
Oder hast Du immer das selbe Symbol?Ich übergebe diesen Wert nicht, wenn das selektierte Item sich nicht unterscheidet von dem normalen Item!
-
Martin Richter schrieb:
Hast Du wirklich für jedes Item ein anderes Symbol?
Oder hast Du immer das selbe Symbol?Danke erstmal für die Antwort!
Ich habe für jedes Item ein anderes Symbol, möchte allerdings für die unterschiedlichen Zustände eines Items (selektiert/nicht slektiert) dasselbe Item verwenden.
D.h. sowohl im ListControl als auch in der ComboBox tauchen sämtliche Einträge mit ihren zugehörigen Bildchen auf. Wenn ich ein Element selektiere, möchte ich, dass dieses Bildchen unverändert bleibt (und nur der Text "markiert" wird). Stattdessen wird aber nur der Text markiert und das zuvor sichtbare Bildchen verschwindet.Martin Richter schrieb:
Ich übergebe diesen Wert nicht, wenn das selektierte Item sich nicht unterscheidet von dem normalen Item!
Ich nehme an, du beziehst dich dabei auf die Zuweisung von cbi.iSelectedImage?
Die habe ich eigentlich nur vorgenommen, weil es zuvor ohne diese Zuweisung genausowenig funktioniert hat. Vorher hatte ich das folgendermaßen:
//... cbi.mask = CBEIF_IMAGE | CBEIF_TEXT; //... cbi.iImage = itemCount; //...