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.IO; namespace GeoSigmaViewer { public partial class Drawer : UserControl { public event EventHandler SetScrollBar; bool enableRedraw = false; private bool isNewFile = true; GeoSigma geo; RectangleD mapRange = RectangleD.Empty; public bool EnableRedraw { get => enableRedraw; set => enableRedraw=value; } public RectangleD MapRange { get => mapRange; set => mapRange=value; } public GeoSigma Geo { get => geo; set => geo=value; } private DrawToolType activeTool; // active drawing tool private DrawTool[] tools; // array of tools /// /// Active drawing tool. /// public DrawToolType ActiveTool { get { return activeTool; } set { if (tools!=null) { tools[(int)activeTool].End(); activeTool =value; DrawItemType itemType = tools[(int)activeTool].ItemType; if (Geo!=null) { if (itemType==DrawItemType.ITEM_VIEW_PAN) { Geo.SetViewPan(); } else if (itemType==DrawItemType.ITEM_VIEW_WINDOW) { Geo.SetViewWindow(); } else { Geo.SetItem((int)itemType); tools[(int)activeTool].Start(); } } } } } //public void enlargeLeft(double offX) //{ // mapRange.X -=offX; // mapRange.Width+=offX; //} //public void enlargeRight(double offX) //{ // //mapRange.X=offX; // mapRange.Width+=offX; //} //public void enlargeBottom(double offY) //{ // //mapRange.X=offX; // mapRange.Y+=offY; // mapRange.Height+=offY; //} //public void enlargeTop(double offY) //{ // mapRange.Height+=offY; //} public Drawer() { InitializeComponent(); //this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); //this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); this.HorizontalScroll.Visible=false; this.VerticalScroll.Visible=false; // create array of drawing tools tools=new DrawTool[(int)DrawToolType.NumberOfDrawTools]; tools[(int)DrawToolType.Default]=new DrawToolDefault(); tools[(int)DrawToolType.Select]=new DrawToolSelect(); tools[(int)DrawToolType.Pointer]=new DrawToolPointer(); tools[(int)DrawToolType.ViewPan]=new DrawToolViewPan(); tools[(int)DrawToolType.ViewWindow]=new DrawToolViewWindow(); tools[(int)DrawToolType.Point] = new DrawToolPoint(); tools[(int)DrawToolType.Curve] = new DrawToolCurve(); tools[(int)DrawToolType.Proportion] = new DrawToolProportion(); tools[(int)DrawToolType.RectangularCSGrid] = new DrawToolRectangularCSGrid(); tools[(int)DrawToolType.Rectangle] = new DrawToolRectangle(); tools[(int)DrawToolType.Ellipse] = new DrawToolEllipse(); tools[(int)DrawToolType.Arc] = new DrawToolArc(); tools[(int)DrawToolType.Chord] = new DrawToolChord(); tools[(int)DrawToolType.Pie] = new DrawToolPie(); tools[(int)DrawToolType.Equilateral] = new DrawToolEquilateral(); tools[(int)DrawToolType.Text] = new DrawToolText(); tools[(int)DrawToolType.BreakDirect] = new DrawToolBreakDirect(); tools[(int)DrawToolType.Break] = new DrawToolBreak(); tools[(int)DrawToolType.Delete] = new DrawToolDelete(); tools[(int)DrawToolType.DeleteIn] = new DrawToolDeleteIn(); tools[(int)DrawToolType.DeleteOut] = new DrawToolDeleteOut(); } public GeoSigma OpenFile(string drawFile) { if (!File.Exists(drawFile)) { return null; } Console.WriteLine(drawFile); if (Geo!=null) { Geo.Dispose(); } Geo=null; Geo=new GeoSigma(); foreach(DrawTool t in tools) { if (t != null) { t.SigmaDrawer = this; } } Geo.OpenDocument(drawFile); isNewFile=true; Geo.SetHWND(this.Handle); //this.Invalidate(); return Geo; } public void ZoomIn() { Geo.ViewEnlarge(); Geo.EnableRedraw(true); ResetScrollbar(); this.ReDraw(); //SetScrollBar(); } public void ZoomOut() { Geo.ViewReduce(); Geo.EnableRedraw(true); ResetScrollbar(); this.ReDraw(); } public void ViewAll() { Geo.ViewAll(); Geo.EnableRedraw(true); //// 获取全图面积 //double dLeft = 0.0, dTop = 0.0, dRight = 0.0, dBottom = 0.0; //Geo.GetMapRange(ref dLeft, ref dTop, ref dRight, ref dBottom); //this.MapRange=RectangleD.FromLTRB(dLeft, dTop, dRight, dBottom); //if (SetScrollBar!=null) //{ // Rectangle rect = this.ClientRectangle; // SetScrollBar(this, new ScrollArgs(rect, this.MapRange)); //} ResetScrollbar(); this.ReDraw(); } public void ReDrawWindow() { if (Geo==null) return; Geo.EnableRedraw(true); if (SetScrollBar!=null) { Rectangle rect = this.ClientRectangle; SetScrollBar(this, new ScrollArgs(rect, this.MapRange)); } } public void ReDraw() { DrawMem(); this.Invalidate(); } private void Drawer_Paint(object sender, PaintEventArgs e) { //Graphics graphics = e.Graphics; Graphics graphics = this.CreateGraphics(); Console.WriteLine("Drawer_Paint"); //graphics.DrawLine(Pens.Red, new Point(0, 0), new Point(300, 300)); //return; //Rectangle rect = this.ClientRectangle; // e.ClipRectangle-差一个像素; Rectangle rect = e.ClipRectangle; //graphics.Clear(Color.White); if (Geo==null) { return; } IntPtr pMemDC = graphics.GetHdc(); if (isNewFile==true) { Geo.Initialize(pMemDC, rect.X, rect.Y, rect.Right, rect.Bottom); DrawMem(); //Geo.DrawMem(); //Geo.DrawDC(); ResetScrollbar(); isNewFile=false; } else { //Geo.DrawDC(); //Geo.SetDC(pMemDC, rect.X, rect.Y, rect.Right, rect.Bottom); //Geo.DrawMem(); //DrawMem(); //Geo.DrawDC(); } Geo.SetDC(pMemDC, rect.X, rect.Y, rect.Right, rect.Bottom); Geo.DrawDC(); } public void DrawMem() { Rectangle rect = this.ClientRectangle; Graphics graphics = this.CreateGraphics(); IntPtr pMemDC = graphics.GetHdc(); Geo.SetDC(pMemDC, rect.X, rect.Y, rect.Right, rect.Bottom); Geo.DrawMem(); } public void ResetScrollbar() { Rectangle rect = this.ClientRectangle; double dLeft = 0.0, dTop = 0.0, dRight = 0.0, dBottom = 0.0; Geo.GetMapRange(ref dLeft, ref dTop, ref dRight, ref dBottom); this.MapRange=RectangleD.FromLTRB(dLeft, dTop, dRight, dBottom); if (SetScrollBar!=null) { SetScrollBar(this, new ScrollArgs(rect, this.MapRange)); } } public void ChangeContextMenu(DrawToolType type) { switch(type) { case DrawToolType.Curve: ContextMenuStrip = ctmCurve; break; default: this.ContextMenuStrip = null; break; } } private void Drawer_MouseDown(object sender, MouseEventArgs e) { Console.WriteLine("Debug:Drawer_MouseDown:x="+e.X+",y="+e.Y); //Geo.MouseSelect(e.X, e.Y); if(e.Button ==MouseButtons.Left) { if (tools==null) { return; } tools[(int)activeTool].OnLButtonDown(this, e); //Geo.OnLButtonDown(e.X, e.Y); } } private void Drawer_MouseUp(object sender, MouseEventArgs e) { if (e.Button==MouseButtons.Left) { tools[(int)activeTool].OnLButtonUp(this, e); } } private void Drawer_MouseMove(object sender, MouseEventArgs e) { //if (e.Button==MouseButtons.Left) //{ if (tools==null) { return; } tools[(int)activeTool].OnMouseMove(this, e); //} } private void Drawer_Load(object sender, EventArgs e) { Console.WriteLine("Drawer_Load"); //Graphics g = this.CreateGraphics(); //g.DrawLine(Pens.Red, new Point(0, 0), new Point(629, 200)); } private void EndToolStripMenuItem_Click(object sender, EventArgs e) { ((DrawToolCurve)tools[(int)activeTool]).Execute("end"); } private void CancelToolStripMenuItem_Click(object sender, EventArgs e) { ((DrawToolCurve)tools[(int)activeTool]).Execute("cancel"); } private void AutoClosedToolStripMenuItem_Click(object sender, EventArgs e) { ((DrawToolCurve)tools[(int)activeTool]).Execute("autoclose"); } private void MergeToolStripMenuItem_Click(object sender, EventArgs e) { ((DrawToolCurve)tools[(int)activeTool]).Execute("merge"); } private void NextToolStripMenuItem_Click(object sender, EventArgs e) { ((DrawToolCurve)tools[(int)activeTool]).Execute("next"); } } public class ScrollArgs : EventArgs { Rectangle screenRect; RectangleD realRect; public Rectangle ScreenRect { get => screenRect; set => screenRect=value; } public RectangleD RealRect { get => realRect; set => realRect=value; } public ScrollArgs(){ } public ScrollArgs(Rectangle screenRect, RectangleD realRect) :base() { this.ScreenRect=screenRect; this.RealRect=realRect; } } }