LVM_GETSUBITEMRECT mit LVIR_ICON liefert andere Ergebnisse unter Vista als unter XP
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.
Themenverwandte Beiträge:
5 Kommentare zu “LVM_GETSUBITEMRECT mit LVIR_ICON liefert andere Ergebnisse unter Vista als unter XP”
Link für diesen Beitrag | RSS-Feed zu diesem Beitrag
Hinterlassen sie einen Kommentar:
Beachten sie bitte, dass Kommentare evtl. nicht sofort hier erscheinen. Die Kommentare werden zur Moderation an den Webmaster gesendet. Es kann also etwas dauern, bis Ihr Kommentar hier veröffentlicht wird!
on Do 19 Mrz 2009 um 10:51 # Sven
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.
on Do 19 Mrz 2009 um 15:02 # Dirk
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.
on Fr 20 Mrz 2009 um 18:57 # Sven
Die Listenansicht in XP ist noch prozedural programmiert, während die Vista-Version gänzlich objektorientiert ist.
on Sa 21 Mrz 2009 um 15:15 # Dirk
Das ist Interessant, hast du vielleicht einen Link für mich zum einlesen?
on Sa 21 Mrz 2009 um 20:02 # Sven
Einen Link habe ich nicht. Aber der Debugger ist Dein bester Freund.