程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#發現之旅第八講 ASP.NET圖形開發帶超鏈接的餅圖(7)

C#發現之旅第八講 ASP.NET圖形開發帶超鏈接的餅圖(7)

編輯:關於C語言

這個方法也不復雜,也就是遍歷所有的餅圖項目,為每一個項 目創建路徑對象,然後使用餅圖項目的顏色填充路徑,並使用黑線繪制路徑的邊框。

由於本程序是ASP.Net程序,需要在服務器端生成圖片文檔,因此本對象也提供了 CreateBitmap函數來生成包含圖形的位圖對象。其代碼為

/// <summary>
/// 創建一個包含對象圖形位圖對象
/// </summary>
/// <returns>創建的位圖對象</returns>
public Bitmap CreateBitmap( )
{
  Bitmap bmp = new Bitmap( intWidth + 1 , intHeight + 1 ) ;
  using( Graphics g = Graphics.FromImage( bmp ))
  {
    g.Clear( Color.White );
     g.TranslateTransform( intLeft , intTop );
    g.SmoothingMode = SmoothingMode.HighQuality ;
    Draw( g , this.Bounds );
  }
  return bmp ;
}

這個函數裡面首先根據對象大小生成一個位圖對 象,然後在這個位圖對象上創建一個圖形繪制對象,填充白色背景,並進行一下坐標轉換, 然後調用Draw函數繪制對象圖形。然後函數就返回創建的位圖對象了。

這個對象還定 義了一個GetHtmlString的函數向主頁面提供一個顯示餅圖的Html代碼。

/// <summary>
/// 創建用於顯示餅圖圖片和超鏈接的Html代碼字符串
/// </summary>
/// <param name="imgsrc">圖片地址 </param>
/// <returns>創建的Html字符串</returns>
/// <remarks>
/// 此處沒有簡單拼湊HTML字符串,而是利用XML和Html的相似性
/// 使用一個XMLTextWriter來生成Html字符串。
/// </remarks>
public string GetHtmlString( string imgsrc )
{
  if( this.Count == 0 )
    return "";
  // 生成唯一的 map 元素名稱
  string name = System.Guid.NewGuid().ToString("N");
  // 生成  XMLTextWriter 對象
  System.IO.StringWriter myStr = new System.IO.StringWriter();
  System.Xml.XmlTextWriter writer = new XMLTextWriter( myStr );
  writer.IndentChar = ' ' ;
   writer.Indentation = 3 ;
  writer.Formatting = System.XML.Formatting.Indented ;
  // 開始輸出Html
   writer.WriteStartDocument();
  // 輸出圖片元素
  writer.WriteRaw ("<img src='" + imgsrc + "' usemap='#" + name + "' border='0'/>");
  // 輸出 map 元素
   writer.WriteStartElement("map");
  writer.WriteAttributeString ("name" , name );
  foreach( PIEShapeItem item in this )
   {
    // 輸出超鏈接區域
    Point[] ps = this.GetPoints( item );
    writer.WriteStartElement("area");
     writer.WriteAttributeString("shape" , "poly");
     writer.WriteStartAttribute("coords" , null );
    for( int iCount = 0 ; iCount < ps.Length ; iCount ++ )
    {
       writer.WriteString( ps[ iCount ].X.ToString() );
       writer.WriteString("," );
      writer.WriteString( ps[ iCount ].Y.ToString() );
      writer.WriteString("," );
    }
    writer.WriteEndAttribute();
    if( item.Link != null && item.Link.Length > 0 )
    {
       writer.WriteAttributeString("href" , item.Link );
    }
    writer.WriteAttributeString("title" , item.Text );
     writer.WriteEndElement();
  }
  writer.WriteEndElement();
   writer.WriteEndDocument();
  writer.Close();
  string Html = myStr.ToString();
  // 修正輸出的Html字符串
  int index = Html.LastIndexOf("?>");
  if( index > 0 )
  {
    html = Html.Substring( index + 2 );
  }
  return Html ;
}
/// <summary>
/// 獲得包圍餅圖區域的點坐標數組
/// </summary>
/// <param name="item">餅圖項目 </param>
/// <returns>點坐標數組</returns>
private Point[] GetPoints( PIEShapeItem item )
{
  GraphicsPath path = CreatePath( item );
  path.Flatten();
  PointF[] ps = path.PathPoints ;
  path.Dispose();
  Point[] ps2 = new Point[ ps.Length ] ;
  for( int iCount = 0 ; iCount < ps.Length ; iCount ++ )
  {
    ps2[ iCount ].X = ( int ) ( ps[ iCount ].X );
     ps2[ iCount ].Y = ( int ) ( ps[ iCount ].Y );
  }
  return ps2 ;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved