Programmieren mit C++

Borland C++

32-Bit-Programmierung

Editieren des Labeltextes einer TreeView Control

Wie wird der Labeltext einer TreeView Control editiert?

Frage

Voraussetzung für das Editieren des Labeltextes ist das Setzen des Fensterstils TVS_EDITLABELS, ohne den die TreeView Control keine Edit-Eingaben zuläßt.

Ist der Stil gesetzt, erfolgt das Editieren im Regelfall automatisch, indem der Anwender einen länger dauernden Mausklick auf das Label vornimmt. Als Reaktion darauf sendet die TreeView eine Benachrichtigung vom Typ TVN_ BEGINLABELEDIT, die im lParam einen Zeiger auf eine TV_ DISPINFO Struktur übergibt. Im Member item dieser Struktur sind die Felder hItem, state, pszText und lParm gesetzt, so daß der jeweilige Eintrag eindeutig identifizierbar ist.

Durch die Rückgabe von TRUE auf die Benachrichtigung TVN_BEGINLABELEDIT wird das Editieren unterdrückt, während FALSE das Editieren des Labeltextes erlaubt. Damit können einzelne Einträge programmgesteuert von Änderungen ausgeschlossen werden.

Ist das Editieren beendet, löst die TreeView Control eine TV_ ENDLABELEDIT Benachrichtigung aus. Im lParam steht wiederum eine TV_DISPINFO Struktur, deren TV_INFO Member wie zuvor besetzt ist. Jedoch enthält pszText jetzt den neuen Labeltext, sofern die Aktion korrekt beendet wurde. Im Falle eines Abbruchs der Eingabe enthält pszText ein NULL-Handle. Mit Übergabe der Benachrichtigung ist der Text jedoch noch nicht im Eintrag gespeichert, sondern lediglich die Eingabe beendet. Erst eine TVM_SETITEM Nachricht mit dem neuen Text speichert diesen zusammen mit dem Eintrag.

Der nachfolgende Code-Ausschnitt zeigt die generelle Vorgehensweise.

Lösung

case TVN_ENDLABELEDIT:
{
  TV_DISPINFO *ptvdi = (TV_DISPINFO *) lp;
            
  if ( ptvdi->item.pszText ) 
  {
   ptvdi->item.mask = TVIF_TEXT;
   TreeView_SetItem(hTreeView, &ptvdi->item);
  }
}

Programmgesteuerte Editierung

Neben dem automatischen Eingabehandling, das die TreeView Control direkt anbietet, kann der Anwender auch durch die Anwendung selbst aufgefordert werden, einen Labeltext einzugeben. Dazu sendet die Anwendung der TreeView Control eine Nachricht vom Typ TVM_EDITLABEL

Reaktion auf TVN_ENDLABELEDIT

wParam = 0; 
lParam = (LPARAM) (HTREEITEM) hitem; 

Das korrespondierene Makro lautet:

HWND TreeView_EditLabel(hwnd, hitem); 

In hitem übergibt die Nachricht das Handle des betroffenen Eintrags, der automatisch selektiert und im TreeView Fenster sichtbar gemacht wird, wenn erforderlich. Wie bei dem automatischen Editieren folgt auf den Beginn der Editierung auch hier eine TVN_BEGINLABELEDIT Benachrichtigung, die von dem Elternfenster durch Rückgabe von TRUE zum Unterdrücken des Editieren genutzt werden kann, was hier natürlich Unsinn wäre, da das Editieren gerade durch einen Programmbefehl angestoßen wurde.

Der Rückgabewert der Nachricht TVM_EDITLABEL ist das Handle der Edit-Control, die für das Editieren verwendet wird oder im Fehlerfall NULL. Das Handle kann anschließend verwendet werden, um Nachrichten an die Edit-Control zu senden. Nach dem Beenden des Editiervorgangs oder dem Abbruch der Eingabe ist das Handle nicht länger gültig. Das Handle kann auch verwendet werden, um ein Subclassing der Edit-Control vorzunehmen, allerdings darf die Edit-Control nicht zerstört werden.

Voraussetzung für die Nachricht TVM_EDITLABEL ist ferner, daß die TreeView den Fokus besitzt.

Nachricht TVM_EDITLABEL

Das Handle der Edit-Control läßt sich auch für normale automatisch abgewickelte Editiervorgänge über eine spezielle Nachricht ermitteln. Die Nachricht TVM_GETEDITCONTROL benötigt keine Parameter und liefert das gewünschte Handle. Das korrespondierende Makro lautet:

HWND TreeView_GetEditControl(hwnd); 

Ist keine Edit-Operation aktiv oder konnte das Handle aus anderen Gründen nicht geliefert werden, lautet das Funktionsergebnis NULL.

Im Rahmen der programmgesteuerten Eingabe des Labeltextes kann das Ende der Eingabe ebenfalls über eine Nachricht herbeigeführt werden. Dazu dient die Nachricht TVM_ENDEDITLABELNOW

Edit-Control ermitteln

wParam = (WPARAM) (BOOL) fCancel; 
lParam = 0; 

Das zugehörige Makro lautet:

BOOL TreeView_EndEditLabelNow(hwnd, fCancel); 

Der Parameter fCancel legt fest, ob der aktuell eingegebene Text beim Abbruch gespeichert werden soll oder nicht. Im Falle von TRUE wird die Eingabe abgebrochen, ohne daß der Text gespeichert wird.

Zusätzlich löst diese Nachricht auch die Benachrichtigung TVN_ENDLABELEDIT aus, die an das Elternfenster gesendet wird. Die Rückgabe lautet TRUE im Erfolgsfall ansonsten FALSE.

Nachricht TVM_ENDEDITLABELNOW

Ist die TreeView in einer Dialogmaske untergebracht, können ESC- und Eingabe-Taste als Tasteneingaben während des Editierens den Abbruch des Dialogs herbeiführen. Dies umgeht man am leichtesten per SubClassing der Edit-Control, indem bei der Bearbeitung der Benachrichtigung TVN_BEGINLABELEDIT eine neue Fenster-Funktion eingesetzt wird.

case TVN_BEGINLABELEDIT:
{
  HWND hEdit = TreeView_GetEditControl(hTreeView);
  lpOldEditProc = (FARPROC)SetWindowLong(
                         hEdit, GWL_WNDPROC, (LONG)EditSubclass );
}
return FALSE;

Die Fensterfunktion fängt alle Tastatureingaben ab.

LRESULT WINAPI EditSubclass(HWND hWnd, UINT wMsg,
                            WPARAM wp, LPARAM lp)
{
  if ( wMsg == WM_GETDLGCODE ) 
    return DLGC_WANTALLKEYS;      
  return CallWindowProc(lpOldEditProc, hWnd, wMsg, wp, lp );
}

SubClassing





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 01:56:26 von textarchiv.alojado.de