begin process at 2012 02 13 07:44:06
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

GUI

 > 

treeview edit label


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

treeview edit label

lundi 6 juillet 2009 à 15:28:47 | treeview edit label

lectpe

Bonjour.

Je voudrais pouvoir éditer un label dans un treeview.

MON CODE :


TV_INSERTSTRUCT tviis;
TV_ITEM tvi;
...
      case WM_NOTIFY:
      {
         HWND hEdit;
         if(((LPNMHDR)lParam)->code == TVN_BEGINLABELEDIT)
         {
      hEdit=TreeView_GetEditControl(hTreeView);
         }
         if(((LPNMHDR)lParam)->code == TVN_ENDLABELEDIT)
   {
      char Text[256]="";
   tvi.hItem=TVI_ROOT;
   SendMessage(hwnd,TVM_GETITEM,0,(WPARAM)&tvi);
   GetWindowText(hEdit, Text, sizeof(Text));
   tvi.pszText=Text;
   SetWindowText(hwnd, Text);
   SendMessage(hwnd,TVM_SETITEM,0,(WPARAM)&tvi);

         }
      }

Si vous savez comment faire, aidez moi, SVP.

Merci.

Cordialement,

Greg.
mercredi 8 juillet 2009 à 14:13:31 | Re : treeview edit label

sollen9

C'est une FAQ Win32 [ Lien ] depuis 1995

+ MSDN : code complet dans SDK (CControl, TeeeView)

mercredi 8 juillet 2009 à 19:05:24 | Re : treeview edit label

lectpe

Bon alors sollen9, je vais te faire le même topo qu'à la personne qui vient de m'écrire un message :

Je me suis inscrit sur ce site afin de trouver des réponses à mes questions.

J'en ai marre qu'on me redirige vers des sites où il y a 36000 pages et pas une qui correspond à ce que je recherche !!!

Il y a quelque temps, j'étais satisfait de ce site car on répondait correctement à mes questions.

Maintenant, quand je pose une question, que certains doivent se poser aussi, on m'envoie chier et ça ça me plait pas.

Je vais me désinscrire définitivement de ce site est le déconseiller fortement à ceux qui cherchent à trouver des réponses à leur question car certaines personnes répondent correctement aux questions, mais elle ne sont que trop peu nombreuses sur ce site. Les personnes comme toi ou comme Sollen9 me redirigent vers des sites à la con dont j'ai rien à foutre.

Et en plus, dans les forums, les "Bonjour", "Cordialement", "Merci"... sont très rare, ce qui me déçoit beaucoup.

dimanche 12 juillet 2009 à 18:35:45 | Re : treeview edit label

rt15

Membre Club Administrateur CodeS-SourceS
Bonjour,

Désolé, mais il se trouve qu'on a un petit souci avec un membre que l'on banni régulièrement.
Jeffy131, Miquel75, laurentis100, Azer33, boris20... et maintenant sollen9 (Maintenant banni). Toujours la même personne répétant inlassablement la même rengaine...
Qui plus est, la pollution est assez élevée ces derniers temps (Mais que font les écolos ?) donc ça doit pas vraiment donner envie à ceux qui répondent de venir aider.

Je vais jetter un oeil sur ton problème mais pas dans la seconde.
lundi 13 juillet 2009 à 20:16:35 | Re : treeview edit label

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
"à la personne qui vient de m'écrire un message"

Heu !
Un message privé ?
Si oui peux tu donner le contenu du message ainsi que le pseudo de celui qui te l'a envoyé ?
Merci.

Pour ton problème c'est expliqué dans la doc, ici précisément.

Globalement, on intercepte les LPNMTVDISPINFO.
Si pszText n'est pad renseigné, c'est que l'utilisateur à annulé donc on ne fait rien.
Si pszText est là, suffit de faire un TVM_SETITEM.

    case WM_NOTIFY:
      if (((NMHDR*)lParam)->code == TVN_ENDLABELEDIT)
      {
        lpDispInfo = (LPNMTVDISPINFO)lParam;

        /* Si le texte est à zéro, c'est que l'utilisateur a annulé */
        if (lpDispInfo->item.pszText)
          SendMessage(_hTreeView, TVM_SETITEM, 0, (LPARAM)&lpDispInfo->item);
      }
      break;

Code complet :
Application GUI.
Pour compiler sous gcc, ajouter -nostartfiles -nodefaultlibs -nostdlib -ffreestanding dans les options du lieur.
Pour compiler sous VC, s'arranger pour que le lieur ignore toutes les librairies par défaut (/nodefaultlib).
S'assurer que kernel32 et user32 sont en entrée du lieur.
Sous VC, en cas d'erreur LNK2001 : __chkesp symbole externe non résolu -> Enlever /GZ des options de compilation.

#ifdef UNICODE
#define _UNICODE
#endif /* UNICODE */

#define _WIN32_IE 0x0400

#include <windows.h>
#include <tchar.h>
#include <commctrl.h>

HINSTANCE _hThisInstance;              /* Handle du module                    */
HWND _hWnd;                            /* Handle de la fenêtre                */
HWND _hStatusBar;                      /* Handle sur la bar de status         */
HWND _hTreeView;                       /* Handle sur le treeview              */
LPTSTR _lpAppName = _T("TreeView");    /* Nom de l'appli                      */

DWORD _nStatusBarHeight;               /* Redimenssionement du treeview       */

/**
 * Affiche un message d'erreur correspondant à la dernière erreur Win32
 */
DWORD __stdcall ShowLastError()
{
  DWORD nLastError;           /* Numéro de l'erreur                           */
  LPTSTR lpMessageBuffer;     /* Récupération du message                      */

  nLastError = GetLastError();

  /* Formatage du message */
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (void*)&lpMessageBuffer, 0, NULL);

  /* Affichage du message */
  MessageBox(NULL, lpMessageBuffer, _T("ERROR"), MB_OK | MB_ICONERROR);

  LocalFree(lpMessageBuffer);
  return nLastError;
}

/**
 * Traitement des messages
 */
LRESULT __stdcall WindowProcedure(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
  MINMAXINFO *lpMinMaxInfo;   /* Info sur les tailles min et max de la fenêtre */
  RECT clientRect;            /* Taille de la zone cliente                     */
  int bHandled;               /* Pour savoir si le message est traité          */
  LPNMTVDISPINFO lpDispInfo;  /* Info sur l'édition du noeud                   */
  long nResult;

  nResult = 0;
  bHandled = 0;
  switch (nMessage)
  {
    case WM_GETMINMAXINFO:
      lpMinMaxInfo = (MINMAXINFO*)lParam;
      lpMinMaxInfo->ptMinTrackSize.x = 300;
      lpMinMaxInfo->ptMinTrackSize.y = 200;
      bHandled = 1;
      break;

    case WM_SIZE:
      /* On signale à la barre de status que la fenêtre a été redimenssionnée */
      SendMessage(_hStatusBar, WM_SIZE, wParam, lParam);

      /* On ajuste la taille de le treeview */
      GetClientRect(_hWnd, &clientRect);
      SetWindowPos(_hTreeView, 0, 0, 0,
                   clientRect.right - clientRect.left,
                   clientRect.bottom - clientRect.top - _nStatusBarHeight,
                   SWP_NOMOVE | SWP_NOZORDER);
      break;

    case WM_NOTIFY:
      if (((NMHDR*)lParam)->code == TVN_ENDLABELEDIT)
      {
        lpDispInfo = (LPNMTVDISPINFO)lParam;

        /* Si le texte est à zéro, c'est que l'utilisateur a annulé */
        if (lpDispInfo->item.pszText)
          SendMessage(_hTreeView, TVM_SETITEM, 0, (LPARAM)&lpDispInfo->item);
      }
      break;

    case WM_DESTROY:
      /* On signale que le thread va s'arrêter */
      PostQuitMessage(0);
      bHandled = 1;
      break;
  }
  if (! bHandled)
    nResult = DefWindowProc(hWnd, nMessage, wParam, lParam);
  return nResult;
}

