begin process at 2010 02 10 07:37:48
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > CLASSE GRAPH: GESTION DES GRAPHIQUES DANS LES APPLICATIONS WIN32

CLASSE GRAPH: GESTION DES GRAPHIQUES DANS LES APPLICATIONS WIN32




 Description

Cliquez pour voir la capture en taille normale
Cette classe permet de gérer très facilement l'ajout de graphique dans vos applications. Elle utilise les API win 32 pure.
L'interface homme machine a été pensée pour être le plus simple intuitif et le plus simple possible.

-Un clic gauche déplacé permet de déplacer la fenêtre de visualisation.
-Un clic droit permet de faire un zoom optimal sur les courbes du graphique.
-un clic droit déplacé permet d'adapter la fenêtre de visualisation au rectangle créer.
-La molette de la souris permet de faire un zoom ou un dé zoom sur les données.
-Un clic gauche sur une courbe permet de la sélectionner. La courbe sélectionnée devient la courbe courante.
-Lorsque l'utilisateur appuie le bouton supprimé lorsqu'une courbe est sélectionnée, cette courbe est supprimée.
-La touche Echap permet de désélectionner la courbe.
-Le mouvement de la souris sur les données permet de placer le curseur sur la courbe courante et de visualiser les coordonnées.
-On peut ajouter un titre et une légende.

Source

  • //**************************************************************************************
  • //Vincent Morard
  • //Graph : Classe pour la gestion des graphiques dans une application Win32
  • //23/05/2009
  • //**************************************************************************************
  • #include <windows.h>
  • #include <math.h>
  • #include "Plot.h"
  • HINSTANCE hInst;
  • LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  • {
  • static int cx,cy;
  • static Plot *P1,*P2,*P3;
  • switch (message)
  • {
  • case WM_CREATE:
  • double X[1000],Y[1000],Y2[1000],Y3[1000],Y4[1000],Y5[1000],Y6[1000],Y7[1000];
  • Plot::Initialize(hInst);
  • P1 = new Plot();
  • P2 = new Plot();
  • P3 = new Plot();
  • P1->CreatePlot(0,WS_CHILD|WS_VISIBLE,20,20,100,200,hwnd);
  • P2->CreatePlot(0,WS_CHILD|WS_VISIBLE|WS_DLGFRAME,300,20,50,200,hwnd);
  • P3->CreatePlot(0,WS_CHILD|WS_VISIBLE,20,20,100,200,hwnd);
  • //Couleur des graphs
  • P1->SetBkColor(RGB(112,156,227));
  • P1->SetGraphColor(RGB(204,219,244));
  • P2->SetBkColor(RGB(95,195,34));
  • P2->SetGraphColor(RGB(219,251,196));
  • P3->SetBkColor(RGB(193,56,41));
  • P3->SetGraphColor(RGB(251,218,196));
  • //Création des courbes
  • srand(GetTickCount());
  • X[0]=0;Y[0]=0;Y2[0]=0;Y3[0]=0;Y4[0]=0,Y5[0]=0,Y6[0]=0,Y7[0]=0;
  • for(int i=1;i<1000;i++){
  • X[i]=i;
  • Y[i]=Y[i-1]+(rand()%2 == 0 ? -1:1);
  • Y2[i]=20*sin((double)i/20);
  • Y3[i]=(i/30-2)*10;
  • Y4[i]=(sin((double)i/4)*sqrt((double)i));
  • Y5[i]=(sin((double)i/4)*sqrt((double)i*3));
  • Y6[i]=(sin((double)i/4)*sqrt((double)i*6));
  • Y7[i]=(sin((double)i/4)*sqrt((double)i*9));
  • }
  • //Ajout des courbes dans les graph
  • P1->Add(X,Y,100 ,RGB(0,200,200) ,PLOT_TYPE_CROSS_AND_LINE);
  • P2->Add(X,Y,1000 ,RGB(200,0,0) ,PLOT_TYPE_LINE);
  • P2->Add(X,Y2,1000,RGB(0,200,0) ,PLOT_TYPE_CROSS_AND_LINE);
  • P2->Add(X,Y3,300 ,RGB(255,128,64),PLOT_TYPE_CROSS);
  • P3->Add(X,Y4,100 ,RGB(100,0,0) ,PLOT_TYPE_CROSS);
  • P3->Add(X,Y5,100 ,RGB(200,0,0) ,PLOT_TYPE_CROSS);
  • P3->Add(X,Y6,100 ,RGB(255,126,0) ,PLOT_TYPE_CROSS);
  • P3->Add(X,Y7,100 ,RGB(255,189,20) ,PLOT_TYPE_CROSS);
  • P1->AddTitle("Y[i-1] + (rand()%2 == 0 ? -1:1)");
  • P3->AddTitle("Sinus pondéré avec une racine carré");
  • P3->AddLegend();
  • P3->AddLegend(0,"Sin{w/4} * sqrt(w)");
  • P3->AddLegend(1,"Sin{w/4} * sqrt(w*3)");
  • P3->AddLegend(2,"Sin{w/4} * sqrt(w*6)");
  • P3->AddLegend(3,"Sin{w/4} * sqrt(w*9)");
  • return 0 ;
  • case WM_SIZE:
  • cx = LOWORD (lParam) ;
  • cy = HIWORD (lParam) ;
  • MoveWindow(P1->GetHWND(),20,20,cx/2-20,cy/2-20,TRUE);
  • MoveWindow(P2->GetHWND(),cx/2+20,20,cx/2-40,cy/2-20,TRUE);
  • MoveWindow(P3->GetHWND(),20,cy/2+20,cx-40,cy/2-20,TRUE);
  • break;
  • case WM_DESTROY:
  • PostQuitMessage (0) ;
  • return 0 ;
  • }
  • return DefWindowProc (hwnd, message, wParam, lParam) ;
  • }
  • int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE ,PSTR szCmdLine, int iCmdShow)
  • {
  • static char szAppName[] = "Graph" ;
  • HWND hwnd ;
  • MSG msg ;
  • WNDCLASS wndclass ;
  • hInst = hInstance;
  • wndclass.style = CS_HREDRAW | CS_VREDRAW ;
  • wndclass.lpfnWndProc = WndProc ;
  • wndclass.cbClsExtra = 0 ;
  • wndclass.cbWndExtra = 0 ;
  • wndclass.hInstance = hInstance ;
  • wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
  • wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
  • wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  • wndclass.lpszMenuName = NULL ;
  • wndclass.lpszClassName = szAppName ;
  • if (!RegisterClass (&wndclass)){
  • MessageBox (NULL, "This program requires Windows NT!",szAppName, MB_ICONERROR) ;
  • return 0 ;
  • }
  • hwnd = CreateWindow (szAppName, "Graphiques",
  • WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,
  • CW_USEDEFAULT, CW_USEDEFAULT,
  • CW_USEDEFAULT, CW_USEDEFAULT,
  • NULL, NULL, hInstance, NULL) ;
  • ShowWindow (hwnd, iCmdShow) ;
  • UpdateWindow (hwnd) ;
  • while (GetMessage (&msg, NULL, 0, 0))
  • {
  • TranslateMessage (&msg) ;
  • DispatchMessage (&msg) ;
  • }
  • return msg.wParam ;
  • }
//**************************************************************************************
//Vincent Morard
//Graph : Classe pour la gestion des graphiques dans une application Win32 
//23/05/2009
//**************************************************************************************
#include <windows.h>
#include <math.h>
#include "Plot.h"
HINSTANCE hInst;


LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static int cx,cy;
	static Plot *P1,*P2,*P3;
	switch (message)
	{
	case WM_CREATE:
		double X[1000],Y[1000],Y2[1000],Y3[1000],Y4[1000],Y5[1000],Y6[1000],Y7[1000];

		Plot::Initialize(hInst);
		P1 = new Plot();
		P2 = new Plot();
		P3 = new Plot();
		
		P1->CreatePlot(0,WS_CHILD|WS_VISIBLE,20,20,100,200,hwnd);
		P2->CreatePlot(0,WS_CHILD|WS_VISIBLE|WS_DLGFRAME,300,20,50,200,hwnd);
		P3->CreatePlot(0,WS_CHILD|WS_VISIBLE,20,20,100,200,hwnd);
		
		//Couleur des graphs
		P1->SetBkColor(RGB(112,156,227));
		P1->SetGraphColor(RGB(204,219,244));

		P2->SetBkColor(RGB(95,195,34));
		P2->SetGraphColor(RGB(219,251,196));

		P3->SetBkColor(RGB(193,56,41));
		P3->SetGraphColor(RGB(251,218,196));

		//Création des courbes
		srand(GetTickCount());
		X[0]=0;Y[0]=0;Y2[0]=0;Y3[0]=0;Y4[0]=0,Y5[0]=0,Y6[0]=0,Y7[0]=0;

		for(int i=1;i<1000;i++){
			X[i]=i;
			Y[i]=Y[i-1]+(rand()%2 == 0 ? -1:1);
			Y2[i]=20*sin((double)i/20);
			Y3[i]=(i/30-2)*10;
			Y4[i]=(sin((double)i/4)*sqrt((double)i));
			Y5[i]=(sin((double)i/4)*sqrt((double)i*3));
			Y6[i]=(sin((double)i/4)*sqrt((double)i*6));
			Y7[i]=(sin((double)i/4)*sqrt((double)i*9));
		}

		//Ajout des courbes dans les graph
		P1->Add(X,Y,100  ,RGB(0,200,200) ,PLOT_TYPE_CROSS_AND_LINE);

		P2->Add(X,Y,1000 ,RGB(200,0,0)   ,PLOT_TYPE_LINE);
		P2->Add(X,Y2,1000,RGB(0,200,0)   ,PLOT_TYPE_CROSS_AND_LINE);
		P2->Add(X,Y3,300 ,RGB(255,128,64),PLOT_TYPE_CROSS);
		
		P3->Add(X,Y4,100 ,RGB(100,0,0)     ,PLOT_TYPE_CROSS);
		P3->Add(X,Y5,100 ,RGB(200,0,0)   ,PLOT_TYPE_CROSS);
		P3->Add(X,Y6,100 ,RGB(255,126,0)   ,PLOT_TYPE_CROSS);
		P3->Add(X,Y7,100 ,RGB(255,189,20)   ,PLOT_TYPE_CROSS);
		

		P1->AddTitle("Y[i-1] + (rand()%2 == 0 ? -1:1)");

		P3->AddTitle("Sinus pondéré avec une racine carré");
		P3->AddLegend();
		P3->AddLegend(0,"Sin{w/4} * sqrt(w)");
		P3->AddLegend(1,"Sin{w/4} * sqrt(w*3)");
		P3->AddLegend(2,"Sin{w/4} * sqrt(w*6)");
		P3->AddLegend(3,"Sin{w/4} * sqrt(w*9)");
		return 0 ;


	case WM_SIZE:
		cx = LOWORD (lParam) ;
		cy = HIWORD (lParam) ;
		MoveWindow(P1->GetHWND(),20,20,cx/2-20,cy/2-20,TRUE);
		MoveWindow(P2->GetHWND(),cx/2+20,20,cx/2-40,cy/2-20,TRUE);
		MoveWindow(P3->GetHWND(),20,cy/2+20,cx-40,cy/2-20,TRUE);
		break;

	case WM_DESTROY:
		PostQuitMessage (0) ;
		return 0 ;
	}
	return DefWindowProc (hwnd, message, wParam, lParam) ;
}


