Renommer un noeud d'un treeview

Le
XWindoo
Bonjour à tous,

Pour renommer un noeud d'un treeview, j'ai utilisé le style
TVS_EDITLABELS qui permet comme son nom l'indique, d'éditer
directement le label dans le treeview.
Je me suis heurté à un premier problème : lorsqu'on édite un label,=
et
que l'on clique ailleurs pour terminer l'édition, c'est l'ancien texte
qui remplace celui qu'on viens de taper. Pour résoudre ce problème, au
niveau du code, j'ai intercepté le message TVN_ENDLABELEDIT et fais :

Code C++ :
TreeView_SetItem(hTreeView, ((LPNMTVDISPINFO)lParam)->item);

pour remplacer l'ancien texte par le nouveau.
Est-ce la meilleur façon de procéder ?

D'autre part, lors de l'édition, l'appui sur les touches entrer et
échap n'a aucun effet, ni pour annuler ni pour valider l'édition. J'ai
essayé de sous-classer le control, mais je ne reçois pas le message
WM_KEYUP. Comment faut-il que je m'y prenne ?

Voila, j'espère avoir été assez clair.
Merci d'avance,
XWindoo
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Christian ASTOR
Le #17275541
On 19 sep, 16:08, XWindoo
Bonjour à tous,

Pour renommer un noeud d'un treeview, j'ai utilisé le style
TVS_EDITLABELS qui permet comme son nom l'indique, d'éditer
directement le label dans le treeview.
Je me suis heurté à un premier problème : lorsqu'on édite un labe l, et
que l'on clique ailleurs pour terminer l'édition, c'est l'ancien texte
qui remplace celui qu'on viens de taper. Pour résoudre ce problème, a u
niveau du code, j'ai intercepté le message TVN_ENDLABELEDIT et fais :

Code C++ :
TreeView_SetItem(hTreeView, ((LPNMTVDISPINFO)lParam)->item);

pour remplacer l'ancien texte par le nouveau.
Est-ce la meilleur façon de procéder ?

D'autre part, lors de l'édition, l'appui sur les touches entrer et
échap n'a aucun effet, ni pour annuler ni pour valider l'édition.



Ce n'est pas normal (si pas dans Dialog Box (DWLP_MSGRESULT)...)
Pour un TreeView dans une fenêtre classique, par ex =>

case WM_NOTIFY:
{
LPNMHDR pnmh ((LPNMHDR)lParam);
switch (pnmh->code)
{
case TVN_ENDLABELEDIT:
{
TV_DISPINFO *ptv = (TV_DISPINFO*) pnmh;
if (ptv->item.pszText != NULL)
{
TV_SetItemText(hWnd, ptv->item.hItem, ptv->item.pszText);
return TRUE;
}
}
break;
}
return 0;
}
break;

avec :

BOOL TV_SetItemText(HWND hWndTV, HTREEITEM hItem, char *sText)
{
TV_ITEM tvi;
tvi.hItem = hItem;
tvi.mask = TVIF_TEXT;
tvi.pszText = sText;
return (TreeView_SetItem(hWndTV, &tvi) != -1);
}
XWindoo
Le #17276891
Merci pour ta réponse.

Le TreeView est effectivement dans une Dialog Box ; quel problème cela
engendre ?
Le code que tu m'a donné, pour une fenêtre classique ne peut pas être
appliqué au Dialog Box ?

Merci.
Christian ASTOR
Le #17277361
XWindoo wrote:

Merci pour ta réponse.

Le TreeView est effectivement dans une Dialog Box ; quel problème cela
engendre ?
Le code que tu m'a donné, pour une fenêtre classique ne peut pas être
appliqué au Dialog Box ?



Non, car il faut ajouter en plus DWLP_MSGRESULT
Par ex, pour valider le nouveau texte d'un item :

SetWindowLongPtr(hDlg, DWLP_MSGRESULT, (LONG_PTR) TRUE);
return TRUE;

(Et éventuellement subclasser le contrôle Edit
(TreeView_GetEditControl()) dans TVN_BEGINLABELEDIT si la Dlg se ferme
sur OK ou Esc (comme KB130692))
Publicité
Poster une réponse
Anonyme