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.
:D
Version imprimable
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.
:D
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:
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.
pas d'id�es pour 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... :cry:
Bon je reviens,
Essaye de faire �a sur ta listbox :
Au lieu de toucher � setcursel tu vas d�placer l'ascenseur.
:DCode:
1
2 m_MyListBox.PostMessage(WM_VSCROLL,SB_LINEDOWN,1);
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: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:
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.
:P
c'est bien compliqu� tout �a lol,
essaye un Invalidate au lieu de RedrawWindow.
:D
edit: oops desoler... double post
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 :oops:
pour le raffraichissement essaye :
sur la listobox.Code:
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
:D
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 :cfou: ).Code:
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 :roll: )
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.zipCode:
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.
:D
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 :scarymov:
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.
:D
merci c'est super.
pense a mettre resolu sur le post si c'est ok :wink: