zoukankan      html  css  js  c++  java
  • 图形、GDI + 和图表(ImageMap)

    ImageMap 控件

           网页通常包含复杂的图形,当单击图形的不同部分时,会有不同的行为。ASP.NET 开发人员能够使用多种技巧来实现这个设计:

    • 拼接的图像控件。当多个无边界的图像一张挨一张仔细的定位后,看起来就像是一幅图。于是,你可以分别处理每一个控件的单击,这种方式对于已经定义矩形边界的按钮和导航控件很有效
    • ImageButton当 ImageButton 被单击时,它提供单击发生处的坐标。你可以在服务器端检测这些坐标,通过编程确定哪一部分被单击了。这种方式灵活但是编码较繁琐容易出错。
    • ImageMap你可以定义独立的区域,并唯一的命名每个区域。只有鼠标落于某个定义的区域内,指针才会变成手形,因此,这个方法对于有小热点的细致的图像很有效

           ImageMap 控件是对于 HTML 中用于定义图像映射(image map)的 <map> 和 <area> 标签的服务器端抽象。ImageMap 将自己呈现为一个 <map> 标签。通过向 ImageMap.HotSpots 集合中添加 HotSpot 对象来定义区域,每个区域被呈现为一个 <area> 标签。在 <map> 之前,ASP.NET 呈现出显示图片并使用图像区域的带链接的 <img> 标签。

    创建热点

           为了定义可以单击的区域,需要向 ImageMap.HotSpots 属性里添加 HotSpot 对象。可以使用 3 个派生类:CircleHotSpot、RectangleHotSpot、PolygonHotSpot,它们与 HTML 标准中定义的 3 种形状类型一一对应。

           在这之前,需要获知穿件的热点的确切坐标。VS 的 ImageMap 设计器不支持可视化的定义区域。建议使用别的 HTML 编辑器工具做这件事。

           调整好热点之后,可以查看源代码来确定坐标。

    • 定义矩形时,只需要左上角和右下角的坐标。
    • 定义任意多边形时,你可以随意定义多个定点。浏览器从一点出发到另一点画线来创建形状。依据 HTML 标准,建议以起始点作为结束点。
    • 定义圆形时,只需指明圆心坐标及半径即可。例如 <area shape=”circle” coords=”272, 83, 83”…>,圆心位于(272,83),半径 83 像素。

           热点可以重叠,但是先定义的热点才会处理单击事件。

           一旦确定了热点,就可以添加相应的 HotSpot 对象了。这里以矩形热点示例:

    <asp:ImageMap ID="ImageMap1" runat="server" ImageUrl="CoverShot.png" HotSpotMode="PostBack" >
        <asp:RectangleHotSpot Top="41" Left="16" Bottom="285" Right="206" />
        <asp:RectangleHotSpot Top="125" Left="475" Bottom="160" Right="659" />
        <asp:RectangleHotSpot Top="10" Left="222" Bottom="41" Right="671" />
    </asp:ImageMap>

           不必手工编写这段代码,选中控件编辑属性 HotSpots 即可。

    image 这里贴图显示不出鼠标指针的效果…

    处理热点单击

           一个热点被单击,可以激发两个动作中的一个:导航至新页面回传你的页面

           要选择使用哪个动作,需要设置 HotSpotMode 属性。设置 ImageMap.HotSpotMode 时将影响所有的热点。你当然也可以为每个热点设置 HotSpotMode 属性来覆盖这一设置。这就使得你可以让某些热点回传页面,而另一些则触发导航。

    • HotSpotMode.Inactive :完全禁用热点。
    • HotSpotMode.Navigate :全部启用导航,需要设置每个 HotSpot.NavigateUrl 的值。
    • HotSpotMode.PostBack :全部启用回传,需要设置每个 HotSpot.PosBackValue 的值,这使得 Click 事件能分辨哪个热点触发了回传。

           添加了这些细节的一段页面代码:

    <asp:ImageMap ID="ImageMap1" runat="server" ImageUrl="CoverShot.png" HotSpotMode="PostBack"
        OnClick="ImageMap1_Click">
        <asp:RectangleHotSpot Top="41" Left="16" Bottom="285" Right="206" PostBackValue="Cover" />
        <asp:RectangleHotSpot Top="125" Left="475" Bottom="160" Right="659" PostBackValue="Name" />
        <asp:RectangleHotSpot Top="10" Left="222" Bottom="41" Right="671" PostBackValue="Subtitle" />
    </asp:ImageMap>
    protected void ImageMap1_Click(object sender, ImageMapEventArgs e)
    {
        Label1.Text = "You clicked: " + e.PostBackValue;
    }

    自定义热点

           ImageMap 控件支持任何从 HotSpot 派生的热点类。

           ASP.NET 有 3 个热点类分别对应于 HTML 标准中定义的 3 类基本 <area> 形状。然而,你也可以通过 HotSpot 类派生来创建自己的热点。不过,显然一个自定义热点类并不能做超出 HTML 标准的任何事情。例如,椭圆和其他曲线画出的形状更漂亮,但是却不可用。

           不过,你仍可以使用多变类型来创建很多复杂的多边形,如三角形、八边形、菱形等这些高级模型。

           下面这个示例展示了一个简单的自定义三角形,基于中心点,宽度和高度创建:

    namespace CustomHotSpots
    {
        public class TriangleHotSpot : HotSpot
        {
            public int Width
            {
                get { return (int)ViewState["Width"]; }
                set { ViewState["Width"] = value; }
            }
     
            public int Height
            {
                get { return (int)ViewState["Height"]; }
                set { ViewState["Height"] = value; }
            }
     
            public int X
            {
                get { return (int)ViewState["X"]; }
                set { ViewState["X"] = value; }
            }
     
            public int Y
            {
                get { return (int)ViewState["Y"]; }
                set { ViewState["Y"] = value; }
            }
     
            public TriangleHotSpot()
            {
                Width = 0;
                Height = 0;
                X = 0;
                Y = 0;
            }
     
            // 必须覆盖 MarkupName 属性来返回你创建的形状的类型
            // 有效的选项只有 circle, rectangle, polygon 之一
            // 它被应用于 <area> 标签的 shape 特性中
            protected override string MarkupName
            {
                get { return "polygon"; }
            }
     
            // 最后需要覆盖此方法返回坐标特性的字符串
            // 对于多边形,必须是一个逗号间隔的 X,Y 对组成的点序列
            public override string GetCoordinates()
            {
                int topX = X;
                int topY = Y - Height / 2;
     
                int btmLeftX = X - Width / 2;
                int btmLeftY = Y + Height / 2;
     
                int btmRightX = X + Width / 2;
                int btmRightY = Y + Height / 2;
                return topX.ToString() + "," + topY.ToString() + "," +
                    btmLeftX.ToString() + "," + btmLeftY.ToString() + "," +
                    btmRightX.ToString() + "," + btmRightY.ToString() + ",";
            }
        }
    }

           现在,可以像使用自定义控件那样使用自定义热点了。首先,为标签注册一下前缀:

    <%@ Register TagPrefix="chs" Namespace="CustomHotSpots" %>

           现在单击三角形热点区域,会将用户重定向到一个新的 URL:

    <asp:ImageMap ID="ImageMap1" runat="server" ImageUrl="~/CoverShot.png" BorderColor="Red">
        <chs:TriangleHotSpot AlternateText="Triangle" NavigateUrl="Http://www.cnblogs.com"
         X="140" Y="50" Width="75" Height="80" />
    </asp:ImageMap>
  • 相关阅读:
    centos7+php7.1.4+mysql5.7+swoole搭建
    鄙视自己(转)
    Mysql的sql优化概念---三大范式
    PHP的设计模式-单例设计
    Composer的安装使用
    PHPstorm的一些快捷键
    论代码走查的重要性
    Java泛型读书笔记 (三)
    Java泛型读书笔记 (一)
    Java泛型读书笔记 (二)
  • 原文地址:https://www.cnblogs.com/SkySoot/p/2805132.html
Copyright © 2011-2022 走看看