int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE ,PSTR szCmdLine, int iCmdShow)
{
	static char szAppName[] = "Graph" ;
	HWND         hwnd ;
	MSG          msg ;
	WNDCLASS     wndclass ;

	hInst = hInstance;

	wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
	wndclass.lpfnWndProc   = WndProc ;
	wndclass.cbClsExtra    = 0 ;
	wndclass.cbWndExtra    = 0 ;
	wndclass.hInstance     = hInstance ;
	wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
	wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
	wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
	wndclass.lpszMenuName  = NULL ;
	wndclass.lpszClassName = szAppName ;

	if (!RegisterClass (&wndclass)){
		MessageBox (NULL, "This program requires Windows NT!",szAppName, MB_ICONERROR) ;
		return 0 ;
	}

	hwnd = CreateWindow (szAppName, "Graphiques",
		WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,
		CW_USEDEFAULT, CW_USEDEFAULT,
		CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, NULL, hInstance, NULL) ;

	ShowWindow (hwnd, iCmdShow) ;
	UpdateWindow (hwnd) ;

	while (GetMessage (&msg, NULL, 0, 0))
	{
		TranslateMessage (&msg) ;
		DispatchMessage (&msg) ;
	}
	return msg.wParam ;
}

 Conclusion

L'exe est à renommer de Graph.ex en Graph.exe

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   Graph
    •   Graph
      • Graph.exTélécharger ce fichier [Réservé aux membres club]84 992 octets
      • Graph.vcprojTélécharger ce fichier [Réservé aux membres club]4 439 octets
      • main.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier4 034 octets
      • Plot.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier28 297 octets
      • Plot.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 658 octets

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture VIEWER COMPLET POUR LE TRAITEMENT DE L'IMAGE : IMANALYSE
Source avec Zip Source avec une capture ALGORITHMES D'OPTIMISATION NON LINÉAIRE: DESCENTE DE GRADIEN...
Source avec Zip Source avec une capture TRAITEMENT DE L'IMAGE: FILTRE MÉDIAN EN TEMPS CONSTANT
Source avec Zip Source avec une capture DIAGRAMME DE VORONOI CENTROIDALE [WIN32]
Source avec Zip Source avec une capture WAVELET: TRANSFORMÉE EN ONDELETTE DISCRÈTE POUR LES IMAGES

 Sources de la même categorie

Source avec Zip CALLOCATOR par troctsch
Source avec Zip HEAPCOLLECTOR par troctsch
Source avec Zip GÉNÉRE UN TABLEAU DE CARACTÉRE AU FORMAT C CONTENANT LE BYTE... par kertimanoff
FRACTIONS EGYPTIENNES par lptm974
BITOPERATOR par FrancoisGauthier

 Sources en rapport avec celle ci

