IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

modifier un libellé dans un Cxtabctrl (ou CTabCTrl) : probléme


Sujet :

Visual C++

  1. #1
    Membre régulier

    Inscrit en
    Décembre 2002
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 49
    Points : 76
    Points
    76
    Par défaut modifier un libellé dans un Cxtabctrl (ou CTabCTrl) : probléme
    Bonjour,

    Pour un projet, j'essaie de modifier le libellé d'un tab control.

    Pour cela, j'ai rajouté une fonction dans le composant de Farscape
    http://farscape.developpez.com/Samples/CxTabCtrl.zip

    La fonction se base sur http://msdn.microsoft.com/en-us/library/dwzz1y47.aspx

    la voici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    void CXTabCtrl::SetTabText(int iIndex, LPCTSTR lpszCaption)
    {
    	//http://msdn.microsoft.com/en-us/library/dwzz1y47.aspx
    	 //  Get the current tab item text.
    	 TCITEM tcItem;
     
    	TCHAR buffer[256] = {0};
    	tcItem.pszText = buffer;
    	tcItem.cchTextMax = 256;
    	tcItem.mask = TCIF_TEXT|TCIF_PARAM;
    	this->GetItem(iIndex, &tcItem);
     
    	   //  Set the new text for the item.
    	tcItem.pszText = (LPTSTR) lpszCaption;
    	   //  Set the item in the tab control.
    	this->SetItem(iIndex, &tcItem);
    }
    J'appel la fonction dans un timer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void CTabctrlDlg::OnTimer(UINT nIDEvent) 
    {
    	// TODO: Add your message handler code here and/or call default
     
    	CTplDlgColor<CDialog>::OnTimer(nIDEvent);
     
    	CTime curTime = CTime::GetCurrentTime();
     
    	CString m_time;
    	m_time.Format("%02d:%02d:%02d",
    		curTime.GetHour(),
    		curTime.GetMinute(),
    		curTime.GetSecond());
     
    	m_tabctrl.SetTabText(0,(LPCTSTR)m_time);
    }
    le problème , c'est qu'après appel de la fonction , le texte est bien changé mais le dialog incrusté dans le tab disparait.

    Voila mon projet sous forme zippé
    http://cxtabctrl.site.voila.fr/Cxtabctrl.zip

    Merci d'avance pour vos réponses

    PS : j'ai aussi tenté avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tcItem.mask = TCIF_TEXT;
    çà ne marche pas

  2. #2
    Membre régulier

    Inscrit en
    Décembre 2002
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 49
    Points : 76
    Points
    76
    Par défaut
    j'ai réussi à implémenté une fonction qui remplacer le libellé du code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    void CXTabCtrl::SetTabText(int iIndex, CString lpszCaption){
     
    	// stocke le nouveau libellé dans une map 
    	m_tabsLabel[iIndex] =  lpszCaption;
     
    	CRect rect;
     
    	GetItemRect(iIndex, &rect);
     
    	if (GetCurSel() == iIndex){
    		rect.top -= ::GetSystemMetrics(SM_CYEDGE);
    		rect.bottom += ::GetSystemMetrics(SM_CYEDGE); 
    		rect.left -= ::GetSystemMetrics(SM_CYEDGE); 
    		rect.right += ::GetSystemMetrics(SM_CYEDGE); 
    	} else{ 
    		rect.left += ::GetSystemMetrics(SM_CYEDGE); 
    		rect.bottom -= ::GetSystemMetrics(SM_CYEDGE); 
    		rect.right -= ::GetSystemMetrics(SM_CYEDGE); 
    	}
    	CDC * pDC = GetDC();
     
    	CFont font; 
    	font.CreateFont(-11,
    	       0,
    	       0,
    	       0,
    	       FW_NORMAL,
    	       FALSE, FALSE, FALSE,
    	       ANSI_CHARSET,
    	       OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
    		   DEFAULT_PITCH | FF_ROMAN,
    	       "MS Sans Serif");
    	CFont *pFont = pDC->SelectObject(&font);
     
    	LPDRAWITEMSTRUCT lp = new DRAWITEMSTRUCT;
    	lp->itemID = iIndex; 
    	lp->hDC = pDC->GetSafeHdc(); //->m_hDC; 
    	lp->rcItem=rect;
     
     	DrawItem(lp);
    }
    le problème c'est qu'il semble y avoir une fuite mémoire sur mon code, en effet, j'ai l'erreur suivante

    Detected memory leaks!
    Dumping objects ->
    D:\workspace\support_sofi ihm vc++6\XTabCtrl.cpp(151) : {6591} normal block at 0x006D03C0, 48 bytes long.
    Data: < > CD CD CD CD CD CD CD CD 01 00 00 00 CD CD CD CD
    la ligne 151 correspond à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LPDRAWITEMSTRUCT lp = new DRAWITEMSTRUCT;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    /*
     * DRAWITEMSTRUCT for ownerdraw
     */
    typedef struct tagDRAWITEMSTRUCT {
        UINT        CtlType;
        UINT        CtlID;
        UINT        itemID;
        UINT        itemAction;
        UINT        itemState;
        HWND        hwndItem;
        HDC         hDC;
        RECT        rcItem;
        DWORD       itemData;
    } DRAWITEMSTRUCT, NEAR *PDRAWITEMSTRUCT, FAR *LPDRAWITEMSTRUCT;
    quelqu'un a t'il une idée de comment je peux résoudre ce problème ?

    EDIT : apparement un delete lp devrait suffir

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    oui pour le delete , lorsque l'on fait un Getdc il faut faire un ReleaseDC.
    ceci dit je suis étonné que tu sois obligé de faire ça , l'exemple cité par msdn ne fonctionne pas ?

Discussions similaires

  1. [C#] Modifier une valeur dans une DataTable
    Par Scorff dans le forum ASP.NET
    Réponses: 2
    Dernier message: 23/05/2005, 10h45
  2. Comment faire pour modifier une ligne dans une DBGrid?
    Par Nico62 dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2005, 12h24
  3. Modifier l'utilisateur dans une PS ?
    Par Sitting Bull dans le forum SQL
    Réponses: 7
    Dernier message: 28/02/2005, 18h01
  4. modifier les texte dans un <span>
    Par Flobel dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 03/12/2004, 13h58
  5. Modifier un événement dans le code
    Par HT dans le forum Langage
    Réponses: 6
    Dernier message: 20/06/2003, 09h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo