N curseurs dynamiques [Résolu]

Signaler
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Bonjour, voici mon problème je dispose de plusieurs sliders sur une même fenêtre disposés les uns en dessous des autres qui représentent des plages horaires. Lorsque l'on bouge l'un des curseurs d'un slider il est évident qu'il ne pourra pas être placé avant le curseur le précédant (car heure plus tardive). Je voulais savoir comment il était possible de gérer cela, de récupérer la valeur de chaque slider et savoir lequel a été bougé si jamais on se trompe en les bougeant ?Merci.

60 réponses

Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Je mets mon code car ça sera mieux pour comprendre :

void CDlg_Demo_Slider::OnOK()
{
register int i,j;
CString m_Heure;
for (j=0;j<nb_slider;j++)
 {


 i=(*pSliderCtrl[j]).GetPos();  //position de chaque curseur en mémoire (i)


 m_Heure.Format("%02d:%02d",i/60,i%60);
}


 CDialog::OnOK();
 
}


void CDlg_Demo_Slider::affich_slider()
{
CString strTemp;
int j;


int heure_min, heure_max;


if (!(pSliderCtrl=(CSliderCtrl**)malloc(sizeof(CSliderCtrl*)*nb_slider)))  // réservation mémoire   
 return;
if (!(pWndHeure=(CWnd**)malloc(sizeof(CWnd*)*nb_slider)))  // réservation mémoire   
 return;
if (!(pString=(CString**)malloc(sizeof(CString*)*nb_slider)))  // réservation mémoire   
 return;
if (!(heure_coupure=(int*)malloc(4*nb_slider)))  // réservation mémoire   
 return;




heure_min=1500;heure_max=0;
for (j=0;j<nb_slider;j++)
 {
 heure_coupure[j]=240+(120*j)/nb_slider;
 if (heure_coupure[j]<heure_min)
  heure_min=heure_coupure[j];
 if (heure_coupure[j]>heure_max)
  heure_max=heure_coupure[j];
 }




for (j=0;j<nb_slider;j++)
 {


 RECT rect={20,20,20,20};
 pSliderCtrl[j]=new CSliderCtrl();
 pString[j]=new CString();


 DWORD dwStyle = TBS_NOTICKS | WS_CHILD | WS_VISIBLE | WM_HSCROLL ;

 (*pSliderCtrl[j]).Create(dwStyle|TBS_BOTTOM|TBS_HORZ ,rect, m_parametres,m_OK.GetDlgCtrlID()+(10000+j));


 (*pSliderCtrl[j]).SetWindowPos(&m_OK,120,10+(j*20),175,20,SWP_NOZORDER);
 (*pSliderCtrl[j]).SetRange(0,heure_max-heure_min+60);
 (*pSliderCtrl[j]).SetPos(heure_coupure[j]-heure_min+30); //retrait de chq slider pour les différencier


(*pString[j]).Format("%02d:%02d",heure_coupure[j]/60,heure_coupure[j]%60);


 pWndHeure[j] = new CWnd;
 pWndHeure[j]->Create(_T("STATIC"), *pString[j], WS_CHILD | WS_VISIBLE,
       CRect(300, 10+j*20, 380, 30+j*20), this, 1234);


 
/*
 pWndHeure[j]->DestroyWindow();
 pWndHeure[j]->Create(_T("STATIC"), *pString[j], WS_CHILD | WS_VISIBLE,
       CRect(300, 10+j*20, 380, 30+j*20), this, 1234);
*/ }




 
}
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Bonjour j'ai trouvé un code qui me permettrait de résoudre mon problème mais je n'arrive pas à l'adapter à mon code ci-dessus, pouvez-vous m'aider? Merci.

Code trouvé :

BEGIN_MESSAGE_MAP(CMySliderCtrl, CSliderCtrl)
ON_NOTIFY_EX(TTN_NEEDTEXTW, 0, OnToolTipNotify)
ON_NOTIFY_EX(TTN_NEEDTEXTA, 0, OnToolTipNotify)
END_MESSAGE_MAP()

BOOL CMySliderCtrl::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
BOOL bResult = TRUE;
// need to handle both ANSI and UNICODE versions of the message
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;

// CString m_strTipText = _T("anything you like!");
// in this case m_strTipText is a member filled by the window that owns the slider

if (pNMHDR->code == TTN_NEEDTEXTA)
{
lstrcpyn(pTTTA->szText, m_strTipText, sizeof(pTTTA->szText));
pTTTA->hinst = NULL;
}
else if (pNMHDR->code == TTN_NEEDTEXTW)
{
_mbstowcsz(pTTTW->szText, m_strTipText, sizeof(pTTTW->szText));
pTTTW->hinst = NULL;
}
*pResult = 0;

return bResult;
}
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Déjà, es-tu parvenu à afficher "anything you like!" dans l'info bulle ?
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Non j'obtiens ce message d'erreur :

C:\Exemple de sliders\SliderMultiple\Dlg_Demo_Slider.cpp(221) : error C2511: 'OnToolTipNotify' : overloaded member function 'int (unsigned int,struct tagNMHDR *,long *)' not found in 'CDlg_Demo_Slider'
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Ah pardon j'avais juste oublié d'écrire afx_msg BOOL OnToolTipNotify( UINT id, NMHDR* pNMHDR,LRESULT* pResult ); maintenant j'ai bien d'affiché "anything you like!" dans l'info bulle. Que dois-je faire maintenant? Merci.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Bin il faut que tu parvienne à déterminer sur quel slider tu es lors de l'affichage de l'info bulle. Avec l'id ?

Ensuite faut que tu fasse comme d'hab, getPos, formatage... Et que tu remplace "anything you like!" par ton résultat.
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Merci mais le problème c'est que je n'ai pas d'ID pour mes sliders ils sont crées dynamiquement, comment je peux faire alors ? Merci.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Si l'id ne te suffit pas, il faut regarder ce que tu as d'autre.

Dans NMTTDISPINFO, dans hdr, dans hwndFrom, il y a le handle du "control sending the message".
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Je suis désolée mais je ne vois pas du tout de quoi vous parlez, pourriez-vous svp me donner plus de précisions? Merci.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Tu as une fonction dans ce genre là appelée pour chaque message TTN_NEEDTEXT.

BOOL CMySliderCtrl::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult)

Elle est appelée en lui passant un paramètre pNMHDR de type NMHDR qui est en fait une NMTTDISPINFOk, mais qui peut aussi être considérée comme une TOOLTIPTEXT.

La structure NMHDR possède un champ hwndFrom de type HWND. "A window handle to the control sending the message."

Je me dis donc que tu peux comparer ce hwndFrom avec le contenu de ton tableau des hwnd de tes sliders.

De cette manière tu sauras quel slider est survolé par la souris.
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Houlà je ne vois pas par où commencer, avez-vous une piste? Merci.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Quelque chose comme ça :

for (j=0;j<nb_slider;j++)
 {
   if ((*pSliderCtrl[j]).m_hWnd == pNMHDR->hwndFrom)
  {
    Trouvé !
  }
}
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Je dois remplacer votre solution à la place de if (pNMHDR->code == TTN_NEEDTEXTA) ou bien mettre votre solution à la suite de mon code ? Merci.
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Désolé je débute alors je suis un peu perdue mais votre aide me permet d'avancer et d'apprendre en même temps, merci.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
A toi de voir... Réfléchis !

TTN_NEEDTEXTA c'est pour le MBCS et TTTN_NEEDTEXTW c'est pour la version unicode.
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Donc je dois utiliser qu'un seul d'entre eux?Merci.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Bin il semblerait que pour ce coup là, il faille que utilise les deux : que tu fasses comme si tu pouvais recevoir l'un ou l'autre. Dans un cas il faudra que tu renvoie de l'unicode, dans l'autre cas du MBCS.
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Mais je n'ai aucune idée de comment faire   ! Ma solution est-elle trop compliquée, faut-il que je fasse autrement ? Merci.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Mais tu le faisais déjà ça !

Si je commente ton code un peu plus haut...

/* A vu de nez, tu compilais en MBCS */
CString m_strTipText = _T("anything you like!");

/* Si tu dois renvoyer du MBCS */
if (pNMHDR->code == TTN_NEEDTEXTA)
{
  /* Une simple copie de chaîne */
  lstrcpyn(pTTTA->szText, m_strTipText, sizeof(pTTTA->szText));
  pTTTA->hinst = NULL;
}
/* Si tu dois renvoyer du unicode */
else if (pNMHDR->code == TTN_NEEDTEXTW)
{
  /* mbstowcsz -> MBCS to wide string, tu convertie m_strTipText en unciode */
  _mbstowcsz(pTTTW->szText, m_strTipText, sizeof(pTTTW->szText));
  pTTTW->hinst = NULL;
}
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

D'accord donc ça je n'ai pas besoin de le modifier sauf ça CString m_strTipText = _T("anything you like!"); moi je veux que ça soit l'heure qui s'affiche.Merci.