ASP.NET 多媒体电子报刊设计(二)

在将PDF转换为一张一张图片之后,我们现在可以对每张图片进行矩形定位,也就是对每个图片里面的所有新闻进行定位。

一个矩形具有4个坐标点,我们在后期需要使用VML将其勾画出来,然后通过JS的控制,当移动到某个矩形里面的时候,才现在该矩形。因此,在这一步骤需要保存VML勾画的Point,以及X轴的最小值和最大值,还有Y轴的最小值和最大值。

HTML代码如下:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>编辑报刊</title>

    <script language="javascript" type="text/javascript">
    
        function ShowTechPaperDetails(val)
        {
            
            var varTechPaperName = document.getElementById("txtTechPaperName").value;
            var varTechPaperDName = val;
            var varTechPaperDId = document.getElementById(val).title;
            document.getElementById("txtTechPaperDId").value = varTechPaperDId;
            var varImageUrl = "TechheroPaper/"+varTechPaperName+"/"+varTechPaperDName;
            document.getElementById("divRight").style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+varImageUrl+"',sizingMethod= 'scale')";
            varRectCount = 0;
            document.getElementById("divPaper").innerHTML = "";
            document.getElementById("divRight").innerHTML = "";
        }
        
        var varRectCount = 0;
        
        var Rect = {
            //当前正在画的矩形对象   
            obj: null,   
            //画布   
            container: null,
            //初始化函数   
            init: function(containerId){   
                Rect.container = document.getElementById(containerId);    
                if(Rect.container){   
                    //鼠标按下时开始画   
                    Rect.container.onmousedown = Rect.start;   
                }   
                else{   
                    alert('不存在该区域!');   
                }   
            },
            start: function(e){
                
                //矩形计数变量
                varRectCount = varRectCount + 1; 
                
                var o = Rect.obj = document.createElement('div');
                o.style.position = "absolute";   
                //mouseBeginX,mouseBeginY是辅助变量,记录下鼠标按下时的位置   
                o.style.left = o.mouseBeginX = Rect.getEvent(e).x;   
                o.style.top = o.mouseBeginY = Rect.getEvent(e).y; 
                
                o.id = "divRect"+varRectCount;//矩形ID
                
                o.mouseBeginOffSetX = event.offsetX;
                o.mouseBeginOffSetY = event.offsetY;
                
                o.style.height = 0;
                o.style.width = 0;
                o.style.border = "solid red 1px";
                //向o添加一个叉叉,点击叉叉可以删除这个矩形   
                var deleteLink = document.createElement('a');
                deleteLink.id = "del"+varRectCount;
                deleteLink.href = "#";
                deleteLink.style.fontSize = "20px";
                deleteLink.onclick = function(){
                        Rect.container.removeChild(this.parentNode);
                        //varRectCount = varRectCount - 1;
                        var varDivPointId = "divPoint"+this.id.substr(3);
                        var varDivPoint = document.getElementById(varDivPointId);
                        document.getElementById("divPaper").removeChild(varDivPoint);
                        //this.parentNode.style.display = "none";   
                        //alert(this.tagName);
                }
                deleteLink.innerText = "x";
                o.appendChild(deleteLink);   
                //把当前画出的对象加入到画布中
                Rect.container.appendChild(o);
                //处理onmousemove事件
                Rect.container.onmousemove = Rect.move;
                //处理onmouseup事件
                Rect.container.onmouseup = Rect.end;
            },
            move: function(e){
                var o = Rect.obj;
                //dx,dy是鼠标移动的距离
                var dx = Rect.getEvent(e).x - o.mouseBeginX;
                var dy = Rect.getEvent(e).y - o.mouseBeginY;
                //如果dx,dy <0,说明鼠标朝左上角移动,需要做特别的处理
                if(dx<0){
                    o.style.left = Rect.getEvent(e).x;
                }
                if(dy<0){
                    o.style.top = Rect.getEvent(e).y;
                }
                o.style.height = Math.abs(dy);   
                o.style.width = Math.abs(dx);   
            },
            end: function(e){
                //在新增一个矩形焦点时候同时记录起始坐标点
                var o = Rect.obj;
                var varDivPoint = document.createElement("<div id='divPoint"+varRectCount+"'></div>");
                var varPoint = document.createElement("<input type='text' style='width:300px;' />");
                var varBr = document.createElement("<br />");
                var varPointX1 = document.createElement("<input type='text' />");
                var varPointX2 = document.createElement("<input type='text' />");
                var varPointY1 = document.createElement("<input type='text' />");
                var varPointY2 = document.createElement("<input type='text' />");
                var varTechPaperRName = document.createElement("<input type='text' />");
                
                //获取divRight的top以及left
                var varRightTop = document.getElementById("divRight").offsetTop;
                var varRightLeft = document.getElementById("divRight").offsetLeft;
                
                var varX = event.x - varRightLeft;
                var varY = event.y - varRightTop;
                
                varPoint.value = o.mouseBeginOffSetX+","+o.mouseBeginOffSetY+" "
                                 +varX+","+o.mouseBeginOffSetY+" "
                                 +varX+","+varY+" "
                                 +o.mouseBeginOffSetX+","+varY+" "
                                 +o.mouseBeginOffSetX+","+o.mouseBeginOffSetY;
                varPointX1.value = o.mouseBeginOffSetX;//X最小值
                varPointX2.value = varX;//X最大值
                varPointY1.value = o.mouseBeginOffSetY;//Y最小值
                varPointY2.value = varY;//Y最大值

                varDivPoint.appendChild(varPoint);
                varDivPoint.appendChild(varBr);
                varDivPoint.appendChild(varPointX1);
                varDivPoint.appendChild(varPointX2);
                varDivPoint.appendChild(varPointY1);
                varDivPoint.appendChild(varPointY2);
                varDivPoint.appendChild(varTechPaperRName);
                
                document.getElementById("divPaper").appendChild(varDivPoint);
                
                //onmouseup时释放onmousemove,onmouseup事件句柄
                Rect.container.onmousemove = null;   
                Rect.container.onmouseup = null;   
                Rect.obj = null;
                
                Rect.container.onmousemove = ShowXY;
            },   
            //辅助方法,处理IE和FF不同的事件模型   
            getEvent: function(e){   
                if (typeof e == 'undefined'){   
                        e = window.event;   
                }
                //alert(e.x?e.x : e.layerX);   
                if(typeof e.x == 'undefined'){   
                        e.x = e.layerX;   
                }
                if(typeof e.y == 'undefined'){   
                        e.y = e.layerY;   
                }
                return e;
            }
        };
        
        function StartDraw()
        {
            Rect.init("divRight");
        }
        
        function StopDraw()
        {
            Rect.container.onmousedown = null;
        }
        
        function SaveDraw()
        {
            var varRectInfo = "";
            for(var i=1;i<=varRectCount;i++)
            {
                var varDivPoint = document.getElementById("divPoint"+i);
                if(varDivPoint == null)
                {
                    continue;
                }
                
                for(var j=0;j<varDivPoint.childNodes.length;j++)
                {
                    if(varDivPoint.childNodes[j].tagName != "INPUT")
                    {
                        continue;
                    }
                    
                    if(j == 0)
                    {
                        varRectInfo = varRectInfo + varDivPoint.childNodes[j].value;
                    }
                    else
                    {
                        varRectInfo = varRectInfo + "&" + varDivPoint.childNodes[j].value;
                    }
                }
                
                if(i != varRectCount)
                {
                    varRectInfo = varRectInfo + "|";
                }
            }
            //alert(varRectInfo);
            var varTechPaperDId = document.getElementById("txtTechPaperDId").value;
            var varResult = FlexPaperExample.WebDemo.SavePaper.SaveTechPaperRects(varTechPaperDId,varRectInfo).value;
            alert(varResult);
        }
    
    </script>