/**
 * Ajoute la barre de status
 */
int __stdcall CreateStatusBar()
{
  int nWidth;                 /* Largeur de la partie 0                        */
  RECT statusBarRect;         /* Taille de la barre de status                  */
  int nResult;

  nResult = 0;

  /* Création de la barre de status */
  _hStatusBar = CreateWindowEx(0, STATUSCLASSNAME, (LPCTSTR)NULL,
                               SBARS_SIZEGRIP | WS_CHILD | WS_VISIBLE,
                               0, 0, 0, 0,
                               _hWnd, NULL, _hThisInstance, NULL);
  if (! _hStatusBar) goto the_end;


  /* Affectation du nombre de parties */
  nWidth = -1;
  SendMessage(_hStatusBar, SB_SETPARTS, (WPARAM)1, (LPARAM)&nWidth);

  /* Calcul de la hauteur de la barre de status */
  GetWindowRect(_hStatusBar, &statusBarRect);
  _nStatusBarHeight = statusBarRect.bottom - statusBarRect.top;

  nResult = 1;
the_end:
  return nResult;
}

/**
 * Crée une imagelist utilisée par le treeview
 */
int __stdcall CreateImageList()
{
  HIMAGELIST hImageList;    /* Handle sur la imagelist                        */
  int nResult;

  nResult = 0;

  /* Création de la liste */
  hImageList = ImageList_Create(GetSystemMetrics(SM_CXSMICON),
                                GetSystemMetrics(SM_CYSMICON),
                                ILC_MASK, 1, 1);
  if (! hImageList) goto the_end;

  /* Ajout d'un icône */
  if (ImageList_ReplaceIcon(hImageList, -1, LoadIcon(NULL, IDI_APPLICATION)) == -1) goto the_end;

  /* Affectation de la imagelist à le treeview */
  SendMessage(_hTreeView, TVM_SETIMAGELIST, (WPARAM)TVSIL_NORMAL, (LPARAM)hImageList);

  nResult = 1;
the_end:
  return nResult;
}

/**
 * Crée les items de le treeview
 */
int __stdcall CreateItems()
{
  TVINSERTSTRUCT insertStruct; /* Structure contenant les infos d'insertion   */
  HTREEITEM hRoot;             /* Handle sur la racine */

  insertStruct.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
  insertStruct.item.pszText = _T("Item1");
  insertStruct.item.cchTextMax = lstrlen(insertStruct.item.pszText) + 1;
  insertStruct.item.iImage = 0;
  insertStruct.item.iSelectedImage = 0;
  insertStruct.hParent = TVI_ROOT;
  insertStruct.hInsertAfter = TVI_ROOT;
  hRoot = (HTREEITEM)SendMessage(_hTreeView, TVM_INSERTITEM, 0, (LPARAM)&insertStruct);

  insertStruct.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
  insertStruct.item.pszText = _T("Item2");
  insertStruct.item.cchTextMax = lstrlen(insertStruct.item.pszText) + 1;
  insertStruct.item.iImage = 0;
  insertStruct.item.iSelectedImage = 0;
  insertStruct.hParent = hRoot;
  insertStruct.hInsertAfter = TVI_FIRST;
  SendMessage(_hTreeView, TVM_INSERTITEM, 0, (LPARAM)&insertStruct);

  insertStruct.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
  insertStruct.item.pszText = _T("Item3");
  insertStruct.item.cchTextMax = lstrlen(insertStruct.item.pszText) + 1;
  insertStruct.item.iImage = 0;
  insertStruct.item.iSelectedImage = 0;
  insertStruct.hParent = hRoot;
  insertStruct.hInsertAfter = TVI_LAST;
  SendMessage(_hTreeView, TVM_INSERTITEM, 0, (LPARAM)&insertStruct);

  /* Expand */
  SendMessage(_hTreeView, TVM_EXPAND, TVE_EXPAND, (LPARAM)hRoot);

  return 1;
}

/**
 * Ajoute la treeview
 */
int __stdcall CreateTreeView()
{
  int nResult;

  nResult = 0;

  _hTreeView = CreateWindowEx(0, WC_TREEVIEW, (LPCTSTR)NULL,
                              TVS_HASLINES | TVS_HASBUTTONS |
                              TVS_LINESATROOT | TVS_EDITLABELS |
                              WS_CHILD | WS_VISIBLE,
                              0, 0, 0, 0,
                              _hWnd, NULL, _hThisInstance, NULL);
  if (! _hTreeView) goto the_end;

  if (! CreateImageList()) goto the_end;
  if (! CreateItems()) goto the_end;

  nResult = 1;
the_end:
  return nResult;
}

/**
 * Initialise la fenêtre principale de l'appli.
 */
int __stdcall CreateMyWindow()
{
  WNDCLASSEX wincl;       /* Classe de la fenêtre utilisée                    */
  int nResult;

  nResult = 0;

  /* Création de la classe de fenêtre */
  wincl.cbSize = sizeof(WNDCLASSEX);
  wincl.style = 0;
  wincl.lpfnWndProc = WindowProcedure;
  wincl.cbClsExtra = 0;
  wincl.cbWndExtra = 0;
  wincl.hInstance = _hThisInstance;
  wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
  wincl.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
  wincl.lpszMenuName = 0;
  wincl.lpszClassName = _lpAppName;
  wincl.hIconSm = NULL;

  /* Enregistrement de la classe */
  if (! RegisterClassEx(&wincl)) goto the_end;

  /* Création de la fenêtre */
  _hWnd = CreateWindowEx(0, _lpAppName, _lpAppName,
                         WS_OVERLAPPEDWINDOW,
                         CW_USEDEFAULT, CW_USEDEFAULT, 500, 300,
                         HWND_DESKTOP, NULL, _hThisInstance, NULL);
  if (! _hWnd) goto the_end;

  /* Création de la barre de status */
  if (! CreateStatusBar()) goto the_end;

   /* Création de la treeview */
  if (! CreateTreeView()) goto the_end;

  /* Affichage de la fenêtre */
  ShowWindow (_hWnd, SW_SHOW);

  nResult = 1;
the_end:
  return nResult;
}

/**
 * Main
 */
int __cdecl WinMainCRTStartup()
{
  MSG messages;                       /* Messages envoyés à l'application     */
  INITCOMMONCONTROLSEX initCommon;    /* Initialisation de comctl32           */
  int nResult;

  initCommon.dwSize = sizeof(initCommon);
  initCommon.dwICC = ICC_BAR_CLASSES | ICC_TREEVIEW_CLASSES;
  InitCommonControlsEx(&initCommon);

  /* Récupération du handle du module */
  _hThisInstance = GetModuleHandle(NULL);

  if (! CreateMyWindow())
  {
    nResult = ShowLastError();
    goto the_end;
  }

  /* Boucle de traitement des messages */
  while (GetMessage(&messages, NULL, 0, 0))
  {
    TranslateMessage(&messages);
    DispatchMessage(&messages);
  }
  nResult = messages.wParam;

the_end:
  /* ExitProcess nécessaire car sinon c'est un ExitThread */
  ExitProcess(nResult);

  /* Pour esquiver le warning */
  return 0;
}

lundi 13 juillet 2009 à 21:24:49 | Re : treeview edit label

lectpe

D'abord merci pour cette réponse complète.

Ensuite, le pseudo de celui qui m'a envoyé un message, c'est sylvain908.

Je tiens vraiment à te remercier, rt15. Ce gros morceau de code que tu m'apportes va me permettre de bien avancer mon application.

(Ah, heureusement qu'il y a les admins de CodeS-SourceS pour répondre correctement aux questions des forums !!!)

Encore merci.

Cordialement, Grégory.

lundi 13 juillet 2009 à 21:29:17 | Re : treeview edit label

lectpe

Voici le contenu de son message :

////////////////////////////////////////////////////

Message :
Comme il a souvent été dit demander sur le network pro (Experts Microsoft)
http://groups.google.fr/group/fr.comp.os.ms-windows.programmation/topics?lnk=srg&hl=fr

(C'est le B-A-BA tes questions !!)

////////////////////////////////////////////////////

Et c'est pas le premier qui m'envoie un message du genre :
il y a aussi Miquel75, Azer33, boris20, gael12 et sollen9.

mercredi 15 juillet 2009 à 09:47:43 | Re : treeview edit label

rt15

Membre Club Administrateur CodeS-SourceS
Bah merci.
Il est vraiment lourd ce type...
mercredi 15 juillet 2009 à 15:07:57 | Re : treeview edit label

burt13

Non, ils ont raison.
Ces questions sont des questions répondues des millers de fois depuis 20 ans sur les réseaux pros MS et autres!!
Quel est l'intéret de reposer une ènième fois ce genre de question de débutant ?!!!
Le niveau de ce forum devient lamentable...

mercredi 15 juillet 2009 à 15:10:23 | Re : treeview edit label

burt13

> + MSDN : code complet dans SDK (CControl, TeeeView)

Exact.
C'est affolant de poser ce genre de question en 2009 !!!



Cette discussion est classée dans : label, text, treeview, hwnd, tvi


Répondre à ce message

Sujets en rapport avec ce message

Urgent : Récupération d'un événement sur un TreeView [ par vow ] Bonjour,J'ai une fenêtre principale, avec un menu et un toolbar, et une fenêtre secondaire (hwndParent) contenant un treeview.Je travaille sur Visual Les pointeurs, aide SVP [ par jb60 ] Bonjour,J'ai fait une source avec plusieurs fichier *.cpp et plusieurs fichiers *.hDans un fichier main.cpp, j'ai créé un pointeur BYTE *LesOctets;Je Pb avec CreateDialog() [ par cpprooky ] Bonjour à tous ! Voila un pb qui m'occupe depuis plusieurs heures et je ne trouve pas d'ou vient le pb ! je veux faire une appli (GUI Win32) fondée s TreeView et Dialog [ par jojomillenium ] Bonjour, Je n'arrive pas a faire 2 choses :( Pourtant j'ai essayé! Google et MSDN n'ont pas été mes amis ce coup ci! (Code ci dessous) Je programme en Listé fenetre c++ [ par kiki67100 ] Bonjour a tous sa fait des jours que je cherche comment faire pour listé tout les fenetre  (en mode console) j'ai trouvé un code mais je narrive pas a recursivité dans TreeView [ par abdenour123 ] Message : je doit construire une phrase à partir de TTreeView telque les noeud sont les opérateurs logique et les dernière feuilles sont les phrase Insertion dans un Treeview sans doublons [ par afavre_tx ] Bonjour, J'ai besoin d'alimenter un Treeview à partir d'un fichier texte qui est une liste d'artiste, titre, date. ex: Artiste Date Image Air 26/02/ changer le text d'un label [ par pierre_33 ] Bonjour,J'ai un problème je n'arrive pas a changer le test d'un label lors du click sur un bouton .Mon label et bouton son bien créer, je créer le sig enumwindow [ par sam20 ] Salut a tous.Je cherche a enumerer les fenetres qui ce trouvent dans le gestionaire de tache -> application.BOOL CALLBACK EnumWindowsProc(HWND hwnd,LP API windows (Probleme avec SendMessage(.... WM_SETTEXT.....) [ par rivaldinho ] Salut, voici le code que j'utilise pour écrire dans la zone texte de notepadint main(){    HWND hWnd, hWnd2; // Handles de fenêtre    hWnd = FindWindo


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,685 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales