salut,
il y a un probleme a ton code c'est qu'il est reentrant .
la logique est placéee sur OnSelchangeListbox()
et dans le traitement on provoque a nouveau ce message .
essaye de placer un booleen pour empecher la reentrance.
![]()
salut,
il y a un probleme a ton code c'est qu'il est reentrant .
la logique est placéee sur OnSelchangeListbox()
et dans le traitement on provoque a nouveau ce message .
essaye de placer un booleen pour empecher la reentrance.
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
oula, en effet j'y avait pas pensé, je comprend meme pas comment ca peut faire le bon traitement vu que je devrai réentrer indéfiniment dans cette fonction...
j'ai modifier le code pour essayer de faire comme tu as dis.
mais ca n'a pas supprimer le clignotement
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 void CIHMListeDlg::OnSelchangeListbox() { if(m_bSelChange==false) { m_bSelChange=true; SetRedraw(FALSE); m_iCurrentselection=m_MyListBox.GetCurSel(); if(m_iCurrentselection>m_iPrecSelection) { m_MyListBox.SetCurSel(m_iCurrentselection+2); m_iPrecSelection=m_iCurrentselection; m_MyListBox.SetCurSel(m_iCurrentselection); }else { m_MyListBox.SetCurSel(m_iCurrentselection-2); m_iPrecSelection=m_iCurrentselection; m_MyListBox.SetCurSel(m_iCurrentselection); } SetRedraw(); RedrawWindow(); m_bSelChange=false; } }![]()
j'ai débuggué la fonction OnSelchangeListbox() et il semble qu'elle ne soit pas réentrante de toute facon.
sinon j'ai toujours pas reussi à supprimer ce clignotement.
ou sinon pour eviter le clignotement, comment je peu fair pour fair defiler ma liste box sans faire defiler ma selection???
help, tout mon projet avance (j'ai tres bientot fini) mais c'est toujour aussi moche...![]()
Bon je reviens,
Essaye de faire ça sur ta listbox :
Au lieu de toucher à setcursel tu vas déplacer l'ascenseur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 m_MyListBox.PostMessage(WM_VSCROLL,SB_LINEDOWN,1);![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
8)
vous allez dire "mais il est chiant celui la!!" mais desoler ca ne marche pas a 100%
j'ai essayer plein de methode pour eviter de voir ma selection osciller entre le moment ou elle change et le moment ou j'affiche.
maintenant j'arrive a eviter tout ces clignotement mais mon ascenceur n'est plus actualisé.
voila ma methode:
dans initdialog je bloque l'affichage de ma listbox
je ne fait rien dans OnSelChangeListBox()
Code : Sélectionner tout - Visualiser dans une fenêtre à part m_MyListBox.SetRedraw(false);
et je detecte l'appui sur les touche up & down (obliger pour le reste de mon projet) en faisant:
existe-t-il un moyen (un postmessage ou autre) pour dir d'actualiser l'ascenseur car le m_MyListBox.RedrawWindow(); ne le fait pas.
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 BOOL CIHMListeDlg::PreTranslateMessage(MSG* pMsg) { if(pMsg->message == WM_KEYDOWN)//si il s'agit de l'appui sur une touche { if(pMsg->wParam == 8) //touche backspace { ... }else if (pMsg->wParam == VK_DOWN) //on descend dans la liste { int iIndex=m_MyListBox.GetTopIndex();//n° de l'item tout en haut m_iCurrentselection=m_MyListBox.GetCurSel();//n° de l'item selectionné m_MyListBox.SetRedraw(true);//on autorise l'affichage if( m_iCurrentselection==iIndex+12)//si l'item selectionné est parmi les deux item a laissé libre en bas de la liste { m_MyListBox.PostMessage(WM_VSCROLL,SB_LINEDOWN,1);//on fait monter la liste } m_MyListBox.RedrawWindow();//on actualise l'affichage m_MyListBox.SetRedraw(FALSE);//on rebloque l'affichage }else if (pMsg->wParam == VK_UP) { int iIndex=m_MyListBox.GetTopIndex(); m_iCurrentselection=m_MyListBox.GetCurSel(); m_MyListBox.SetRedraw(true); if( m_iCurrentselection<=iIndex+2) { m_MyListBox.PostMessage(WM_VSCROLL,SB_LINEUP,1); } m_MyListBox.RedrawWindow(); m_MyListBox.SetRedraw(FALSE); } } return CDialog::PreTranslateMessage(pMsg); }
un moyen serait d'utiliser la fonction RedrawWindow() de la cdialog mais dans ce cas tout ce met a clignoter.
désoler de vous prendre la tete avec ma listbox, surtout que apres j'ai encore deux autre question dessus.
![]()
c'est bien compliqué tout ça lol,
essaye un Invalidate au lieu de RedrawWindow.
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
oui c'est compliqué... surtout pour une simple list box... et encore t'a pas vu tout le traitemement d'enregistrement des evenements sur ma list box (les aller retour, les pause, les selection.....)
le invalidate n'a rien changé. l'ascenseur est toujour figé. j'ai l'inpression que cet ascenseur est mis a jour à la modification de la selection dans la list box mais comme je bloque l'affichage lors de cette modification je bloque aussi l'ascensseur.
si je debloque l'affichage pour debloquer l'ascensseur on voit la selection qui oscille... ca se mort la queue.
l'ideal serai de pouvoir dir a l'ascenseur de se rafraichir. peu etre en passant par la classe mere de la listbox avec un getparent-quelque-chose. et si la classe parent decompose la fenetre en une clistbox et un ascensseur indépendant, lui passer le message pour le rafraichir...
c'est tordu et je sais pas si je suis clair (c'est deja pas tres clair dans ma tete :/ )
sinon on va dir que c'est pas possible et j'abandonne ce probleme...
et la je pose mes deux autres questions qui sont:
-comment, lors de la validation de ma selection dans ma listbox, réaliser un clignotement du bandeau de selection (par inversion video en inversant la couleur de la police avec celle du bandeau)??
-et enfin comment mettre des images a la place du texte dans ma listbox?
non pas taper sur la tete![]()
pour le raffraichissement essaye :
sur la listobox.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Invalidate(); // Update Window to cause View to redraw. UpdateWindow();
pour changer l'apparence d'une listbox il faut la customiser :listbox owner draw + classe heritée de CListBox :
voir faq :
http://c.developpez.com/faq/vc/?page...istBoxDrawItem
+
http://farscape.developpez.com/Sampl...tomListBox.zip
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
ok cool, ben je sais pas ou tu va chercher tout ca mais chapeau a toi.
le rafraichissement marche avec
me reste plus qu'a gérer le fait que ca me cause un temp de retard quand je bloque l'affichage mais je devrai pas avoir de souci (quand je fait bas bas haut lui il fait bas bas bas et apres il fait haut
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 m_MyListBox.SetRedraw(TRUE); Invalidate(); // Update Window to cause View to redraw. m_MyListBox.UpdateWindow(); m_MyListBox.SetRedraw(FALSE);).
ma listbox est deja customisée grace à la faq et a ton .zip (c'etait mon probleme initiale dans ce topic et tu m'as super aidé)
je change la police, la couleur de fond, la couleur du bandeau de selection... mais ce que je n'arrive pas a faire c'est lui dir que quand je valide ma selection je fait un clignotement.
et puis cette CMylistBox ne me permet pas non plus de mettre des images à la place du texte ou alors j'ai pas tout compris.
je crois que je vien de comprende ce qu igene pour fair clignoter lors de la validation de la selection.
dans le drawitem je travaille avec la selection pour faire mes couleur.
je pense qu'il faudrai que je traivaille avec le focus plutot et que jutilise la selection uniquement lorsque je valide un item de ma list box.
seulement le CListBox na pas de fonction equivalente a SetCurSel et GetCurSel pour le focus.
comment changer le focus pour le faire passer d'un item a un autre?
salut,
(bon j'espere avoir bien compris la demande ,mais la je suis plus sur)
pour gerer un clignotement sur la listbox il faut utiliser un timer .
j'ai rajouté cette fonctionnalité dans l'exemple sur la listbox custom du debut.
voir les differentes fonctions:
http://farscape.developpez.com/Sampl...tomListBox.zip
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void SetBlink(int nElapse,bool bActivate=false);// regle le temps et active si bActivate==true void StopBlink(); // arrete le clignotement. void StartBlink();// demarre le clignotement.
il suffit de faire entrer sur le bandeau des 2 premieres listbox.
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
salut,
merci pour l'info et le source. par contre je ne trouve pas les fonctions que tu me donnes ci dessus dans ton source, je les trouve ou?
ca doit pas etre le bon source car les fichiers date du 22/6.
bon je ne sais pas ce que j'ai foutus avec mon .zip![]()
et evidemment je n'ai pas le source avec moi ..
je vais attendre mon collegue bigboom qui l'avait telechargé avant ma boulette ,pour voir si il a gardé le projet...
je te tiens au courant.
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
pense a mettre resolu sur le post si c'est ok![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
Partager