using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Drawing.Drawing2D; using System.IO; namespace GeoSigmaViewer { public partial class Viewer : UserControl { GeoSigma geoSigma; //Bitmap img; private bool isNewFile = true; //IntPtr pDC = IntPtr.Zero; //RectangleD mapRange = RectangleD.Empty; private double smallScollFactor = 0.02; private double largeScrollFactor = 0.9; private int scrollPositionYLast = 0; private bool needHScrollToEnd = false; private bool needHScrollToBegin = false; private bool needVScrollToTop = false; private bool needVScrollToBottom = false; public int ID { get; set; } public Viewer() { System.Security.Cryptography.RNGCryptoServiceProvider csp = new System.Security.Cryptography.RNGCryptoServiceProvider(); byte[] byteCsp = new byte[10]; csp.GetBytes(byteCsp); ID=BitConverter.ToInt32(byteCsp, 0); InitializeComponent(); //this.MouseWheel+=Viewer_MouseWheel; //this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); //this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); this.drawer1.SetScrollBar+=SetScrollBar; Application.Idle+=delegate { SetStateOfControls(); }; } public void Redraw() { drawer1.ReDraw(); } public GeoSigma GetGeoSigma() { return geoSigma; } //private DrawToolType activeTool; // active drawing tool //private DrawTool[] tools; // array of tools /// /// Active drawing tool. /// public DrawToolType ActiveTool { get { return drawer1.ActiveTool; } set { drawer1.ActiveTool=value; } } private void SetStateOfControls() { if (needHScrollToEnd) { scrollH.Value=scrollH.Maximum-scrollH.LargeChange+1; needHScrollToEnd=false; } if (needHScrollToBegin) { scrollH.Value=scrollH.Minimum; needHScrollToBegin=false; } if (needVScrollToBottom) { scrollV.Value=scrollV.Maximum-scrollV.LargeChange+1; needVScrollToBottom=false; } if (needVScrollToTop) { scrollV.Value=scrollV.Minimum; needVScrollToTop=false; } } private void Viewer_Load(object sender, EventArgs e) { //this.pcbDrawer.Location=new Point(0, 0); //pcbDrawer.Width=0; //pcbDrawer.Height=0; //this.pcbDrawer.Location=new Point(0, 0); //this.pcbDrawer.Width=1104; //this.pcbDrawer.Height=820; //pcbDrawer.Image = //pDC=this.CreateGraphics().GetHdc(); } public bool OpenFile(string drawFile) { //if (geoSigma!=null) //{ // geoSigma.Dispose(); //} //geoSigma=null; //geoSigma=new GeoSigma(); //geoSigma.OpenDocument(drawFile); //isNewFile=true; ////pcbDrawer.Invalidate(); ////this.drawer1.Invalidate(); //this.Invalidate(); try { geoSigma = drawer1.OpenFile(drawFile); } catch (Exception ex) { Console.WriteLine(ex.Message); return false; } //SetScrollBar(); if(geoSigma==null) { return false; } return true; } public string GetLayers() { return geoSigma.GetLayers(); } public string GetCurrentLayer() { return geoSigma.GetCurrentLayer(); } public void SetCurrentLayer(string layerName) { geoSigma.SetCurrentLayer(layerName); } public bool RemoveCurveStyle(string layerName, int index) { if( geoSigma.RemoveCurveStyle(layerName, index)) { geoSigma.EnableRedraw(true); return true; } return false; } public bool SetLayerHowtoViewPoint(string layerName, string data) { if (geoSigma.SetLayerHowtoViewPoint(layerName, data)) { geoSigma.EnableRedraw(true); return true; } return false; } public bool SetLayerHowtoViewCurve(string layerName, string data, int index) { if (geoSigma.SetLayerHowtoViewCurve(layerName, data, index)) { geoSigma.EnableRedraw(true); return true; } return false; } public bool RemovePointStyle(string layerName) { if (geoSigma.RemovePointStyle(layerName)) { geoSigma.EnableRedraw(true); return true; } return false; } public void SetLayerState(string layerName, LayerStatus status) { geoSigma.SetLayerState(layerName, status); geoSigma.EnableRedraw(true); } //private void Viewer_MouseWheel(object sender, MouseEventArgs e) //{ // if (geoSigma==null) return; // // 屏幕坐标偏移量 // int nOffsetScreen = this.VerticalScroll.Value -this.scrollPositionYLast; // int nScreenAllVert = this.VerticalScroll.Maximum-this.VerticalScroll.Minimum; // // 实际坐标偏移量 // double dOffsetReal = ((double)nOffsetScreen/nScreenAllVert)* this.mapRange.Height; // geoSigma.Scroll((int)ScrollOrientation.VerticalScroll, dOffsetReal); // scrollPositionYLast=this.VerticalScroll.Value; // geoSigma.EnableRedraw(true); //} private void SetScrollBar(object sender, EventArgs e) { ScrollArgs args = e as ScrollArgs; int hMax = 0, vMax = 0, hPage = 0, vPage = 0, hPos = 0, vPos = 0; geoSigma.SetScrollBar(ref hMax, ref vMax, ref hPage, ref vPage, ref hPos, ref vPos); // nMin、nPage、nPos与控件Min,LargeChange、value类似 // 但nMax相当于Max+LargeChange-1 int nMaxValueH = hMax;// hMax-hPage+1; int nMaxValueV = vMax; this.scrollH.Minimum=0; this.scrollH.Maximum=nMaxValueH; this.scrollH.LargeChange=(int)(hPage*largeScrollFactor+0.5); this.scrollH.SmallChange=(int)(hPage*0.2+0.5); if (hPos>=this.scrollH.Minimum&&hPos<=this.scrollH.Maximum) this.scrollH.Value=hPos; this.scrollV.Minimum=0; this.scrollV.Maximum=nMaxValueV; this.scrollV.LargeChange=vPage; this.scrollV.SmallChange=(int)(vPage*0.2+0.5); if (vPos>=this.scrollV.Minimum&&vPos<=this.scrollV.Maximum) { this.scrollV.Value=vPos; } ////////////////////////////////////////////////////////////////////// //int WM_HSCROLL = 0x114; //int WM_VSCROLL = 0x115; //int SB_THUMBPOSITION = 4; //int SB_HORZ=0; //int SB_VERT = 1; //int SB_CTL = 2; //int SB_BOTH = 3; //if (geoSigma==null ||geoSigma.GetElementCount()==0) //{ // Win32API.SetScrollRange(scrollH.Handle, SB_HORZ, 0, 1000,0); // SCROLLINFO barInfo=new SCROLLINFO(); // Win32API.GetScrollInfo(scrollH.Handle, SB_HORZ, ref barInfo); // barInfo.nPage=980; // Win32API.SetScrollInfo(scrollH.Handle, SB_HORZ, ref barInfo, 0); // Win32API.SetScrollRange(scrollV.Handle, SB_VERT, 0, 1000,0); // Win32API.GetScrollInfo(scrollV.Handle, SB_VERT, ref barInfo); // barInfo.nPage=980; // Win32API.SetScrollInfo(scrollV.Handle, SB_VERT, ref barInfo, 0); // return; //} ////获得整图范围 //RectangleD rect = args.RealRect; //double dx = rect.Width; //double dy = rect.Height; //int hts = geoSigma.GetScreenWidth(dx); //int vts = geoSigma.GetScreenHeight(Math.Abs(dy)); //vts= Math.Abs(vts); //if (hts>8000) hts=8000; //if (vts>8000) vts=8000; //if (hts<100) hts=100; //if (vts<100) vts=100; //Win32API.SetScrollRange(scrollH.Handle, SB_HORZ, 0, hts,1); //Win32API.PostMessage(scrollH.Handle, WM_HSCROLL, SB_THUMBPOSITION+10000*0, 0); //Win32API.SetScrollRange(scrollV.Handle, SB_VERT, 0, vts,1); ////获得屏幕范围 //Rectangle rcScreen = args.ScreenRect; //double dLeft = 0.0, dTop = 0.0, dRight = 0.0, dBottom = 0.0; //geoSigma.GetScreenReal(rcScreen.Left, rcScreen.Top, rcScreen.Right, rcScreen.Bottom, ref dLeft, ref dTop, ref dRight, ref dBottom); //SCROLLINFO bar = new SCROLLINFO(); //Win32API.GetScrollInfo(scrollH.Handle, SB_HORZ, ref bar); //bar.nPage=(uint)((dRight-dLeft)/dx*hts); //if (bar.nPage>(uint)(hts-5)) bar.nPage=(uint)(hts-5); //Win32API.SetScrollInfo(scrollH.Handle, SB_HORZ, ref bar, 1); //Win32API.PostMessage(scrollH.Handle, WM_HSCROLL, SB_THUMBPOSITION+10000*bar.nPos, 0); //Win32API.GetScrollInfo(scrollV.Handle, SB_VERT, ref bar); //bar.nPage=(uint)((dTop-dBottom)/dy*vts); //if (bar.nPage>(uint)(vts-5)) bar.nPage=(uint)(vts-5); //Win32API.SetScrollInfo(scrollV.Handle, SB_VERT, ref bar,1); ////设置当前滚动条位置 //double xm = dLeft-rect.Left; //double ym = rect.Top-dTop; //xm=xm/dx*hts; //ym=ym/dy*vts; //if (xm<0) xm=0; if (xm>hts) xm=hts; //if (ym<0) ym=0; if (ym>vts) ym=vts; //Win32API.SetScrollPos(scrollH.Handle, SB_HORZ, (int)xm, true); //Win32API.PostMessage(scrollH.Handle, WM_HSCROLL, SB_THUMBPOSITION+10000*(int)xm, 0); //Win32API.GetScrollInfo(scrollH.Handle, SB_HORZ, ref bar); //bar.nPos=(int)xm; //Win32API.SetScrollInfo(scrollH.Handle, SB_HORZ, ref bar, 1); //Win32API.GetScrollInfo(scrollV.Handle, SB_VERT, ref bar); //bar.nPos=(int)ym; //Win32API.SetScrollInfo(scrollV.Handle, SB_VERT, ref bar, 1); //Win32API.SetScrollPos(scrollH.Handle, SB_HORZ, (uint)(xm)); //SetScrollPos(SB_VERT, AfxGetPublicFunction()->FloatToLong(ym)); ///////////////////////////////////////////////////////////////////////////////////////// //ScrollArgs args = e as ScrollArgs; ////RectangleD mapRange = drawer1.MapRange; ////Rectangle rectS = drawer1.ClientRectangle; //// 屏幕尺寸 //Rectangle rectS = args.ScreenRect; //double dLeft = 0.0, dTop = 0.0, dRight = 0.0, dBottom = 0.0; //// 获得屏幕范围内的实际坐标范围 //geoSigma.GetScreenReal(rectS.Left, rectS.Top, rectS.Right, rectS.Bottom, ref dLeft, ref dTop, ref dRight, ref dBottom); //// 全图的实际坐标范围 //RectangleD mapRange = args.RealRect; //int dLeftA = 0, dTopA = 0, dRightA = 0, dBottomA = 0; //geoSigma.GetRealScreen(mapRange.Left, mapRange.Top, mapRange.Right, mapRange.Bottom // , ref dLeftA, ref dTopA, ref dRightA, ref dBottomA); //// 屏幕全图宽度 //double dScreenAx = dRightA-dLeftA; //double dScreenAy = dBottomA-dTopA; //// 屏幕显示实际宽度 //double dScreenWidthReal = dRight-dLeft; //// 屏幕显示实际高度 //double dScreenHeightReal = Math.Abs(dTop-dBottom); //// 全图的实际宽度 //double dMapWidthReal = mapRange.Width; //// 全图的实际高度 //double dMapHeightReal = Math.Abs(mapRange.Height); ////// 屏幕全图宽度 ////double dScreenAx = (dMapWidthReal/dScreenWidthReal)*rectS.Width; ////double dScreenAy = (dMapHeightReal/dScreenHeightReal)*rectS.Height; //// 滚动范围设置 //scrollH.Minimum=0; //scrollV.Minimum=0; //scrollH.Maximum=(int)(dScreenAx+0.5); //scrollV.Maximum=(int)(dScreenAy+0.5); //// 滚动量设置 //int nHLargeChange = (int)(rectS.Width*largeScrollFactor); //int nHSmallChange = (int)(nHLargeChange*0.2); //// 水平滚动条滚动量设置 //this.scrollH.LargeChange=nHLargeChange; //this.scrollH.SmallChange=nHSmallChange; //int nVLargeChange = (int)(rectS.Height*largeScrollFactor); //int nVSmallChange = (int)(nVLargeChange*0.2); //// 垂直滚动条滚动量设置 //this.scrollV.LargeChange=nVLargeChange; //this.scrollV.SmallChange=nVSmallChange; //// 计算滚动条位置 //// Fl=Sl/(Sr-Large+1) //double dFlx = (dLeft-mapRange.X)/dMapWidthReal; ////int nScrollX = (int)(dFlx*(scrollH.Maximum-nHLargeChange+1)); //int nScrollX = (int)(dFlx*(scrollH.Maximum+1)); //double dFly = (mapRange.Top-dTop)/dMapHeightReal; //// int nScrollY = (int)(dFly*(scrollV.Maximum-nVLargeChange+1)); //int nScrollY = (int)(dFly*(scrollV.Maximum+1)); //// 当前滚动条位置设置 ////if (nScrollX<0) ////{ //// scrollH.Value=0; ////} ////else if (nScrollX>scrollH.Maximum) ////{ //// scrollH.Value=scrollH.Maximum; ////} //scrollH.Value=nScrollX; //scrollV.Value=nScrollY; } /// /// 添加并激活新图层 /// /// /// 是否激活 public void FindAddLayer(string strLayerName, bool doActive=true) { geoSigma.FindAddLayer(strLayerName, doActive); } public void DeleteLayer(List layers) { geoSigma.DeleteLayer(layers.ToArray()); } public bool GetLayerStyleData(string layerName, ref string curveStyle, ref string pointStyle) { return geoSigma.GetLayerStyleData(layerName, ref curveStyle, ref pointStyle); } /// /// 滚动条事件 /// /// /// private void Viewer_Scroll(object sender, ScrollEventArgs e) { if(e.Type ==ScrollEventType.EndScroll) { //Scroll2(800); return; } if (geoSigma==null) return; if (e.ScrollOrientation==ScrollOrientation.HorizontalScroll) { Viewer_ScrollHori(sender, e); } else if (e.ScrollOrientation==ScrollOrientation.VerticalScroll) { Viewer_ScrollVert(sender, e); } scrollPositionYLast=this.VerticalScroll.Value; } /// /// 水平滚动条 /// /// /// private void Viewer_ScrollHori(object sender, ScrollEventArgs e) { int nOrientation = (int)(e.ScrollOrientation);//纵向、横向 int nType = (int)e.Type; //geoSigma.HScroll(nType, e.NewValue, scrollH.Maximum-scrollH.LargeChange+1); // 屏幕总宽度 int nScreenAllHor = this.scrollH.Maximum-this.scrollH.Minimum; // 滚动条变化量 int nValue = e.NewValue-e.OldValue; // 屏幕宽度 Ws int nWs = drawer1.Width; // 屏幕实际距离 Wr double dWtest = geoSigma.GetRealWidth(nValue); double dWs = geoSigma.GetRealWidth(nWs); // dOffset = Wr*nValue/Ws; Console.WriteLine(string.Format("{0}\t{1}", e.NewValue, e.OldValue)); double dOffset = 0; if (Math.Abs(nValue)<0.01) { // TODO:需要进一步修改屏幕滚动范围 if (e.Type==ScrollEventType.SmallIncrement) { nValue=this.scrollH.SmallChange; scrollH.Maximum=scrollH.Maximum+nValue; double dF = (double)nValue/nWs; dOffset=dWs*dF; //drawer1.enlargeRight(dOffset); needHScrollToEnd=true; } else if (e.Type==ScrollEventType.SmallDecrement) { nValue=-this.scrollH.SmallChange; scrollH.Minimum=scrollH.Minimum+nValue; double dF = (double)nValue/nWs; dOffset=dWs*dF; //drawer1.enlargeLeft(Math.Abs(dOffset)); needHScrollToBegin=true; } else { return; } } else { // 计算实际坐标变化量 // 变化比例 //double dF = (double)nValue/(nScreenAllHor-this.scrollH.LargeChange+1); //dOffset=dF*drawer1.MapRange.Width; double dF = (double)nValue/nWs; dOffset=dWs*dF; } Console.WriteLine(string.Format("offset {0}", dOffset)); geoSigma.Scroll(nOrientation, dOffset); geoSigma.EnableRedraw(true); drawer1.ReDraw(); } public void Scroll2(int scrollValue) { scrollH.Value=scrollValue; } /// /// 垂直滚动条 /// /// /// private void Viewer_ScrollVert(object sender, ScrollEventArgs e) { int nType = (int)e.Type; int nScreenAllVert = this.scrollV.Maximum-this.scrollV.Minimum; // 滚动条变化量 int nValue = e.NewValue-e.OldValue; // 屏幕高度 Ws int nHs = drawer1.Height; // 屏幕实际距离 Wr double dHs = geoSigma.GetRealHeight(nHs); double dOffset = 0; if (Math.Abs(nValue)<0.01) { if (e.Type==ScrollEventType.SmallIncrement) { nValue=this.scrollV.SmallChange; scrollV.Maximum=scrollV.Maximum+nValue; double dF = (double)nValue/nHs; dOffset=dHs*dF; //dOffset=((double)nValue/nScreenAllVert)*drawer1.MapRange.Height; //drawer1.enlargeBottom(dOffset); needVScrollToBottom=true; } else if (e.Type==ScrollEventType.SmallDecrement) { nValue=-this.scrollV.SmallChange; scrollV.Minimum=scrollV.Minimum+nValue; double dF = (double)nValue/nHs; dOffset=dHs*dF; //dOffset=((double)nValue/nScreenAllVert)*drawer1.MapRange.Height; //drawer1.enlargeTop(dOffset); needVScrollToTop=true; } else { return; } } else { //double dF = (double)nValue/(nScreenAllVert-this.scrollV.LargeChange+1); //dOffset=dF* drawer1.MapRange.Height; double dF = (double)nValue/nHs; dOffset=dHs*dF; } geoSigma.Scroll((int)(e.ScrollOrientation), -dOffset); geoSigma.EnableRedraw(true); drawer1.ReDraw(); //this.InvokePaint(drawer1, new PaintEventArgs(drawer1.CreateGraphics(), drawer1.ClientRectangle)); } public void ZoomIn() { drawer1.ZoomIn(); } public void ZoomOut() { drawer1.ZoomOut(); } public void ViewAll() { drawer1.ViewAll(); } private void Viewer_Resize(object sender, EventArgs e) { //drawer1.ReDraw(); } public void ReDrawWindow() { drawer1.ReDrawWindow(); } ///// ///// ///// ///// ///// //private static Image Bitmap2Image(System.Drawing.Bitmap Bi) //{ // MemoryStream ms = new MemoryStream(); // Bi.Save(ms, System.Drawing.Imaging.ImageFormat.Png); // BitmapImage bImage = new BitmapImage(); // bImage.BeginInit(); // bImage.StreamSource=new MemoryStream(ms.ToArray()); // bImage.EndInit(); // ms.Dispose(); // Bi.Dispose(); // Image i = new Image(); // i.Source=bImage; // return i; //} } public struct RectangleD { // // 摘要: // 表示实例 System.Drawing.RectangleF 未初始化其成员的类。 /// /// 左下角为X,Y /// public static RectangleD Empty { get { return new RectangleD(0, 0, 0, 0); } } //// //// 摘要: //// 用指定的位置和大小初始化 System.Drawing.RectangleF 类的新实例。 //// //// 参数: //// location: //// System.Drawing.PointF,它表示矩形区域的左上角。 //// //// size: //// System.Drawing.SizeF,它表示矩形区域的宽度和高度。 //public RectangleD(PointF location, SizeF size); // // 摘要: // 用指定的位置和大小初始化 System.Drawing.RectangleF 类的新实例。 // // 参数: // x: // 矩形左上角的 x 坐标。 // // y: // 矩形左上角的 y 坐标。 // // width: // 矩形的宽度。 // // height: // 矩形的高度。 public RectangleD(double x, double y, double width, double height) { this.X=x; this.Y=y; this.Width=width; this.Height=height; //this._Top=this.Y; } // // 摘要: // 获取是之和的 x 坐标 System.Drawing.RectangleF.X 和 System.Drawing.RectangleF.Width 此 System.Drawing.RectangleF // 结构。 // // 返回结果: // 之和的 x 坐标 System.Drawing.RectangleF.X 和 System.Drawing.RectangleF.Width 此 System.Drawing.RectangleF // 结构。 [Browsable(false)] public double Right { get { return this.X+this.Width; } } //private double _Top; // // 摘要: // 获取此 System.Drawing.RectangleF 结构上边缘的 y 坐标。 // // 返回结果: // 此 System.Drawing.RectangleF 结构上边缘的 y 坐标。 [Browsable(false)] public double Top { get { return this.Y+this.Height; } } //private double _Left; // // 摘要: // 获取此 System.Drawing.RectangleF 结构左边缘的 x 坐标。 // // 返回结果: // 此 System.Drawing.RectangleF 结构左边缘的 x 坐标。 [Browsable(false)] public double Left { get { return this.X; } } // // 摘要: // 获取或设置此 System.Drawing.RectangleF 结构的高度。 // // 返回结果: // 此 System.Drawing.RectangleF 结构的高度。 默认值为 0。 public double Height { get; set; } // // 摘要: // 获取或设置此 System.Drawing.RectangleF 结构的宽度。 // // 返回结果: // 此 System.Drawing.RectangleF 结构的宽度。 默认值为 0。 public double Width { get; set; } // // 摘要: // 获取或设置此 System.Drawing.RectangleF 结构左上角的 y 坐标。 // // 返回结果: // 此 System.Drawing.RectangleF 结构左上角的 y 坐标。 默认值为 0。 public double Y { get; set; } // // 摘要: // 获取或设置此 System.Drawing.RectangleF 结构左上角的 x 坐标。 // // 返回结果: // 此 System.Drawing.RectangleF 结构左上角的 x 坐标。 默认值为 0。 public double X { get; set; } // // 摘要: // 获取或设置此 System.Drawing.RectangleF 的大小。 // // 返回结果: // System.Drawing.SizeF,它表示此 System.Drawing.RectangleF 结构的宽度和高度。 //[Browsable(false)] //public SizeF Size { get; set; } // // 摘要: // 获取或设置此 System.Drawing.RectangleF 结构左上角的坐标。 // // 返回结果: // System.Drawing.PointF,它表示此 System.Drawing.RectangleF 结构的左上角。 //[Browsable(false)] //public PointF Location { get; set; } // // 摘要: // 获取是之和的 y 坐标 System.Drawing.RectangleF.Y 和 System.Drawing.RectangleF.Height 此 // System.Drawing.RectangleF 结构。 // // 返回结果: // 之和的 y 坐标 System.Drawing.RectangleF.Y 和 System.Drawing.RectangleF.Height 此 System.Drawing.RectangleF // 结构。 [Browsable(false)] public double Bottom { get { return this.Y; } } // // 摘要: // 测试是否 System.Drawing.RectangleF.Width 或 System.Drawing.RectangleF.Height 属性 System.Drawing.RectangleF // 值为零。 // // 返回结果: // 此属性返回 true 如果 System.Drawing.RectangleF.Width 或 System.Drawing.RectangleF.Height // 属性 System.Drawing.RectangleF 值为零; 否则为 false。 [Browsable(false)] public bool IsEmpty { get { return false; } } // // 摘要: // 创建 System.Drawing.RectangleF 结构具有窗口左上角和右下角位于指定位置。 // // 参数: // left: // 该矩形区域的左上角 x 坐标。 // // top: // 该矩形区域的左上角 y 坐标。 // // right: // 该矩形区域的右下角 x 坐标。 // // bottom: // 该矩形区域的右下角 y 坐标。 // // 返回结果: // 此方法创建的新 System.Drawing.RectangleF。 public static RectangleD FromLTRB(double left, double top, double right, double bottom) { return new RectangleD(left, bottom, right-left, top-bottom); } // // 摘要: // 创建并返回指定 System.Drawing.RectangleF 结构的放大副本。 该副本被放大指定量并不修改原始矩形。 // // 参数: // rect: // 要复制的 System.Drawing.RectangleF。 不修改此矩形。 // // x: // 水平副本的矩形的放大量。 // // y: // 副本的矩形垂直放大量。 // // 返回结果: // 放大的 System.Drawing.RectangleF。 //public static RectangleD Inflate(RectangleD rect, double x, double y); // // 摘要: // 返回 System.Drawing.RectangleF 结构,它表示两个矩形交集。 如果没有重叠和空 System.Drawing.RectangleF // 返回。 // // 参数: // a: // 要相交的矩形。 // // b: // 要相交的矩形。 // // 返回结果: // 第三个 System.Drawing.RectangleF 结构的大小表示两个指定的矩形的重叠的区域。 //public static RectangleD Intersect(RectangleD a, RectangleD b); // // 摘要: // 创建可以包含两个形成并集的两个矩形的最小可能第三个矩形。 // // 参数: // a: // 要合并的矩形。 // // b: // 要合并的矩形。 // // 返回结果: // 第三个 System.Drawing.RectangleF 结构,其中包含这两个形成并集的两个矩形。 //public static RectangleD Union(RectangleD a, RectangleD b); // // 摘要: // 确定指定的点是否包含在此 System.Drawing.RectangleF 结构内。 // // 参数: // x: // 要测试的点的 X 坐标。 // // y: // 要测试的点的 Y 坐标。 // // 返回结果: // 如果 x 和 y 定义的点包含在此 System.Drawing.RectangleF 结构中,此方法将返回 true;否则将返回 false。 public bool Contains(double x, double y) { return (x>=this.Left&&x<=this.Right && y>=this.Bottom && y<=this.Top); } // // 摘要: // 确定指定的点是否包含在此 System.Drawing.RectangleF 结构内。 // // 参数: // pt: // 要测试的 System.Drawing.PointF。 // // 返回结果: // 此方法返回 true 如果表示的点 pt 参数包含在此 System.Drawing.RectangleF 结构; 否则为 false。 //public bool Contains(PointF pt); // // 摘要: // 确定 rect 表示的矩形区域是否完全包含在此 System.Drawing.RectangleF 结构内。 // // 参数: // rect: // 要测试的 System.Drawing.RectangleF。 // // 返回结果: // 此方法返回 true 如果表示矩形区域 rect 所表示的矩形区域范围内完全包含 System.Drawing.RectangleF; 否则为 false。 //public bool Contains(RectangleD rect); // // 摘要: // 测试是否 obj 是 System.Drawing.RectangleF 具有相同的位置和大小的 System.Drawing.RectangleF。 // // 参数: // obj: // 要测试的 System.Object。 // // 返回结果: // 此方法返回 true 如果 obj 是 System.Drawing.RectangleF 并将其 X, ,Y, ,Width, ,和 Height 的对应属性相等 // System.Drawing.RectangleF; 否则为 false。 public override bool Equals(object obj) { return this==(RectangleD)obj; } // // 摘要: // 获取此哈希代码 System.Drawing.RectangleF 结构。 有关使用哈希代码的信息,请参阅 Object.GetHashCode。 // // 返回结果: // 此 System.Drawing.RectangleF 的哈希代码。 //public override int GetHashCode() //{ // return 1; //} // // 摘要: // 将此 System.Drawing.RectangleF 放大指定量。 // // 参数: // size: // 此矩形的放大量。 //public void Inflate(SizeF size); // // 摘要: // 这将放大 System.Drawing.RectangleF 结构指定的量。 // // 参数: // x: // 这样的放大量 System.Drawing.RectangleF 结构的水平。 // // y: // 这样的放大量 System.Drawing.RectangleF 结构的垂直。 //public void Inflate(float x, float y); // // 摘要: // 将此 System.Drawing.RectangleF 结构替换为其自身与指定的 System.Drawing.RectangleF 结构的交集。 // // 参数: // rect: // 要相交的矩形。 //public void Intersect(RectangleD rect); // // 摘要: // 确定此矩形是否与 rect 相交。 // // 参数: // rect: // 要测试的矩形。 // // 返回结果: // 此方法返回 true 如果重叠。 //public bool IntersectsWith(RectangleD rect); // // 摘要: // 将此矩形的位置调整指定的量。 // // 参数: // x: // 该位置的水平偏移量。 // // y: // 该位置的垂直偏移量。 public void Offset(double x, double y) { this.X+=x; this.Y+=y; } // // 摘要: // 将此矩形的位置调整指定的量。 // // 参数: // pos: // 该位置的偏移量。 //public void Offset(PointF pos); // // 摘要: // 将转换 Location 和 System.Drawing.Size 此 System.Drawing.RectangleF 到用户可读字符串。 // // 返回结果: // 一个字符串,包含位置、 宽度和高度这 System.Drawing.RectangleF 结构。 例如,"{X = 20,Y = 20,Width = 100,Height // = 50}"。 //public override string ToString(); // // 摘要: // 测试两个 System.Drawing.RectangleF 结构的位置和大小是否相同。 // // 参数: // left: // 相等运算符左侧的 System.Drawing.RectangleF 结构。 // // right: // 相等运算符右侧的 System.Drawing.RectangleF 结构。 // // 返回结果: // 此运算符可返回 true 如果两个指定 System.Drawing.RectangleF 结构具有相等 System.Drawing.RectangleF.X, // ,System.Drawing.RectangleF.Y, ,System.Drawing.RectangleF.Width, ,和 System.Drawing.RectangleF.Height // 属性。 public static bool operator ==(RectangleD left, RectangleD right) { if(left.Left == right.Left && left.Top == right.Top && left.Right==right.Right && left.Bottom ==right.Bottom) { return true; } return false; } // // 摘要: // 测试两个 System.Drawing.RectangleF 结构的位置或大小是否不同。 // // 参数: // left: // 不等运算符左侧的 System.Drawing.RectangleF 结构。 // // right: // 不等运算符右侧的 System.Drawing.RectangleF 结构。 // // 返回结果: // 此运算符可返回 true 如果任一 System.Drawing.RectangleF.X , ,System.Drawing.RectangleF.Y, // ,System.Drawing.RectangleF.Width, ,或 System.Drawing.RectangleF.Height 的两个属性 System.Drawing.Rectangle // 结构是否不相等; 否则为 false。 public static bool operator !=(RectangleD left, RectangleD right) { return !(left==right); } // // 摘要: // 将指定 System.Drawing.Rectangle 结构 System.Drawing.RectangleF 结构。 // // 参数: // r: // System.Drawing.Rectangle 要转换的结构。 // // 返回结果: // System.Drawing.RectangleF 结构,它是从指定转换 System.Drawing.Rectangle 结构。 public static implicit operator RectangleD(Rectangle r) { return new RectangleD(r.X, r.Y, r.Width, r.Height); } } }