Progressbar avec texte [mfc]

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 820 fois - Téléchargée 34 fois

Contenu du snippet

une barre de progression avec texte...

voici la réponse à plusieurs questions que j'avais posté il y a environ un an...

pour cela je me suis inspiré du srce de Dr_Progz : http://www.cppfrance.com/code.aspx?ID=25840

mais je l'ai réécrit en POO et en utilisant les MFC...
et y ai apporté qq modif
(j'avais commencé simplement à rajouter ces modifs
mais créer une nouvelle méthode global n'était pas très propre...)

tant qu'a utiliser Visual, autant que ce faire ce peu, utiliser les MFC

si qqn veux réutiliser ce srce en Win32, ben il n'a qu'a reprendre le srce de Dr_Progz et remplacer les différents éléments de la gestion du ON_PAINT

Source / Exemple :


la classe :
header
_______________________________
#ifndef BPROGESSTEXT_HPP
#define BPROGESSTEXT_HPP
#pragma once

//gestion d'une progress Bar avec Texte
class BProgressTxt : public CProgressCtrl
{
public:
	BProgressTxt() 
	{
	}
	inline BOOL OnWndMsg( UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult );
	inline void StepIt(const char *text=NULL);
	inline void init(const unsigned int nbEvts=100,const char *text=NULL);
	
private:
	CString m_Text;
};
#endif //BPROGESSTEXT_HPP
_______________________________
le srce :
_______________________________

inline BOOL BProgressTxt::OnWndMsg( UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult )
{
	if (message == WM_GETDLGCODE)
       return DLGC_WANTALLKEYS;
	if (message == WM_PAINT)
	{
		
		/// algo : l'appel du pere est NOK si il y a d'autres trtts...
		/// algo : dessine la barre (autant le faire faire par le pere...)
		/// Nota : de plus si on le fait nous même, un .manifest éventuel serait ignoré
		/// Nota : ceci dit, on ne peux savoir la couleur de ce .manifest alors... code de remplissage laissé en commentaire
	//	BOOL retour=CProgressCtrl::OnWndMsg( message, wParam, lParam, pResult );
	//*
		RECT  rectZone, rectGauche, rectDroit;
		CRgn  region;
		DWORD dwTextStyle = DT_CENTER | DT_VCENTER | DT_SINGLELINE;
		int nPos = GetPos();
		COLORREF crBarColour = GetSysColor(COLOR_HIGHLIGHT);
		COLORREF crBgColour  = GetSysColor(COLOR_WINDOW);
		
		GetClientRect(&rectZone);
		rectGauche = rectDroit = rectZone;
		
			int inutil,lim;//inutil tjs à 0
		GetRange(inutil,lim);
		rectGauche.right = rectGauche.left + (int)((
			(rectGauche.right - rectGauche.left)

  • nPos) / lim);
rectDroit.left = rectGauche.right; CClientDC dc(this); ///algo : Dessine la bar (à commenter) dc.FillSolidRect(&rectGauche, crBarColour); dc.FillSolidRect(&rectDroit, crBgColour); ///algo : Genere puis Affiche le texte CString szTexte; if(m_Text!="") if(nPos!=0) //wsprintf(szTexte, "Etat: %d%% - %s", nPos,(const char*)m_Text); szTexte.Format("%d%% - %s", nPos*100/lim,(const char*)m_Text); else //wsprintf(szTexte, "%s",(const char*)m_Text); szTexte.Format("%s",(const char*)m_Text); else if(nPos!=0) //wsprintf(szTexte, "Etat: %d%%", nPos); szTexte.Format("%d%%", nPos*100/lim); else //wsprintf(szTexte, "Prêt"); szTexte="OK"; dc.SetBkMode(TRANSPARENT); ///algo : Le blanc region.CreateRectRgn(rectGauche.left, rectGauche.top, rectGauche.right, rectGauche.bottom); dc.SelectClipRgn(&region); dc.SetTextColor(crBgColour); dc.DrawText(szTexte, (int)lstrlen(szTexte), &rectZone, dwTextStyle); ///algo : Le bleu region.DeleteObject(); region.CreateRectRgn(rectDroit.left, rectDroit.top, rectDroit.right, rectDroit.bottom); dc.SelectClipRgn(&region); dc.SetTextColor(crBarColour); dc.DrawText(szTexte, (int)lstrlen(szTexte), &rectZone, dwTextStyle); //* return TRUE; // */ return false;//retour; } return CProgressCtrl::OnWndMsg( message, wParam, lParam, pResult ); } inline void BProgressTxt::StepIt(const char *text) { if(text==NULL) m_Text = ""; else m_Text = text; CProgressCtrl::StepIt(); } inline void BProgressTxt::init(const unsigned int nbEvts,const char *text) { if(text==NULL) m_Text = ""; else m_Text = text; SetPos(-1); SetStep(1); if(nbEvts==0)//pr tolérer err... SetRange32(0,1); else SetRange32(0,nbEvts); }

Conclusion :


utilisation:

créer une progressBar et redéfinir son type en CtextProgressBar

CtextProgressBar c_textProgress;

l'initialiser (non encore fait)
c_textProgress.init(3);

puis aux instants désirés, faire

c_textProgress.StepIt("Debut");
..
c_textProgress.StepIt("Milieu");
..
c_textProgress.StepIt("Fin");

______

nota: G po encore redéfini l'init, ça vient sous très peu...
et MP n'est pas encore passé dessus...

++

A voir également

Ajouter un commentaire

Commentaires

magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
effectivt, ça permet de forcer le réaffichage, dès que le processeur à le tps...
cs_liv
Messages postés
49
Date d'inscription
lundi 17 mai 2004
Statut
Membre
Dernière intervention
26 avril 2006

J'ai trouvé la solution.

Appellle la fonction InvalidateRect(NULL) dans OnSize afin de forcer l'appel sur OnPaint.
Ca roule comme du beurre après.
cs_liv
Messages postés
49
Date d'inscription
lundi 17 mai 2004
Statut
Membre
Dernière intervention
26 avril 2006

oki...je te tiens au courant dès que j'ai du nouveau.
cs_liv
Messages postés
49
Date d'inscription
lundi 17 mai 2004
Statut
Membre
Dernière intervention
26 avril 2006

En fait le problème est que mon rectangle n'est pas rafraîchit correctment.
Les anciennes valeurs sont gardées et le programme se contente d'ajouter les nouvelles.
Le comportement se passe comme si je dessinait en direct sur ma fenêtre.

-1- j'étire la fenêtre à droite -> mon rectangle s'étire sur la droite
-2- j'étire la fenêtre en bas -> mon rectangle s'étire en bas.

Tu vois le truc?
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
G égalt un pb pr replacer une barre de statu après des modifs sur la taille...

A l'étude...

sinon, ton gris foncé est plutot noir
à part ça, ça a l'air bon

++
Nono.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.