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
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Cela te dit que la classe CSliderCtrl (Ni aucune des classes parentes de CSliderCtrl) ne possède de méthode SetColor, ce qui n'est pas faux.

Pour changer la couleur, il semble qu'il faille que tu travaille sur le DC (Device Context) de tes sliders, un peu comme dans ton code du jeudi 30 avril 2009 à 16:19:55 ci-dessus.

Eventuellement, tu peux poser la question dans un nouveau topic (Créer une nouvelle discussion avec le thème approprié), car il n'y a pas de système de up.
Messages postés
14947
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2021
93
Hello,
Tu peux faire une fonction de vérification que tu pourras lancer après chaque action utilisateur...
Le contenu de la fonctin est comme tu as dit:
- récupération des valeurs des sliders
- comparaison
- ajustement au besoin ou message d'erreur

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Merci mais quelle fonction de vérification dois-je utiliser car je n'en ai pas la moindre idée et voici également mon code, merci.

// Dlg_Demo_Slider.cpp : implementation file
//



#include "stdafx.h"
#include "SliderMultiple.h"
#include "Dlg_Demo_Slider.h"



#include "Utilitaire.h"



#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif



/////////////////////////////////////////////////////////////////////////////
// CDlg_Demo_Slider dialog





CDlg_Demo_Slider::CDlg_Demo_Slider(CWnd* pParent /*=NULL*/)
 : CDialog(CDlg_Demo_Slider::IDD, pParent)
{
 //{{AFX_DATA_INIT(CDlg_Demo_Slider)
 //}}AFX_DATA_INIT
}





void CDlg_Demo_Slider::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CDlg_Demo_Slider)
 DDX_Control(pDX, IDOK, m_OK);
 //}}AFX_DATA_MAP
}





BEGIN_MESSAGE_MAP(CDlg_Demo_Slider, CDialog)
 //{{AFX_MSG_MAP(CDlg_Demo_Slider)
 ON_BN_CLICKED(IDC_BUTTON1, OnMoins)
 ON_BN_CLICKED(IDC_BUTTON2, OnPlus)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()



/////////////////////////////////////////////////////////////////////////////
// CDlg_Demo_Slider message handlers



BOOL CDlg_Demo_Slider::OnInitDialog()
{
CDialog::OnInitDialog();
CString strTemp;



if(nb_slider-7>0)
 largeur_dyna=nb_slider-7;       // Variable permettant de redimensionner la largueur de la plupart des contrôles
else
 largeur_dyna=0;
m_parametres= m_OK.GetParent();





nb_slider=6;



strTemp.Format("%d", nb_slider);
SetDlgItemText(IDC_NBSLIDER,strTemp);



affich_slider();
UpdateData(FALSE);



return TRUE;
}



/***************************************************************************
       Incrémentation
****************************************************************************/



void CDlg_Demo_Slider::OnMoins()
{
libere_slider();
nb_slider--;
if (nb_slider<1) nb_slider=1;



CString strTemp;



strTemp.Format("%d", nb_slider);
SetDlgItemText(IDC_NBSLIDER,strTemp);



affich_slider();
UpdateData(FALSE);
}



/***************************************************************************
       Décrémentation
****************************************************************************/



void CDlg_Demo_Slider::OnPlus()
{
libere_slider();
nb_slider++;
if (nb_slider>15) nb_slider=15;
CString strTemp;



strTemp.Format("%d", nb_slider);
SetDlgItemText(IDC_NBSLIDER,strTemp);



affich_slider();
UpdateData(FALSE);
}





/**************************************************************************
    Création et Initialisation des Sliders
***************************************************************************/



void CDlg_Demo_Slider::OnOK()
{
 // TODO: Add extra validation here
 
 CDialog::OnOK();
}





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





if (!(pSliderCtrl=(CSliderCtrl**)malloc(sizeof(CSliderCtrl*)*nb_slider)))  // réservation mémoire   
 return;



for (j=0;j<nb_slider;j++)
 {
 RECT rect={20,20,20,20};
 pSliderCtrl[j]=new CSliderCtrl();



 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(1,20);
 (*pSliderCtrl[j]).SetPos(j);                              //retrait de chq slider pour les différencier
 
 }



}



/********************************************************************************
      Libération mémoire
********************************************************************************/



void CDlg_Demo_Slider::libere_slider()
{
CString strTemp;         //variable locale
int j;



for (j=0;j<nb_slider;j++)
 delete (pSliderCtrl[j]);      //pointeur de fenêtre
free (pSliderCtrl);
}
Messages postés
14947
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2021
93
Hello,
Il n'y a pas de fonctions de validation toute prête, cela dépend de ton besoin. C'est ce que j'ai expliqué au dessus:
- récupération des valeurs des sliders
- comparaison
- ajustement au besoin ou message d'erreur

