Progressbar avec texte [mfc]

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

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.