這個方法也不復雜,也就是遍歷所有的餅圖項目,為每一個項 目創建路徑對象,然後使用餅圖項目的顏色填充路徑,並使用黑線繪制路徑的邊框。
由於本程序是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 ;
}