Programmierung (Abgabe bis 02.05.2005): Es soll ein geteiltes Fenster verwendet werden. Auf der linken Seite
eine CFormView, auf der rechten eine CView. Die FormView soll ein ListControl enthalten.
Im ListControl muss man die Property "View" auf "Report" umstellen um Spalten zu erhalten.
Sie soll zwei Spalten "Name" und "Vorname" enthalten. Eine CListView würde sich zwar vom Namen her anbieten, allerdings ist dabei die "View"-Property
der ListView mit der Toolbar verknüpft und ich habe es nicht geschafft sie programmatisch
umzuschalten bzw. zu aktivieren :-(. Außerdem sollte unsere ListView fest als "Report"-View
angezeigt werden, ohne dass der User umschalten kann.
Auf der rechten Seite bitte eine CView (keine CFormView) verwenden, da kommende
Abgaben sich mit Zeichnen beschäftigen ! Deshalb alle Texte im OnDraw pixelgenau ausgeben.
Für das ListControl fügen wir eine Membervariable vom Typ "Control" zu (im Beispiel "mListCtrl").
Initialisieren und Befüllen (im OnUpdate):
//Beim allerersten Befüllen die Spalten erzeugen:
if (this->mListCtrl.GetHeaderCtrl()->GetItemCount() == 0)
{
this->mListCtrl.InsertColumn (0, "Name", LVCFMT_LEFT, 100, -1);
this->mListCtrl.InsertColumn (1, "Vorname", LVCFMT_LEFT, 100, 1); //Verknüpfen mit SubItem-Index 1
}
this->mListCtrl.DeleteAllItems();
//1. Zeile:
this->mListCtrl.InsertItem (0, "Meier");
LVITEM lvItem;
//SubItem in 2. Spalte:
lvItem.mask = LVIF_TEXT;
lvItem.iItem = 0;
lvItem.iSubItem = 1; //One-based index of the subitem to which this structure refers, or zero if this structure refers to an item rather than a subitem.
lvItem.pszText = "Otto";
this->mListCtrl.SetItem (&lvItem);
//2. Zeile:
this->mListCtrl.InsertItem (1, "Huber");
lvItem.iItem = 1;
lvItem.iSubItem = 1;
lvItem.pszText = "Heinz";
this->mListCtrl.SetItem (&lvItem);
Hinweis zu diesem Code: Theoretisch würde ich die Spalten-Initialisierung in "OnInitialUpdate"
packen, allerdings wurde das erst NACH dem ersten "OnUpdate" aufgerufen, d.h. der Initial-Zustand
hätte die Vorname-Spalte nicht korrekt angezeigt !
Für das Erkennen der Auswahländerung fangen wir das Event "LVN_ITEMCHANGED" ab.
Da sich bei der Auswahländerung der Zustand von zwei Items ändert (das bisher gewählte
hat danach nicht mehr den "selected"-Zustand, dafür aber das neue) und das Event dadurch
bei einem Klick mehrfach aufgerufen wird hilft folgender Code, nur das neu gewählte Item
zu verarbeiten:
if ((pNMLV->uNewState & LVIS_SELECTED) == LVIS_SELECTED)
{
CString sMessage;
sMessage.Format ("OnLvnItemchangedList for item %d! ", pNMLV->iItem);
AfxMessageBox ( sMessage);
}
Der Index des neuen Items steckt in "pNMLV.iItem".