CListCtrl résoudre clignote et faites glisser la barre de défilement horizontale ne peut pas garder la trace des problèmes (MFC)

       Un écran utilisé dans le projet, comme indiqué ci-dessous, ont sur CPropertySheet Voir, sur lequel le CPropertyPage quelques-uns, ont un CListCtrl de propriété par page pour l'utilisateur pour afficher les informations. Étant donné que les informations contenues dans le CListCtrl rafraîchira une fois tous les 200ms, ce qui cesse de clignoter la région. En même temps, en raison du manque d'espace, il y a une barre de défilement horizontale sur CListCtrl, quand on veut faire défiler jusqu'au milieu du dos pour voir plusieurs colonnes de données, vous venez de tirer sur et tiré vers l'arrière en raison du point de départ de rafraîchissement, il est difficile de voir derrière les colonnes de données nous avons évoqué ce problème barre de défilement horizontale ne peut pas suivre le problème. Ce projet se concentre sur l'examen de ces deux points pour enregistrer des solutions pertinentes.

(1) fixe le scintillement

      Nous savons que la raison est parce que les graphiques clignotantes avant chaque appel redessinés OnEraseBkgnd avec la couleur d'arrière - plan de la zone effacée (par défaut est blanc), ce qui entraîne un contraste trop important entre avant et après l' image, ce qui provoque le scintillement visuel. Pour supprimer le clignotement est de réduire ce contraste. Une meilleure méthode consiste à utiliser un graphique à double mise en mémoire tampon, à savoir ouvrir une toile en mémoire pour les graphiques, puis de dessiner des graphiques bon dispositif d'affichage de copie ( http://www.diybl.com/course/3_program/ ++ c / cppjs / 200867 / 123361.html ). En outre, pour éviter les problèmes de scintillement CListCtrl, les utilisateurs également résumés ( http://blog.sina.com.cn/s/blog_5ee42ba30100g50j.html ).

     Dans l'accès à l'information ci-dessus, combiné avec le problème lui-même, la conception des solutions suivantes pour résoudre le problème de scintillement.

    Tout d' abord, étant donné que toutes les données sont mises à jour sur le CListCtrl d'affichage, pour la vue, CPropertySheet, CPropertyPage, et rien ne change, il peut interdire la zone d'effacement avec la couleur de fond à chaque fois que vous redessiner, réduire le contraste. un message de surcharge respectivement OnEraseBkgnd ces trois fonctions, changement return false; .

    En second lieu, pour le problème de scintillement CListCtrl peut être résolu en utilisant le double tampon. Comme suit:

void CMyListCtrl::OnPaint()
{
	//使用双缓冲的方法绘制背景
	CPaintDC dc(this); // device context for painting
	CRect rect;
	CRect headerRect;
	CDC MenDC;		//内存DC   
	CBitmap MemMap;

	GetClientRect(&rect);    
	GetDlgItem(0)->GetWindowRect(&headerRect);   
	MenDC.CreateCompatibleDC(&dc);   
	MemMap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height()); 
	MenDC.SelectObject(&MemMap);
	MenDC.FillSolidRect(&rect,RGB(255,255,255));   

	//调用默认的OnPaint(),把图形画在内存DC表上   
	DefWindowProc(WM_PAINT,(WPARAM)MenDC.m_hDC,(LPARAM)0);   

	//输出到显示设备
	dc.BitBlt(0,
		headerRect.Height(),   
		rect.Width(),   
		rect.Height(),   
		&MenDC,   
		0,     
		headerRect.Height(),   
		SRCCOPY);   
	MenDC.DeleteDC();
	MemMap.DeleteObject();
}

BOOL CMyListCtrl::OnEraseBkgnd(CDC* pDC)
{
	// TODO: Add your message handler code here and/or call default

	//return CListCtrl::OnEraseBkgnd(pDC);
	return FALSE;
}
     À ce stade, résoudre le problème global de scintillement.

(2) barre de défilement horizontale ne peut pas résoudre le problème de suivi

      Pour ce problème, j'ai commencé plus confus, ne savent pas comment résoudre, de la recherche en ligne, j'ai été élevé avec GetScrollPos + défilement, il a été suggéré par EnsureVisible. La première méthode que j'essayé, principalement enregistre la position actuelle de la barre de défilement, puis mis à la position enregistrée après une actualisation, cette méthode est une bonne position de retour d'enregistrement, et à faire serait donc réintroduire le problème de scintillement ( de la position de la barre de défilement à la position de départ puis d'enregistrer la position d'enregistrement, un grand contraste). La deuxième approche semble être utilisée que pour plusieurs lignes, multi-colonnes pour elle ne semble pas.

     Alors, je repense cette question. Quand j'étais à l'approche du programme est actualisé à chaque fois, d'abord supprimer de l'élément de ligne, puis ré-insérer l'élément de ligne qui contient les nouvelles informations de données. En fait, le nombre de lignes restent les mêmes, chaque mise à jour que quelques-uns seulement le contenu de l'article, donc je ne peux pas toujours juste voulu pouvoir mettre à jour les données sans effacer les opérations de poste de ligne et Réinsérer, à moins d'un nouvel élément de ligne Inscrivez-vous avant cette opération. Si vous ne pouvez pas revenir à la position de la barre de défilement, vous pouvez voir la taille de la vue actuelle en fonction de la nécessité calculée de mettre à jour l'élément CListCtrl actuel article qui est mis à jour chaque fois que les données ne sont pas tous l'élément de colonne Elément, seule la zone à la vue de la vue en cours le contenu est mis à jour (trouvé par la suite ne pas avoir à faire a été le premier point a été en mesure de résoudre le problème).

      Une fois les modifications apportées au programme, suivi de la barre de défilement horizontale peut être atteint.

void UpdateItem()
{
   //......
     CString str;
     BOOL bInsertItem = FALSE;
     if(m_bInsertItem)
     {
        m_bInsertItem = FALSE;
	bInsertItem = TRUE;
	m_listInfo.DeleteAllItems();		//删除原有的数据
     }
     for(i=0; i<CNT; i++)
     {  
        str.Format(_T("%d"), i+1);			//序号
	if(bInsertItem)
	    m_listInfo.InsertItem(i, str);		//插入行,显示序号
	str.Format(_T("ID=%d"), xxx);
	m_listInfo.SetItemText(i, 1, str);
       //插入其他内容......
       //......
     }
} 



发布了37 篇原创文章 · 获赞 204 · 访问量 44万+

Je suppose que tu aimes

Origine blog.csdn.net/zwgdft/article/details/7394318
conseillé
Classement