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);
}
}
}