using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System.Collections.Generic;
namespace Assistance {
public class MainWindow : Form {
static public void Main() { Application.Run(new MainWindow()); }
Bitmap bitmap = new Bitmap(1, 1);
Canvas canvas = new Canvas();
bool dragging = false;
ActivePoint activePoint;
Point offset;
Point cursor;
public MainWindow() {
Paint += onPaint;
MouseMove += onMouseMove;
MouseDown += onMouseDown;
MouseUp += onMouseUp;
KeyDown += onKeyDown;
WindowState = FormWindowState.Maximized;
}
protected override void OnPaintBackground(PaintEventArgs e) { }
public void onPaint(Object sender, PaintEventArgs e) {
if (bitmap.Size != ClientSize)
bitmap = new Bitmap(ClientSize.Width, ClientSize.Height);
Graphics g = Graphics.FromImage(bitmap);
g.Clear(Color.White);
draw(g);
g.Flush();
e.Graphics.DrawImageUnscaled(bitmap, new Rectangle(0, 0, ClientSize.Width, ClientSize.Height));
}
public Point windowToCanvas(Point p) {
return new Point(p.x - ClientSize.Width/2.0, p.y - ClientSize.Height/2.0);
}
public Point canvasToWindow(Point p) {
return new Point(p.x + ClientSize.Width/2.0, p.y + ClientSize.Height/2.0);
}
private void beginDrag() {
dragging = true;
offset = activePoint.position - cursor;
activePoint.bringToFront();
}
private void endDrag() {
dragging = false;
offset = new Point();
}
public void onKeyDown(Object sender, KeyEventArgs e) {
switch(e.KeyCode) {
case Keys.D1:
new VanishingPoint(canvas, cursor);
break;
case Keys.D2:
new Grid(canvas, cursor);
break;
case Keys.Delete:
if (activePoint != null)
activePoint.assistant.remove();
endDrag();
break;
}
endDrag();
Invalidate();
}
public void onMouseDown(Object sender, MouseEventArgs e) {
cursor = windowToCanvas(new Point(e.Location.X, e.Location.Y));
if (e.Button == MouseButtons.Left) {
activePoint = canvas.findPoint(cursor);
if (activePoint != null)
beginDrag();
}
Invalidate();
}
public void onMouseUp(Object sender, MouseEventArgs e) {
cursor = windowToCanvas(new Point(e.X, e.Y));
if (e.Button == MouseButtons.Left)
endDrag();
if (!dragging)
activePoint = canvas.findPoint(cursor);
Invalidate();
}
public void onMouseMove(Object sender, MouseEventArgs e) {
cursor = windowToCanvas(new Point(e.Location.X, e.Location.Y));
if (dragging) {
activePoint.assistant.onMovePoint(activePoint, cursor + offset);
} else {
activePoint = canvas.findPoint(cursor);
}
Invalidate();
}
public void draw(Graphics g) {
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.TranslateTransform(0.5f*ClientSize.Width, 0.5f*ClientSize.Height);
canvas.draw(g, activePoint, cursor + offset);
}
}
}