Pb : Slider Control MFC (fonction SetTic && fonction SetPos)

Signaler
Messages postés
70
Date d'inscription
mercredi 1 octobre 2008
Statut
Membre
Dernière intervention
17 avril 2013
-
Messages postés
70
Date d'inscription
mercredi 1 octobre 2008
Statut
Membre
Dernière intervention
17 avril 2013
-
Bonjour a tous,

J'ai un petit souci concernant un slider control voici mon problème :



Quand je souhaite mettre des Tic sur un slider, je compile (aucune erreur lors de la compilation) mais lorsque j'exécute mon programme le slider n'apparait pas !
De plus quand je donne une position au slider même chose, il n'apparait pas.
J'ai essayé pas mal de fonction relative a Slider et a chaque fois le même résultat.
En revanche lorsque je n’utilise pas les fonctions SetTic & SetPos tout fonctionne normalement…




Mon code est le suivant :



void CControlDlg::OnNMCustomdrawControldata(NMHDR *pNMHDR, LRESULT *pResult)

    LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
   CSliderCtrl *pSlider=static_cast<CSliderCtrl *>(GetDlgItem(IDC_CONTROLDATA));


    pSlider->SetRange(0,1279); // Définit la plage du slider
    pSlider->SetPos(640);   // Met le curseur en position centrale
    pSlider->SetTic(640);   // Met un Tic au centre
    int n = pSlider->GetPos();      // Récup la position du slider
    *pResult = 0;


}


Où se situe mon problème?
Merci de votre aide


Romain


Config : XP Pro sp3 / Visual Studio 2005

6 réponses

Messages postés
15192
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 décembre 2021
101
Hello,
Il faut utiliser InitCommonControls() avant la création de ta dialog

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
70
Date d'inscription
mercredi 1 octobre 2008
Statut
Membre
Dernière intervention
17 avril 2013
1
Merci de la solution proposé  !

Je place l' InitCommonControls() avant la création de la boite de diag mais cela ne résoud pas le problème.
Je viens de voir que quand je fixe une position (ex : 640 la moitié) le slider le prend bien en compte c'est a dire que c'est uniquement l'affichage qui bug.

ps : j'ai bien vérifié les propriétés de mon slider tout est Ok !
 
Avez vous d'autres solutions envisagable pour résoudre mon problème?

Romain
Messages postés
15192
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 décembre 2021
101
As-tu besoin de la fonction SetTic()? Perso, je ne l'ai jamais utilisé, le SetPos() suffit

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
70
Date d'inscription
mercredi 1 octobre 2008
Statut
Membre
Dernière intervention
17 avril 2013
1
Oui j'ai besoin du SetTic, il met (logiquement quand sa marche) des petits traits qui te servent de repères.
J'ai enlevé le SetTic pour voir si c'était lui qui bugé mais non toujours le même problème.

Romain
Messages postés
15192
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 décembre 2021
101
Ben je viens de tester chez moi, ça fonctionne...
Dans les propriétés de mon Slider, j'ai mis "Tic Marks" à True, c'est tout ce que j'ai fait de "spécial"
Peut-être qu'ailleurs dans ton code, tu ré-initialise la position de ton slider...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
70
Date d'inscription
mercredi 1 octobre 2008
Statut
Membre
Dernière intervention
17 avril 2013
1
J'ai trouvé mon erreur la voici :
En faisant  pSlider->SetPos(640); dans ma fonction OnNMCustomdrawControldata(....); je redéfinit a chaque passage le range du control bar, du SetPos et du Set Tic !

Pour éviter cela j'ai définit mon pointeur pSlider en global et ensuite je l'initialise qu'une seul fois dans l'init dialog.
Voici ce que cela donne :




BOOL CControlDlg::OnInitDialog()
{
  CDialog::OnInitDialog();
  SetIcon(m_hIcon, TRUE);

// Set big icon

  SetIcon(m_hIcon, FALSE);

// Set small icon

  CSliderCtrl *pSlider=

static_cast
<CSliderCtrl *>(GetDlgItem(IDC_CONTROLDATA));
  pSlider->SetRange(0,1279);

// Slider de 1280 pts

  pSlider->SetPos(640);


  pSlider->SetTic(640);
 

return
TRUE;

// return TRUE unless you set the focus to a control

}
.......................
void
CControlDlg::OnNMCustomdrawControldata(NMHDR *pNMHDR, LRESULT *pResult)



{  LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
    CSliderCtrl *pSlider=
static_cast<CSliderCtrl *>(GetDlgItem(IDC_CONTROLDATA)); 
 
  int n = pSlider->GetPos();
  
*pResult = 0;
}

Merci buno de m'avoir éclairé !

A bientôt....

Romain