Par exemple, si tu as 2 sliders, et que la valeur du 1er doit être inférieure à celle du 2e:

int iValeur1 = slider1.GetPos();

int iValeur2 = slider2.GetPos();

if (iValeur1 >= iValeur2)
{
  MessageBox(NULL,"le slider 2 doit être supérieur au slider 1","Erreur",MB_OK);
}

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Ok mais le problème majeur c'est que j'ai des sliders crées dynamiquement comment reconnaître alors lequel l'utilisateur utilise ? Merci.
Messages postés
14947
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2021
93
A chaque fois que l'utilisateur utilise un slide, tu as une notification particulière (onChange() ou un truc du genre).

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Merci mais comme je débute je ne trouve pas ce que vous me dîtes. Pouvez vous m'aider? Merci.
Messages postés
14947
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2021
93
As-tu vraiment besoin de savoir quel slider a été modifié? Tu peux faire la validation sur tous les sliders (si tu n'en as pas 50, bien sûr)

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

En fait les différents sliders correspondent à des plages horaires si un utilisateur bouge le curseur il change l'heure, il me faut récupérer cette heure sachant que par exemple le curseur 15 ne pourra pas être avant le curseur 1. Il y aura maximum 15 sliders. Voilà mon objectif principal mais comment faire ? Merci.
Messages postés
14947
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2021
93
Si les valeurs doivent être dans l'ordre croissant, et si tu as N sliders max, tu peux faire un truc comme ça:

void validation(void)
{
  for (int i=0; i<N && pSliderCtrl[i+1]!=NULL; i++)
  {
    if (pSliderCtrl[i]->GetPos() > pSliderCtrl[i+1]->GetPos())
    {
      char msg[128];
      sprintf(msg,"le slider %d a une valeur supérieur au slider %d",i, i+1);
      MessageBox(NULL,msg,"Erreur",MB_OK);
    }
  }
}

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

J'ai fais votre code en l'adaptant au mien mais je peux toujours bouger mes curseurs partout sur les sliders. Merci.

void CDlg_Demo_Slider::verifier_slider()
{
  for (int j=0; j<nb_slider && pSliderCtrl[j+1]!=NULL; j++)
  {
    if (pSliderCtrl[j] -> GetPos() > pSliderCtrl[j+1]-> GetPos())
    {
      char msg[128];
      sprintf(msg,"le slider %d a une valeur supérieur au slider %d",j, j+1);
      MessageBox(NULL, msg,"Erreur",MB_OK);
    }
  }
}
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Et pour récupérer les valeurs des différents sliders, j'ai fais cela mais ça ne fonctionne pas non plus, merci.

void CDlg_Demo_Slider::OnHScroll(UINT nSBCode, UINT nPos, CSliderCtrl* pSliderCtrl)
{
int pos;
int j=0;
pos = (pSliderCtrl[j]).GetPos();


        m_SliderValue.Format("%ld", nPos);
        UpdateData(false);
   
        CDialog::OnHScroll(nSBCode, nPos, pSliderCtrl);
   
}
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Bonjour en fait pour la position des différents curseurs j'ai fais plus simple :

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



int i=(*pSliderCtrl[j]).GetPos();
 }


Mais voici la question que je me pose : Comment être averti qu'un slider dynamique a été bougé ? Merci.
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Personne pour répondre à ma question : Comment être averti qu'un slider dynamique a été bougé ? Merci.
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Bonjour je rajoute encore une autre question :  Savez-vous comment modifier la valeur de l'info-bulle de chaque curseur (je ne veux pas des entiers mais un format hh:mm)? Merci.  <!-- / message --><!-- / message -->
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Pour la détection des déplacement, on dirait que tu as utilisé la bonne méthode.

Pour l'info bulle, en anglais tool tip. Tu peux récupérer le CToolTipCtrl et travailler dessus.
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Merci est-ce que je peux faire directement : (*pSliderCtrl[j]).GetToolTips(); mais je ne sais pas quoi mettre en paramètre? Merci.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Ah heu mauvaise piste désolée. Faut plutôt passer par TTN_NEEDTEXT.
Messages postés
65
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
20 mai 2009

Ah ok mais je comprends pas grand chose avec TTN_NEEDTEXT sur msdn, pouvez-vous me guider un peu svp?Merci.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Version française de la msdn.



Globalement, juste avant d'afficher la bulle, un message TTN_NEEDTEXT est envoyé à ton application. Il faut ajouter le code ON_NOTIFY_EX ( ... ) pour intercepter ce message.

Ensuite, dans ce message, il faut que tu récupère la valeur du curseur concerné, que tu la formate, et que tu la mettes en place dans la structure NMTTDISPINFO.