begin process at 2012 02 08 09:49:23
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > PROGRESSBAR AVEC TEXTE [MFC]

PROGRESSBAR AVEC TEXTE [MFC]


 Information sur la source

Note :
Aucune note
Catégorie :API Classé sous :progressbar, texte, mfc Niveau :Initié Date de création :02/09/2004 Date de mise à jour :03/09/2004 11:59:10 Vu :5 995

Auteur : magic_Nono

Ecrire un message privé
Site perso
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 Description

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

  • 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);
  • }
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_textPr ogress.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...

++


 Historique

03 septembre 2004 11:59:10 :
lib completement fonctionnelle

 Sources du même auteur

Source avec Zip [MFC] BCOMBOBOX & BLISTBOX
Source avec Zip Source avec une capture [ C++ WIN32 ] REMPLISSAGE DE FICHE - FENETRE DYNAMIQUE
Source avec Zip Source avec une capture WIN32 - MFC - VC6 - PLACE D'UNE APPLI : BARRE DES TACHES OU ...
Source avec Zip [WIN32] [VC6] BOITE À CHOIX MULTIPLE PAR BOUTONS
Source avec Zip TEMPLATE DE DIALOG/FENETRE (VC++)

 Sources de la même categorie

Source avec Zip WIN32 TLS LENT par dguilmain
Source avec Zip VIDER ELEMENTS DE CORBEILLE WINDOWS7 (WIN64) par BruNews
Source avec Zip Source avec une capture FIND TEXT (WIN64) par BruNews
Source avec Zip DELETE DIRECTORY (WIN64) par BruNews
Source avec Zip ENUM DIRECTORY (WIN64) par BruNews

 Sources en rapport avec celle ci

Source avec Zip ANALYSEUR DE TEXTE (MAJ V2) par sholvaC
Source avec Zip GÉNÉRATEUR DE TEXTES ALÉATOIRES COHÉRENTS (CHAÎNES DE MARKOV... par CptPingu
Source avec Zip Source avec une capture ALGORITHME DE CRYPTAGE/DECRYPTAGE par besilent
Source avec Zip Source avec une capture APPLI FINANCIERE AVEC GUI MFC par zangul
Source avec Zip Source avec une capture TILE MAP EDITOR 2.4 par GoldenEye

Commentaires et avis

Commentaire de Hades53 le 02/09/2004 22:42:58

Ca a l'air cool.
Cependant tu aurais pu inclure une screenshot.
Et si tu pouvais adapter ça sans MFC, ça serait cool car les MFC: pouhaa!

Bonne continuation.

Commentaire de DeAtHCrAsH le 04/09/2004 11:16:37

Hades53> regarde juste un peu avant. Tu trouveras un code similaire sans mfc de Dr_Progz.

Shell

Commentaire de magic_Nono le 06/09/2004 10:06:24

shell
je l'ai spécifié comme source d'inspiration

mais

il ne gère pas le cht de bornes
et l'envoi de tout textes et surtout

ne respecte pas du tout la POO !!!

++

Commentaire de magic_Nono le 13/09/2004 11:41:00

réponse à une discussion sur le forum
_____________________________
Liv
>J'ai regardé tes sources....très instructif.
>J'ai 2 petites questions pour toi.
>
>-1- Je n'arrive pas bien à identifier le type CRgn. Peux-tu m'en dire un peu plus.

>-2- J'avais fais à peu près le même genre de manip dans ma fonction OnPaint()....ça marchait mais il y avait un pb.
>J'essayais de dessiner un rectangle prenant toute la largeur de ma boîte de dialogue sur une épaisseur de 10. Lorsque la dlg est initialisée pas de pb mais si je la redimensionne ça part en cacahouète.
>En somme ça ne rafraîchie pas correctement. As-tu une idée?

___________________________________

réponse :


CRgn : région, zone à redessiner...

Fait parti des mfc (#include <afxwin.h>)

gogo msdn

The CRgn class encapsulates a Windows graphics device interface (GDI) region. A region is an elliptical or polygonal area within a window. To use regions, you use the member functions of class CRgn with the clipping functions defined as members of class CDC.

The member functions of CRgn create, alter, and retrieve information about the region object for which they are called.

For more information on using CRgn, seeGraphic Objects in Visual C++ Programmer’s Guide.

pb de rafraichissement:
à mon avi lié au DC que tu utilises

CClientDC ou CDC ou autre.

++
Nono.

Commentaire de liv le 13/09/2004 12:11:09

Merci pour l'info sur le type CRgn...je regarderai d'avantages les MSDN.

Pour l'autre pb je ne vois pas trop...Peux-tu jetter un coup d'oeil sur mon code inclus dans la fonction OnPaint() ?

CPaintDC dc(this);

//Je récupère les dimensions de la Dlg
CRect rect;
GetClientRect(&rect);

//m_limite de type CRect définit dans mon .h
m_limite.SetRect(0,rect.bottom-40,rect.right,rect.bottom-30);

CDialog::OnPaint();

CBrush dark_gray(RGB(0,0,0));
dc.FillRect( &m_limite, &dark_gray);
dc.SelectObject( &m_limite);

Commentaire de magic_Nono le 13/09/2004 12:23:50

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.

Commentaire de liv le 13/09/2004 12:24:58

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?

Commentaire de liv le 13/09/2004 12:26:44

oki...je te tiens au courant dès que j'ai du nouveau.

Commentaire de liv le 13/09/2004 14:38:14

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.

Commentaire de magic_Nono le 13/09/2004 14:54:23

effectivt, ça permet de forcer le réaffichage, dès que le processeur à le tps...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

MFC editeur de texte [ par hobbes ] Bonjour,je suis entrain d essayer de faire un editeur de texte avec les MFC. Pour le moment, je peux ecrire du texte dans une fenetre mais je ne vois Edit Box en MFC visual c++ [ par Rifo ] Salut.Je suis débutant en C++, j'apprend pour mon plaisir avec une sorte deméthode en 21 lecon..J'ai fais un petit programme pour moi, qui est tout bê texte d'une listeBox avec MFC [ par typhoun ] Je code en C++ et&nbsp;j'ai cr&#233;&#233; un projet MFC Application. J'ai mis une listeBox dans une boite de dialogue, je voudrai r&#233;cup&#233;rer [MFC] Couleur d'un texte [ par ekinox17 ] C'est simple, j'aimerai savoir comment changer la couleur d'un texte : je pensai pouvoir le faire avec un CFont : mais nan et je sais pas comment fair affichage de texte sans mfc [ par Spiffou ] bonsoir à tous...j'ai une petite question pour la communauté. j'ai un prog win32app en cpp developpé sur vc6 SANS MFC dans lequel je voudrais afficher MFC lire un fichier texte ligne par ligne [ par mqsi ] salut a tous,vs pouvez me dire comment lire un fichier texte ligne par ligne,puis recuperer chaque ligne ds un tableau,et merci pr l'aide,je travail a lecture de fichier texte sur mfc [ par dissaben ] Bonjour,Je suis sur un projet dans lequel je dois utiliser une base de donnée. Mais du fait que je n'aurai pa assez de tempsj'utilise plutot un fichie MFC en C++ [ par ja92 ] Bonjour ,Débutant en programmation je souhaite réaliser une application en MFC qui afficherait une fenetre avec un texte.Ce texte serait composé d' un Prob Variables avec MFC [ par marcel6566 ] Mon application est une MDI avec un Splitter. De chaque coté des boite de dialogue de type FORMVIEW.Je souhaite passer des variables d'une boite de di progressbar in status bar,MFC VC++ [ par dorras7 ] Salut, je veux ajouter un progressbar à status bar Est ce quelqu'un connait une méthode simple Merci


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,290 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales