HttpHandlerHistogramme.cs 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.UI;
  7. using System.Web.UI.WebControls;
  8. using System.Web.UI.WebControls.WebParts;
  9. using System.Web.UI.HtmlControls;
  10. using System.Drawing;
  11. using System.Drawing.Imaging;
  12. namespace CG67.FicheCollege
  13. {
  14. public class HttpHandlerHistogramme : IHttpHandler
  15. {
  16. public bool IsReusable
  17. {
  18. get { return true; }
  19. }
  20. public void ProcessRequest(HttpContext context)
  21. {
  22. const int ecartEntreBarre = 10;
  23. const int largeurBarre = 30;
  24. // recupération des parametres
  25. int largeur = Convert.ToInt32(context.Request["l"]);
  26. int hauteur = Convert.ToInt32(context.Request["h"]);
  27. Color fond = Color.FromArgb(Convert.ToInt32(context.Request["f"]));
  28. int nbBarre = Convert.ToInt32(context.Request["nb"]);
  29. decimal[] valeurs = new decimal[nbBarre];
  30. Color[] couleurs = new Color[nbBarre];
  31. string[] legende = new string[nbBarre];
  32. decimal valeurMaxi = decimal.MinValue;
  33. decimal valeurMini = decimal.MaxValue;
  34. // chargement des valeurs et détermination de la valeur maxi et mini (bien que cette dernière ne serve pas pour le moment)
  35. for (int i = 1; i < nbBarre + 1; i++)
  36. {
  37. valeurs[i - 1] = Convert.ToInt32(context.Request[string.Format("v{0}", i)]);
  38. couleurs[i - 1] = Color.FromArgb(Convert.ToInt32(context.Request[string.Format("c{0}", i)]));
  39. legende[i - 1] = context.Request[string.Format("t{0}", i)];
  40. if (i == 1)
  41. {
  42. valeurMaxi = valeurs[i - 1];
  43. valeurMini = valeurs[i - 1];
  44. }
  45. else
  46. {
  47. if (valeurs[i - 1] > valeurMaxi)
  48. valeurMaxi = valeurs[i - 1];
  49. if (valeurs[i - 1] < valeurMini)
  50. valeurMini = valeurs[i - 1];
  51. }
  52. }
  53. // calcul de l'échelle
  54. decimal echelle = (hauteur - 40) / valeurMaxi;
  55. Bitmap graphique = new Bitmap(largeur, hauteur);
  56. Graphics g = Graphics.FromImage(graphique);
  57. // affichage du fond d'écran
  58. SolidBrush pinceau = new SolidBrush(fond);
  59. g.FillRectangle(pinceau, 0, 0, largeur, hauteur);
  60. pinceau.Dispose();
  61. SolidBrush stylo = new SolidBrush(Color.Black);
  62. Font police = new Font("Arial", 10, FontStyle.Bold);
  63. // affichage des barres
  64. for (int i = 0; i < nbBarre; i++)
  65. {
  66. pinceau = new SolidBrush(couleurs[i]);
  67. g.FillRectangle(pinceau, ecartEntreBarre + ((largeurBarre + ecartEntreBarre) * i), (float)(hauteur - 20 - valeurs[i] * echelle), largeurBarre, (float)(valeurs[i] * echelle));
  68. g.DrawString(valeurs[i].ToString(), police, stylo, ecartEntreBarre + ((largeurBarre + ecartEntreBarre) * i), (float)(hauteur - 35 - valeurs[i] * echelle));
  69. pinceau.Dispose();
  70. g.DrawString(legende[i], police, stylo, ecartEntreBarre + ((largeurBarre + ecartEntreBarre) * i), (float)(hauteur - 20));
  71. }
  72. stylo.Dispose();
  73. // Envoi de l'image dans le flux http de sortie
  74. context.Response.ContentType = "image/bitmap";
  75. graphique.Save(context.Response.OutputStream, ImageFormat.Gif);
  76. // libération des ressources
  77. graphique.Dispose();
  78. g.Dispose();
  79. }
  80. }
  81. }