[win32][c][dev-c++] graph transparent debit reseau

Description

Voila une petite source qui affiche un graphique transparent du débit réseau (moyenne sur 1/2 minute)

Objectifs:
----------
  • modification du curseur
  • déplacement d'une fenêtre par la souris
  • dessin de graphiques
  • récupération des octets téléchargés et envoyés
  • transparence de fenêtre


click gauche = déplacement
click droit = quitter

Attention modifier "ncard" pour spécifier votre carte réseau si ce n'est pas la 1ère

comme d'habitude modifier renommer le fichier ".ex" en ".exe",

attention j'ai sélectionné un débit de 800ko/128ko et la première carte réseau pour une utilisation autre il faudra modifier ces variables.

enjoy ;)

Source / Exemple :


//------------------------------------------------------------------------------
// Projet Graph         : mesure du débit entrant/sortant (moyennes)
// Auteur               : Hanteville Nicolas
// Fichier              : proc.c
// Version              : 0.1
// Date de modification : 20/04/2008
// Description          : code pour exemple
// Environnement        : compatibilité DEVCPP / VISUAL C++ / BORLAND C++ 5.x
//------------------------------------------------------------------------------
/*
  Objectifs:
  ----------

  • modification du curseur
  • déplacement d'une fenêtre par la souris
  • dessin de graphiques
  • récupération des octets téléchargés et envoyés
  • transparence de fenêtre
click gauche = déplacement click droit = quitter Attention modifier "ncard" pour spécifier votre carte réseau si ce n'est pas la 1ère
  • /
//------------------------------------------------------------------------------ #define _WIN32_WINNT 0x0500 #include <windows.h> #include <iphlpapi.h> //-liphlpapi #pragma comment(lib, "iphlpapi.lib") //------------------------------------------------------------------------------ //débit réseau en ko entrant/sortant #define debit_dw 800 // ko #define debit_up 128 // ko //tailles de graph + fenêtre #define x_refresh 0 #define y_refresh 0 #define xx_refresh 264 #define yy_refresh 95 #define x_cadre_i 150 #define y_cadre_m 46 //bordure entre les cadres + espacement internes #define border 5 #define espace 3 //sélection de la carte réseau #define ncard 0 //nombre de valeurs /graphiques #define NB_Item 28 #define szClassName "WindowsApp" BOOL start; RECT rect; float items[NB_Item]; float itemo[NB_Item]; HWND hwnd; //------------------------------------------------------------------------------ //timer de mise à jour du schéma + down + upload DWORD WINAPI timer(LPVOID lParam) { unsigned short i; PMIB_IFTABLE buffer; ULONG size=0; //instance pour récupération de la structure GetIfTable (NULL, &size, TRUE); buffer = (PMIB_IFTABLE)GlobalAlloc(GMEM_FIXED, size); //lecture actuel + init des valeurs GetIfTable(buffer, &size, FALSE); int in = buffer->table[ncard].dwInOctets; int out = buffer->table[ncard].dwOutOctets; //tant que l'on ne quitte pas on continue while(start) { _sleep(1000);//toutes les secondes maj //rotation des valeurs for (i=0;i<NB_Item-1;i++) { items[i]=items[i+1]; itemo[i]=itemo[i+1]; } //maj des valeurs GetIfTable(buffer, &size, FALSE); //copie du débit en ko items[NB_Item-1]=(buffer->table[ncard].dwInOctets-in)/1024; itemo[NB_Item-1]=(buffer->table[ncard].dwOutOctets-out)/1024; //totaux in = buffer->table[ncard].dwInOctets; out = buffer->table[ncard].dwOutOctets; //emplacement de refresh de la forme /*rect.left = x_refresh; rect.top = y_refresh; rect.right = xx_refresh; rect.bottom = yy_refresh;*/ //toute le forme ici InvalidateRect(hwnd,0/*&rect*/,FALSE); UpdateWindow(hwnd); } GlobalFree(buffer); } //------------------------------------------------------------------------------ /* This function is called by the Windows function DispatchMessage() */ POINT pt; int mouseX,mouseY; BOOL bCapture; LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { //gestion du déplacement de la fenêtre case WM_LBUTTONDOWN: mouseX = LOWORD(lParam); mouseY = HIWORD(lParam); SetCapture(hwnd); bCapture = 1; return 0; break; case WM_LBUTTONUP: if(GetCapture() == hwnd) { ReleaseCapture(); bCapture = 0; GetCursorPos(&pt); SetWindowPos(hwnd, 0, pt.x - mouseX, pt.y - mouseY, 0, 0, SWP_NOZORDER | SWP_NOSIZE); } break; case WM_MOUSEMOVE: if(bCapture) { pt.x = LOWORD(lParam); pt.y = HIWORD(lParam); ClientToScreen(hwnd, &pt); SetCursor( LoadCursor( NULL , IDC_SIZEALL ));//icone de déplacement SetWindowPos(hwnd, 0, pt.x - mouseX, pt.y - mouseY, 0, 0, SWP_NOZORDER | SWP_NOSIZE); } break; //---- //on quit par un click droit case WM_RBUTTONDOWN: start=0; PostQuitMessage (0); break; //dessin du graphique + fenêtre case WM_PAINT: { PAINTSTRUCT ps; HDC hdc=BeginPaint(hwnd,&ps); HBRUSH Hb1 = CreateSolidBrush(RGB(0, 150, 0)); //vert HBRUSH Hb2 = CreateSolidBrush(RGB(150, 0, 0)); //rouge int a; unsigned int taillephrag,nbnb; unsigned short val,val2; float moy=0,moyout=0; //rect de contour global Rectangle(hdc,0,0,xx_refresh,yy_refresh); //les 2 autres rectangles Rectangle(hdc,border,border,x_cadre_i,y_cadre_m); Rectangle(hdc,border,y_cadre_m+espace,x_cadre_i,yy_refresh-border); for (a=0;a<NB_Item;a++) { moy+=items[a]; moyout+=itemo[a]; //position de la barre d'état val2 = 8+a*(5); //down val =y_cadre_m-(y_cadre_m-8)*items[a]/debit_dw; if (val<8)val=8; SelectObject(hdc,Hb1); Rectangle(hdc,val2,val,val2+4,y_cadre_m); //up val =yy_refresh-border-(y_cadre_m-8)*itemo[a]/debit_up; if (val<52)val=52; SelectObject(hdc,Hb2); Rectangle(hdc,val2,val,val2+4,yy_refresh-5); } moy = moy/NB_Item; moyout= moyout/NB_Item; //on ajoute les écritures max et min char tmpMoy[256]; //min rect.top = yy_refresh-20; rect.bottom = yy_refresh-border; rect.left = x_cadre_i+espace; rect.right = xx_refresh-border; FillRect(hdc, &rect, GetSysColorBrush(COLOR_WINDOW)); SetTextColor(hdc, GetSysColor(COLOR_MENUTEXT)); //1000 car au dessus de 999.99 if (moyout<1000)sprintf(tmpMoy,"up:%5.2fKo/s",moyout); else if (moyout<1024000)sprintf(tmpMoy,"up:%5.2fMo/s",moyout/1024.0); else sprintf(tmpMoy,"up:%5.2fGo/s",moyout/1048576.0); DrawText(hdc,tmpMoy,strlen(tmpMoy), &rect, DT_VCENTER); //max rect.top = border; rect.bottom = (y_cadre_m+espace)*2; if (moyout<1000)sprintf(tmpMoy,"dw:%5.2fKo/s",moy); else if (moyout<1024000)sprintf(tmpMoy,"dw:%5.2fMo/s",moy/1024.0); else sprintf(tmpMoy,"dw:%5.2fGo/s",moy/1048576.0); DrawText(hdc,tmpMoy,strlen(tmpMoy), &rect, DT_VCENTER); //libération DeleteObject(Hb1); DeleteObject(Hb2); EndPaint(hwnd,&ps); } break; case WM_DESTROY: start=0; PostQuitMessage (0); break; default: return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } //------------------------------------------------------------------------------ int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil) { MSG messages; WNDCLASSEX wincl; wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof (WNDCLASSEX); wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; if (!RegisterClassEx (&wincl)) return 0; //fenêtre sans icone dans la barre des tâche hwnd = CreateWindowEx (WS_EX_LAYERED|WS_EX_NOACTIVATE|WS_EX_TOPMOST,szClassName,"Windows App",WS_POPUP,900,200,xx_refresh,yy_refresh,HWND_DESKTOP,NULL,hThisInstance,NULL); //on affiche la fenêtre ShowWindow (hwnd, 1); //définition de l'état de transparence (0-255), 255= opaque SetLayeredWindowAttributes(hwnd,0,150,0x02); //timer maj start=1; CreateThread(NULL,0,timer,0,0,0); //définision de la région a afficher ici non utile car = fenêtre //HRGN region = CreateRectRgn(x_refresh,y_refresh,xx_refresh,yy_refresh); //SetWindowRgn(hwnd,region,1); bCapture=0; while (GetMessage (&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); } return messages.wParam; }

Codes Sources

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.