页面中动态画有超连接的图

最近有个项目,客户要求在客户端能动态显示不同年份数据,用折线图来表示,并且单击相关年份能查看详细数据,这里就有个问题放在面前,要从数据库里动态生成折线图,并且不只图,还能友好的操作。
分析了一下,可以通过至少三种技术做到,一是利用 javascript 脚本自身画图功能去实现,服务端的数据可以用 Ajax 来获取,这样就做到了客户端动态画折线图显示各年数据了,但这种方法要求的客户端的脚本代码相对复杂,实现起来有一定的困难。另一种方法是用插件技术实现,比如 flash silverlight ,这种方法表现效果很好,问题是我不是专业的 flash silverlight 手,实现有点难度。最后一种是靠自己的 C# 基本结合 HTML 来完成了。下面说说这种做法。
首先来构建客户端代码:
1<%@ Page Language="C#" AutoEventWireup="true" CodeBehind=" Index.aspx.cs" Inherits="MediaAdSystem. Index" %>
2
3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4
5<html xmlns="http://www.w3.org/1999/xhtml" >
6<head runat="server">
7        <title>无标题页</title>
8</head>
9<body >
10
11<script language="javascript" type=" text/javascript">
12// <!CDATA[
13//通过滚轮实现对图片的缩放
14function ChangImg(o)    
15{    
16var zoom=parseInt(o.style.zoom, 10)||100;
17zoom+=event.wheelDelta/12;
18if (zoom>0)
19 o.style.zoom=zoom+ '%';    
20 //一个标签显示缩放百分比
21 document .getElementById ("bfb").innerHTML =Math. floor(zoom) +"%";
22return false;    
23}    
24// ]]>
25</script>
26        <form id="form1" runat="server">
27        <div>
28         </div>
29        <center >    
30                < table style="width: 100%;">
31                        <tr>
32                                <td>
33                                        第一年:<asp:TextBox ID="TextBox1" runat="server">90</asp:TextBox> 
34                                </td>
35                                <td>
36                                        第二年:<asp:TextBox ID="TextBox2" runat="server">46</asp:TextBox>  
37                                </td>
38                                <td>
39                                        第三年:<asp:TextBox ID="TextBox3" runat="server">23</asp:TextBox> 
40                                </td>
41                        </tr>
42                        <tr>
43                                <td>
44                                        第四年:<asp:TextBox ID="TextBox4" runat="server">123</asp:TextBox>  
45                                </td>
46                                <td>
47                                        第五年:<asp:TextBox ID="TextBox5" runat="server">56</asp:TextBox>  
48                                </td>
49                                <td>
50                                        第六年:<asp:TextBox ID="TextBox6" runat="server">333</asp:TextBox>  
51                                </td>
52                        </tr>
53                </ table>        
54                    <span id="bfb">100%</span><asp:Button ID="Button6" runat="server" Text="生成图表" />        
55                <br />
56                <asp:ImageMap ID="ImageMap1" onmousewheel=" return ChangImg(this)"    runat="server">
57                </asp:ImageMap>
58             </center>
59        </form>
60        </body>
61</html>
62
 
客户端主要是数据的录入,和 Img 图片标签的展示。我们发现,这里用的是 ImageMap ,并非普通的 Image ,这是因为我们要用到 ImageMap Map 的功能,通过点击相应年进入该年的详细信息页面。还有一点就是我们可以从 JS 的函数中能得到图片的缩放比例,显示在一个 id bfb span 标签上。
下来我们就把客户端的数据,通过后台代码生成 ImageMap:
1protected void Button1_Click(object sender, EventArgs e)
2                {
3                         int[] intarr = new int[6] { int.Parse(TextBox1. Text), int.Parse(TextBox2. Text), int.Parse(TextBox3. Text) ,
4                                                         int.Parse(TextBox4. Text), int.Parse(TextBox5. Text), int.Parse(TextBox6. Text)         };                        
5                         int step = 80;
6                        //画热点的图形
7                         for ( int i = 0; i < 6; i++)
8                        {
9                                CircleHotSpot Circ = new CircleHotSpot();
10                                Circ.Radius = 5;
11                                Circ.X = i*step+10;
12                                Circ.Y = 340 - intarr[i];
13                                Circ.NavigateUrl = "http://www.baidu.com? year="+i;
14                                Circ.AlternateText = i.ToString ();
15                                Circ.Target = "_blank";
16                                ImageMap1.HotSpots. Add(Circ);
17                        }                
18                        ImageMap1.ImageUrl = "image1.aspx?c1=" + TextBox1. Text + "&c2=" + TextBox2. Text + "&c3=" + TextBox3. Text + "&c4=" + TextBox4. Text + "&c5=" + TextBox5. Text + "&c6=" + TextBox6. Text;            
19                }
20
 
代码中的 for 语句用来生成热点,热点的个数决定于数据。 <?XML:NAMESPACE PREFIX = O />

接下来,我们看一下画图类,这个其在我 利用Ajax无全页面提交实现动态画图 的文章中说过,这里只把代码共享出来。
1using System;
2using System.Collections;
3using System.Configuration;
4using System.Data;
5using System.Web;
6using System.Web.Security;
7using System.Web.UI;
8using System.Web.UI.HtmlControls;
9using System.Web.UI.WebControls;
10using System.Web.UI.WebControls.WebParts;
11using System.Drawing;
12using System.Drawing.Drawing2D;
13using System.Drawing.Imaging;
14
15public partial class image1 : System.Web.UI.Page
16{
17        protected void Page_Load(object sender, EventArgs e)
18        {
19                DrawMarket();
20        }
21        /** <summary>
22        /// 自动画折线图
23        /// </summary>
24        private void DrawMarket()
25        {
26                 int[] ZbArr = new int[Request.QueryString. Count];
27                 for ( int i = 0; i < ZbArr.Length; i++)
28                {
29                        ZbArr[i] = int.Parse(Request.QueryString[i]);
30                }
31                 int width = 600, height = 360;
32                Bitmap bm = new Bitmap(width, height);
33                Graphics g = Graphics.FromImage(bm);
34                g.Clear(Color.White);
35                Brush b = new SolidBrush(Color.Green);
36                Pen p = new Pen(Color.Black,1.8f);
37                Pen p1 = new Pen(Color.Green, 2);
38                p.EndCap = LineCap.ArrowAnchor ;
39                //画坐标系
40                g.DrawLine(p, 10, 340, 540, 340);
41                g.DrawLine(p, 10, 340, 10, 10);
42                g.DrawString("年", new Font("宋体", 15, FontStyle.Bold), b, 545, 332);
43                 int step = 80;
44                //画折线
45                GraphicsPath graphPath = new GraphicsPath();
46                Point[] point = new Point[ZbArr.Length];
47                 for ( int i = 0; i < point.Length; i++)
48                {
49                        point[i].X = i * step + 10;
50                        point[i].Y = 340 - ZbArr[i];
51                }
52                Pen blackPen = new Pen(Color.Black, 3);
53                graphPath.AddLines(point);
54                g.DrawPath(p, graphPath);
55                //画点
56                 for ( int i = 0; i < point.Length; i++)
57                {
58                        g.DrawEllipse(p1, point[i].X - 5, point[i].Y - 5, 10, 10);
59                }                
60                bm. Save(this.Response.OutputStream, ImageFormat.Jpeg);
61                g.Dispose();
62                bm.Dispose();
63
64        }
65}
66
这种画图的效果相对来说明了,但出来的图的效果不是太好,需要进一步优化。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值