Das damit auch die Funktion CListCtrl::GetSubItemRect aus der MFC betroffen ist, ist dann auch klar.
Manche Sachen ärgern einen einfach. Vor allem wenn man nichts am Code ändert und doch falsches Verhalten erntet.
Wieder mal ist die Vista UI eigentümlich ungereimt, in diesem Fall bei einem List View.
Folgendes ist gegeben:
- Ein List View (SysListView32) in einem Dialog oder anderen Fenster
- Der List View hat den Stil LVS_REPORT
- Der List View hat hat mehr als eine Spalte.
- Dem List View wurde eine Imagelist zugewiesen.
Führt man nun auf Windows XP LVM_GETSUBITEMRECT /CListCtrl::GetSubItemRect mit LVIR_ICON aus, dann erhält man immer ein Rectangle zurück mit der entsprechenden Weite der Imagelist Symbole. Das Verhalten ist:
- vollkommen unabhängig ob ein Manifest für COMCTL32.DLL Version 6.0 vorhanden ist oder nicht
- es ist auch unabhängig ob LVS_EX_SUBITEMIMAGES gesetzt ist oder nicht.
Macht man das ganze unter Vista, dann liefert LVM_GETSUBITEMRECT /CListCtrl::GetSubbItemRect ein RECT / CRect mit der Weite der Symbole immer dann wenn:
- kein Manifest für COMCTL32.DLL Version 6.0 vorhanden ist
- oder LVS_EX_SUBITEMIMAGES gesetzt ist
Das heißt in dem Fall
- ein Manifest für COMCTL32.DLL Version 6.0 ist
- und LVS_EX_SUBITEMIMAGES ist nicht gesetzt .
erhält man ein Rectangle mit der Weite 0 (Null) 😕
Anmerkung:
Man kann sich natürlich streiten was nun richtig ist. Wenn LVS_EX_SUBITEMIMAGES nicht gesetzt ist, dann macht LVIR_ICON zugegebenermaßen wenig Sinn. Aber es leuchtet irgendwie nicht ein, dass ohne Manifest und ohne LVS_EX_SUBITEMIMAGES, wieder ein Wert zurückgeliefert wird. Entweder ist die Weite von LVS_EX_SUBITEMIMAGES abhängig oder eben nicht.
Das Ganze ist in jedem Falle mal ungereimt und nicht kompatibel ❗
Nachtrag 26.03.2009:
Das List-Control liefert für das Subitem 0 immer ein korrektes Rectangle für LVIR_ICON! Nur wenn wirklich ein Subitem (>0) abgefragt wird, tritt das Problem auf.
Die Listenansicht wurde für Vista völlig neu programmiert. Möglicherweise ist dabei das alte Verhalten als fehlerhaft eingestuft und korrigiert worden. Ohne Manifest wird ja die ComCtl32 v581 geladen, die quasi noch von Windows 2000 stammt.
Ist die wirklich komplett neu programmiert worden? ComCtrl32 V6 war doch schon unter XP dabei, evtl. wurde die für Vista nur erweitert bzw. geändert.
Die Listenansicht in XP ist noch prozedural programmiert, während die Vista-Version gänzlich objektorientiert ist.
Das ist Interessant, hast du vielleicht einen Link für mich zum einlesen?
Einen Link habe ich nicht. Aber der Debugger ist Dein bester Freund. 😉