HttpHandlerHistogramme.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. try
  23. {
  24. const int ecartEntreBarre = 10;
  25. const int largeurBarre = 30;
  26. // recupération des parametres
  27. int CapaciteTheorique = Convert.ToInt32(context.Request["nbCt"]);
  28. int largeur = Convert.ToInt32(context.Request["l"]);
  29. int hauteur = Convert.ToInt32(context.Request["h"]);
  30. Color fond = Color.White;
  31. int nbBarre = Convert.ToInt32(context.Request["nb"]);
  32. decimal[] valeurs = new decimal[nbBarre];
  33. Color[] couleurs = new Color[nbBarre];
  34. string[] legende = new string[nbBarre];
  35. decimal valeurMaxi = decimal.MinValue;
  36. decimal valeurMini = decimal.MaxValue;
  37. // chargement des valeurs et détermination de la valeur maxi et mini (bien que cette dernière ne serve pas pour le moment)
  38. for (int i = 1; i < nbBarre + 1; i++)
  39. {
  40. valeurs[i - 1] = Convert.ToInt32(context.Request[string.Format("v{0}", i)]);
  41. couleurs[i - 1] = Color.FromArgb(Convert.ToInt32(context.Request[string.Format("c{0}", i)]));
  42. legende[i - 1] = context.Request[string.Format("t{0}", i)];
  43. if (i == 1)
  44. {
  45. valeurMaxi = valeurs[i - 1];
  46. valeurMini = valeurs[i - 1];
  47. }
  48. else
  49. {
  50. if (valeurs[i - 1] > valeurMaxi)
  51. valeurMaxi = valeurs[i - 1];
  52. if (valeurs[i - 1] < valeurMini)
  53. valeurMini = valeurs[i - 1];
  54. }
  55. }
  56. string legendeMoyenne = "Capacité théorique: " + CapaciteTheorique.ToString();
  57. // calcul de l'échelle
  58. decimal echelle = (hauteur - 40) / valeurMaxi;
  59. Bitmap graphique = new Bitmap(largeur, hauteur);
  60. Graphics g = Graphics.FromImage(graphique);
  61. // affichage du fond d'écran
  62. SolidBrush pinceau = new SolidBrush(fond);
  63. g.FillRectangle(pinceau, 0, 0, largeur, hauteur);
  64. pinceau.Dispose();
  65. SolidBrush stylo = new SolidBrush(Color.Black);
  66. Font police = new Font("Arial", 10, FontStyle.Bold);
  67. // affichage des barres
  68. for (int i = 0; i < nbBarre; i++)
  69. {
  70. pinceau = new SolidBrush(couleurs[i]);
  71. g.FillRectangle(pinceau, ecartEntreBarre + ((largeurBarre + ecartEntreBarre) * i), (float)(hauteur - 20 - valeurs[i] * echelle), largeurBarre, (float)(valeurs[i] * echelle));
  72. g.DrawString(valeurs[i].ToString(), police, stylo, ecartEntreBarre + ((largeurBarre + ecartEntreBarre) * i), (float)(hauteur - 35 - valeurs[i] * echelle));
  73. pinceau.Dispose();
  74. g.DrawString(legende[i], police, stylo, ecartEntreBarre + ((largeurBarre + ecartEntreBarre) * i), (float)(hauteur - 20));
  75. }
  76. stylo.Dispose();
  77. // Affichage de la ligne moyenne
  78. Pen greenPen = new Pen(Color.Green, 3);
  79. int x1 = 0;
  80. int y1 = (int)(hauteur - 20 - CapaciteTheorique * echelle);
  81. //int y1 = (int)(hauteur - 20 - 400 * echelle);
  82. int x2 = largeur;
  83. //int y2 = (int)(hauteur - 20 - 400 * echelle);
  84. int y2 = (int)(hauteur - 20 - CapaciteTheorique * echelle);
  85. // Draw line to screen.
  86. SolidBrush styloVert = new SolidBrush(Color.Green);
  87. g.DrawLine(greenPen, x1, y1, x2, y2);
  88. g.DrawString(legendeMoyenne, police, styloVert, (float)(450), (float)(y1 - 80));
  89. context.Response.StatusCode = 209;
  90. // Envoi de l'image dans le flux http de sortie
  91. context.Response.ContentType = "image/gif";
  92. graphique.Save(context.Response.OutputStream, ImageFormat.Gif);
  93. // libération des ressources
  94. styloVert.Dispose();
  95. graphique.Dispose();
  96. g.Dispose();
  97. }
  98. catch (Exception e)
  99. {
  100. context.Response.StatusCode = 510;
  101. context.Response.Write(e.Message.ToString());
  102. }
  103. }
  104. }
  105. }