Source avec Zip BASE POUR L'UTILISATION DU GDI (API WINDOWS) par _michel
Source avec Zip Source avec une capture CALCULER SES MOYENNES par uaip
Source avec Zip Source avec une capture CLASSE CGRAPHXY par bobbyantho
TRONQUER UN FICHIER(C - WINDOWS) par NitRic
Source avec Zip Source avec une capture [WIN32/LINUX/MAC][WXWIDGETS] CONVERTISSEUR DE FICHIER IMAGE ... par fredcl

Commentaires et avis

Commentaire de uaip le 31/05/2009 15:55:43

Salut,
Bon boulot d'après moi, le résultat est pas mal. Au niveau du rendu, j'aurais cependant une remarque à te faire. Quand on déplace le graphe du bas vers la droite, l'axe des ordonnées reste visible même sur la légende (on voit le trait vertical sur le texte). Ce petit défaut vient de l'ordre de l'utilisation des pinceaux, sans doute.
Niveau code, j'ai regardé en speed, c'est bien codé d'après ce que j'ai vu. J'ai juste une question quant au double buffering, tu créés le DC tampon uniquement dans le WM_CREATE, et tu ne fais que dessiner dessus et recopier sur le DC de la fenêtre avec BitBlt() dans le WM_PAINT, c'est bien ça ?
(je te demande ça, car moi je recréé le DC tampon à chaque WM_PAINT, ce qui est évidemment beaucoup plus lent en temps d'exécution).

Bonne continuation

Commentaire de Pistol_Pete le 03/06/2009 09:07:36

Salut
Merci de ton message. Oui effectivement je vois de ce que tu parles pour le trait verticale. Je corrigerai cela à l'occasion.

Pour le double buffering, je procède comme tu l'as évoqué. Je le crée une unique fois dans le WM_CREATE. C'est effectivement bien plus rapide que de le créer à chaque WM_PAINT. Cependant, la contre partie est de créer un double buffer qui est de taille fixe. Aussi pour certaine configuration d'écran (forte résolution), il est possible que le double buffer ne soit pas assez grand.
Je pense qu'une solution serait de récréer le double buffer de la taille de la fenêtre dans le WM_SIZE mais après quelques tests où je redimensionne beaucoup la fenêtre , il s'avère que la création du buffer échoue... Je ne sais pas encore à quoi cela est du.

A+

Commentaire de shorzy le 26/06/2009 14:21:25

EXCELENT TRAVAIL !!!!!!!!!!

Commentaire de Pistol_Pete le 26/06/2009 14:37:05

Merci Shorzy!

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Interface graphique [ par Oumbre ] Salut à tous !Voilà mon problème : j'ai un programme qui est écrit en C pour windows et je dois créer une interface graphique qui va avec. De plus, ce Interface graphique style Windows [ par eliot5 ] Je viens de créer sous windev un petit logiciel qui fonctionne bien mais j'aimerais connaitre la manière de procéder pour créer une interface graphiqu Tracer graphique en fonction d'un tableau [ par Bobbix ] Bonjour,Dans le cadre d'un projet, j'ai besoin de votre aide sur le graphisme en WIN32. Nous avons réalisé une carte électronique d'un oscilloscope qu Compatibilité allegro-windows : les fonctions le l'API win32 [ par programmateur ] (Je reposte ce message à cause de problemes de connexion au cite qui m'empechent de repondre a la discution)Salut,Je poste simplement ce message pour Pb de compilation C++ pour Windows [ par valoue ] Bonjour,Je developpe actuellement un appli qui doit tourner sous Windows et etre protable sous Linux.J'utilise donc dans mon prog C++ (sous VC++ .net) Win32 et les fichiers [ par platon179 ] Bonjour, j'ai un petit souci pour lire les fichiers texte sous windowsComment faut-il faire pour lire une seule ligne complète d'un fichier texte, un Prog sous Longhorn [ par LaPatoshe ] Salut &#224; tous. J'envoie ce eptit sujet pour savoir comment va se programmer Windows &#224; l'Avenir vu que Win32 va apparement &nbsp;disparaitre e MFC & API windows [ par 69lion69 ] Salut &#224; tous, alors voila g deux applications une sous MFC (client a base de socket) et une deuxi&#232;me en programmation windows (permet de trc Editeur de map->interface graphique [ par dletozeun ] Bonjour,Je voudrais faire une interface grphique windows pour un editeur de map.Cet edtiteur serait compos&#233; de plusieurs fenetres OpenGL avec aut Allegro&Win32 [ par Darksheep ] Bonjour ^^ Comme je l'expliquais dans le pr&#233;c&#233;dent post, j'aimerais cr&#233;er un &#233;diteur de map genre rpg maker &#224; l'aide d'allegr


Nos sponsors


Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

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 : 0,796 sec (4)

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