</head>
<body style="margin:0px;">
    <form id="form1" runat="server">
        <asp:HiddenField ID="txtTechPaperName" runat="server" />
        <asp:HiddenField ID="txtTechPaperDId" runat="server" />
        <div id="divLeft" style="float: left; width: 200px;">
            <asp:Repeater ID="rptTechPapers" runat="server">
                <ItemTemplate>
                    <div>
                        <asp:LinkButton ID="lbtnTechPaperName" ToolTip='<%# Eval("TechPaperId") %>' OnClick="lbtnTechPaperName_Click"
                            runat="server" Text='<%# Eval("TechPaperName") %>'>
                        </asp:LinkButton>
                    </div>
                </ItemTemplate>
            </asp:Repeater>
            <br />
            <br />
            <asp:Repeater ID="rptTechPaperDetails" runat="server">
                <ItemTemplate>
                    <div>
                        <a onclick="ShowTechPaperDetails(this.id);" href="#" id='<%# Eval("TechPaperDName") %>'
                            title='<%# Eval("TechPaperDId") %>'>
                            <%# Eval("TechPaperDName")%>
                        </a>
                    </div>
                </ItemTemplate>
            </asp:Repeater>
        </div>
        <div id="divRight" onmousemove="ShowXY();" style="float: left; width: 400px; height: 550px; border: 1px solid black;">
        </div>
        <div>
            <input id="btnStart" value="开始" type="button" onclick="StartDraw();" />
            <input id="btnStop" value="停止" type="button" onclick="StopDraw();" />
            <input id="btnSave" value="保存" type="button" onclick="SaveDraw();" />
            <div id="divPaper">
            </div>
        </div>
        <div>
            <a href="Default.aspx">回到首页</a>
        </div>
        <input id="txtX" type="text" />
        <input id="txtY" type="text" />
    </form>
