|
Als ein möglicher Lösungsansatz kann eine CListCtrl erzeugt werden, die in zwei Spalten den Feldnamen und Feldwert abbildet.
Hier kann zum einen mit Kanonen auf Spatzen geschossen werden, da Untereinträge problemlos editierbar gemacht werden können. Da jedoch nur ein Eintrag pro Zeile editiert werden muß, ist es sinnvoller, die Liste bezüglich der Spalten zu sortieren, so daß der zu editierende Eintrag in der zweiten Spalte zu liegen kommt. Dazu reicht der nachfolgende Code aus:
int aiCol[2] = { 1, 0 };
m_List.SetColumnOrderArray (2, aiCol);
Etwas problematischer wird es, wenn der Anwender in der Lage sein soll, mittels Tabulator- und Pfeil-Tasten durch die Felder zu blättern. Dies liegt primär daran, daß die CListCtrl ihre eigenen Editboxen für zu editierende Einträge erzeugt und dadurch alle Tastatureingaben schluckt.
Da es nicht unbedingt wünschenswert ist, eine eigene Editbox zu zeichnen und zu verwalten, kommt als Ausweg in Frage, eine von CEdit abgeleitete Klasse zu erzeugen und für die von der CListCtrl erzeugte Editbox Subclassing anzuwenden.
Für das Subclassing der Edit Cotrol mit einer eigenen Edit Control m_Edit sind zwei wesentliche Arbeitsschritte erforderlich.
Innerhalb der Nachrichtenbehandlung für das Ereignis LVN_BEGINLABELEDIT ist der nachfolgende Code einzufügen:
HWND hWnd = (HWND)SendMessage (LVM_GETEDITCONTROL);
ASSERT (hWnd != NULL);
if (m_Edit.m_hWnd != 0)
m_Edit.DestroyWindow ();
VERIFY (m_Edit.SubclassWindow (hWnd));
In der Ereignisbehandlung der Nachricht LVN_ENDLABELEDIT ist analog der bereinigende Code
if (m_Edit.m_hWnd)
VERIFY(m_Edit.UnsubclassWindow () != NULL);
einzusetzen, um das Subclassing zu beenden.
Anschließend kann über die eigene m_Edit Klasse ein Messagehandler verwendet werden, um das KeyDown-Ereignis abzufangen und bezüglich der auszuwerten. Liegt eine Tabulator- bzw. Pfeil-Taste an, kann das Editieren des nächsten bzw. vorherigen Eintrags veranlaßt werden.
|