Umschalten der Ansicht


Das Umschalten der Ansicht gestaltet sich relativ einfach. Man "entfernt" einfach den aktuellen Fensterstil für die Ansicht und setzt einen neuen. Dazu dienen uns zwei Funktionen, GetWindowLong und SetWindowLong. In unserem Fall interessiert uns dabei das "normale" Stilattribut, GWL_STYLE. Mit einer speziellen Prozedur, die als Beispiel im PSDK zu finden ist, können wir uns die Arbeit dabei erleichtern. Wir lesen zuerst den aktuellen Stil aus und ändern die Ansicht nur, wenn der gewünschte Stil noch nicht eingestellt ist:

procedure SetView(hWndListView: HWND; dwView: dword);
var
  dwStyle : dword;
begin
  dwStyle := GetWindowLong(hWndListView,GWL_STYLE);
if(dwStyle and LVS_TYPEMASK <> dwView) then SetWindowLong(hWndListView,GWL_STYLE, dwStyle and not LVS_TYPEMASK or dwView); end;

Anmerkung

and not stellt das Gegenstück zu or da und "löscht/entfernt" ein Attribut.


Im Fall unseres Beispielprogramms prüfen wir nun nur noch, welcher Menüeintrag gewählt wurde und rufen diese Prozedur mit dem gewünschten Stil für die Ansicht auf:

case LOWORD(wparam) of
  IDM_ICONS:
    SetView(hLV,LVS_ICON);
  IDM_SMICONS:
    SetView(hLV,LVS_SMALLICON);
  IDM_LIST:
    SetView(hLV,LVS_LIST);
  IDM_REPORT:
    SetView(hLV,LVS_REPORT);
end;

Hinweis für Windows XP

Ab Windows XP verfügt die List-View über eine eingebaute Funktion, "ListView_SetView", mit der sich die Ansicht umschalten lässt. Dazu ist allerdings auch wieder die schon erwähnte Manifest-Datei erforderlich. Nun könnte man meinen, dass der praktische Nutzen gegen Null tendiert, denn mit dieser neuen Funktion können die älteren Windows-Versionen ja nichts anfangen. Aber leider lässt sich nur auf diese Weise die neue "Tile"-Ansicht (Kacheln) unter Windows XP aktivieren. Deshalb müssen wir sie (zumindest unter XP) benutzen.

Ich habe es mir einfach gemacht und o.g. Funktion "SetView" erweitert. Wird das Programm unter Windows XP gestartet, dann werden die "alten" Werte benutzt, um die neue Funktion entsprechend aufzurufen. Die Ausnahme bildet nur der schon erwähnte "Kachelmodus", für den es natürlich keine "alte" Entsprechung gibt. Daher habe ich den Wert "666" benutzt.

LVS_ICON:
  ListView_SetView(hLV,LV_VIEW_ICON);
LVS_SMALLICON:
  ListView_SetView(hLV,LV_VIEW_SMALLICON);
LVS_LIST:
  ListView_SetView(hLV,LV_VIEW_LIST);
LVS_REPORT:
  ListView_SetView(hLV,LV_VIEW_DETAILS);
666:
  ListView_SetView(hLV,LV_VIEW_TILE);

Hinter der Funktion steckt eine neue Nachricht, "LVM_SETVIEW", mit ein paar neuen Konstanten. Zu dieser Nachricht gibt es auch ein Gegenstück, "LVM_GETVIEW" (bzw. "ListView_GetView"), mit dem Sie herausfinden können, welcher Modus gerade aktiv ist.

lvMode := ListView_GetView(hLV);