</body>
</html>

C#代码如下:

    public partial class SavePaper : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            AjaxPro.Utility.RegisterTypeForAjax(typeof(SavePaper));

            if (!IsPostBack)
            {
                DataTable dt = SqlHelper.ExcuteDataTable("SELECT * FROM tb_TechPapers");
                rptTechPapers.DataSource = dt;
                rptTechPapers.DataBind();
            }
        }

        protected void lbtnTechPaperName_Click(object sender, EventArgs e)
        {
            LinkButton lbtn = (LinkButton)sender;
            txtTechPaperName.Value = lbtn.Text;
            DataTable dt = SqlHelper.ExcuteDataTable("SELECT * FROM tb_TechPaperDetails WHERE TechPaperId = " + lbtn.ToolTip);
            rptTechPaperDetails.DataSource = dt;
            rptTechPaperDetails.DataBind();
        }

        [AjaxPro.AjaxMethod(AjaxPro.HttpSessionStateRequirement.ReadWrite)]
        public string SaveTechPaperRects(string strTechPaperDId, string strTechPaperRects)
        {
            string strSql = "";
            //1.删除原有图片对应的矩形数据
            strSql = "DELETE tb_TechPaperRects WHERE TechPaperDId = " + strTechPaperDId;
            SqlHelper.ExecuteSql(strSql);
            //2.保存每一个新的矩形信息
            string[] strArrayTechPaperRects = strTechPaperRects.Split('|');
            foreach (string strTechPaperRect in strArrayTechPaperRects)
            {
                string[] strArrayTechPaperRect = strTechPaperRect.Split('&');
                TechPaperRects mTechPaperRects = new TechPaperRects();
                mTechPaperRects.TechPaperRId = mTechPaperRects.GetMaxId();
                mTechPaperRects.TechPaperDId = Convert.ToInt32(strTechPaperDId);
                mTechPaperRects.TechPaperRPoint = strArrayTechPaperRect[0];
                mTechPaperRects.TechPaperRMinX = strArrayTechPaperRect[1];
                mTechPaperRects.TechPaperRMaxX = strArrayTechPaperRect[2];
                mTechPaperRects.TechPaperRMinY = strArrayTechPaperRect[3];
                mTechPaperRects.TechPaperRMaxY = strArrayTechPaperRect[4];
                mTechPaperRects.TechPaperRName = strArrayTechPaperRect[5];
                mTechPaperRects.Add();
            }
            return "成功!";
        }
    }

若有疑问或不正之处,欢迎提出指正和讨论。

posted @ 2011-03-04 17:28  iceknp  阅读(666)  评论(0编辑  收藏  举报