Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Renommer un noeud d'un treeview

3 réponses
Avatar
XWindoo
Bonjour =E0 tous,

Pour renommer un noeud d'un treeview, j'ai utilis=E9 le style
TVS_EDITLABELS qui permet comme son nom l'indique, d'=E9diter
directement le label dans le treeview.
Je me suis heurt=E9 =E0 un premier probl=E8me : lorsqu'on =E9dite un label,=
et
que l'on clique ailleurs pour terminer l'=E9dition, c'est l'ancien texte
qui remplace celui qu'on viens de taper. Pour r=E9soudre ce probl=E8me, au
niveau du code, j'ai intercept=E9 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=E7on de proc=E9der ?

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

Voila, j'esp=E8re avoir =E9t=E9 assez clair.
Merci d'avance,
XWindoo

3 réponses

Avatar
Christian ASTOR
On 19 sep, 16:08, XWindoo wrote:
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);
}
Avatar
XWindoo
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.
Avatar
Christian ASTOR
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))