PDA

View Full Version : سوال: رسم خط در سی شارپ



enayat1
یک شنبه 31 خرداد 1394, 19:32 عصر
با سلام
من برنامه زیر رو نوشتم که باید اینطوری کار کنه که هر وقت کاربر روی ماوس کلیک کرد خطی رو تا زمانی که ماوس رو رها نکرده رسم کنه. یعنی تا وقتی که کاربر دستش رو از رو ماوس برنداشته از نقطه اول تا محل جدید ماوس رسم کنه. من در مورد این برنامه یه مشکل و یک سوال داشتم.

مشکل: وقتی که رو صفحه کلیک می کنم رسم خط از محل پیکان ماوس شروع نمیشه و نقطه شروع خط، کمی پایین تر از پیکان ماوسه. علت این امر چیه؟

سوال: پاسخ این سوال خیلی خیلی برام مهمه. من می خوام وقتی که خط جدید رو رسم می کنیم، در جاهایی که خط جدید از رو خط قدیمی عبور می کنه اون رو پاک نکنه. چطوری می تونم این کار رو انجام بدم.

با تشکر.(فایل برنامه رو ضمیمه کردم)


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Line
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Graphics g;
double x1, y1, x2, y2;
bool mousedown;
private void Form1_Load(object sender, EventArgs e)
{

}

private void panel1_MouseDown(object sender, MouseEventArgs e)
{
x1 = MousePosition.X;
y1 = MousePosition.Y;
x2 = x1;
y2 = y1;
mousedown = true;
}

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (mousedown)
{
Pen backgroundColor = new Pen(panel1.BackColor);
Pen blue = new Pen(Color.Blue);
using (g = panel1.CreateGraphics())
{
g.DrawLine(backgroundColor, (int)x1, (int)y1, (int)x2, (int)y2);
g.DrawLine(blue, (int)x1, (int)y1, (int)e.X, (int)e.Y);
}
x2=e.X;
y2=e.Y;
}
}

private void panel1_MouseUp(object sender, MouseEventArgs e)
{
mousedown = false;
}
}
}

aliagamon
یک شنبه 31 خرداد 1394, 21:11 عصر
یکم تغییرات تو کد مشکلتونو رفع میکنه

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Line
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Graphics g;
double x1, y1, x2, y2;
bool mousedown;
private void Form1_Load(object sender, EventArgs e)
{
Bitmap back = new Bitmap(panel1.Width, panel1.Height);
using (Graphics g = Graphics.FromImage(back))
{
g.FillRectangle(new SolidBrush(panel1.BackColor),
0, 0,
panel1.Width,
panel1.Height);

}
panel1.BackgroundImage = back;
}

private void panel1_MouseDown(object sender, MouseEventArgs e)
{
x1 = MousePosition.X;
y1 = MousePosition.Y;
x2 = x1;
y2 = y1;
mousedown = true;
}

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (mousedown)
{
Refresh();
//Pen backgroundColor = new Pen(panel1.BackColor);
Pen blue = new Pen(Color.Blue);
using (g = panel1.CreateGraphics())
{
// g.DrawLine(backgroundColor, (int)x1, (int)y1, (int)x2, (int)y2);
g.DrawLine(blue, (int)x1, (int)y1, (int)e.X, (int)e.Y);
}
x2=e.X;
y2=e.Y;
}
}

private void panel1_MouseUp(object sender, MouseEventArgs e)
{
mousedown = false;
Pen blue = new Pen(Color.Blue);
using (g =Graphics.FromImage(panel1.BackgroundImage))
{
g.DrawLine(blue, (int)x1, (int)y1, (int)e.X, (int)e.Y);
}
Refresh();
}
}
}

RmeXXXXXXXXX
یک شنبه 31 خرداد 1394, 23:22 عصر
public partial class Form1 : Form
{
private Point _startPoint;
private bool _isDrawing;
private readonly Graphics _graphic;
private readonly Image _boardImage;
private readonly Pen _pen;
private readonly IList<Line> _lines;

class Line
{
public Point StartPoint { get; set; }
public Point EndPoint { get; set; }
}

public Form1()
{
InitializeComponent();

_boardImage = new Bitmap(panel1.Width, panel1.Height, PixelFormat.Format32bppArgb);
_graphic = Graphics.FromImage(_boardImage);
_pen = new Pen(Color.Blue);
_lines = new List<Line>();
}

private void drawLines()
{
_graphic.Clear(Color.Cornsilk);
foreach (var line in _lines)
_graphic.DrawLine(_pen, line.StartPoint, line.EndPoint);
}

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
_isDrawing = e.Button == MouseButtons.Left;
if (_isDrawing)
_startPoint = e.Location;
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (!_isDrawing) return;
drawLines();
_graphic.DrawLine(Pens.Red, _startPoint, e.Location);
pictureBox1.Image = _boardImage;
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
if (!_isDrawing) return;
var line = new Line() {StartPoint = _startPoint, EndPoint = e.Location};
_lines.Add(line);
drawLines();
pictureBox1.Image = _boardImage;
_isDrawing = false;
}
};

enayat1
دوشنبه 01 تیر 1394, 13:13 عصر
یکم تغییرات تو کد مشکلتونو رفع میکنه

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Line
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Graphics g;
double x1, y1, x2, y2;
bool mousedown;
private void Form1_Load(object sender, EventArgs e)
{
Bitmap back = new Bitmap(panel1.Width, panel1.Height);
using (Graphics g = Graphics.FromImage(back))
{
g.FillRectangle(new SolidBrush(panel1.BackColor),
0, 0,
panel1.Width,
panel1.Height);

}
panel1.BackgroundImage = back;
}

private void panel1_MouseDown(object sender, MouseEventArgs e)
{
x1 = MousePosition.X;
y1 = MousePosition.Y;
x2 = x1;
y2 = y1;
mousedown = true;
}

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (mousedown)
{
Refresh();
//Pen backgroundColor = new Pen(panel1.BackColor);
Pen blue = new Pen(Color.Blue);
using (g = panel1.CreateGraphics())
{
// g.DrawLine(backgroundColor, (int)x1, (int)y1, (int)x2, (int)y2);
g.DrawLine(blue, (int)x1, (int)y1, (int)e.X, (int)e.Y);
}
x2=e.X;
y2=e.Y;
}
}

private void panel1_MouseUp(object sender, MouseEventArgs e)
{
mousedown = false;
Pen blue = new Pen(Color.Blue);
using (g =Graphics.FromImage(panel1.BackgroundImage))
{
g.DrawLine(blue, (int)x1, (int)y1, (int)e.X, (int)e.Y);
}
Refresh();
}
}
}




aliagamon عزیز
با سلام

از اینکه وقت گذاشتین و پاسخ دادین بسیار ممنونم اما این کد به نظرم دو تا مشکل داره. اول اینکه بازم نقطه شروع خط می پره. یعنی نقطه شروع همون جایی نیست که من کلیک می کنم و از یه جای دیگه خطم شروع میشه(نمیدونم شما خودتون کد رو ران کردین یا نه. آیا ممکن که برنامه ویژوال استودیوی من مشکلی داشته باشه؟!). مورد دوم اینه که شما سوال منو در مورد پاک نشدن خط زیرین به خوبی جواب دادین اما مشکل اینه که شکل خیلی می پره و انگار داره مرتب چشمک میزنه.

enayat1
دوشنبه 01 تیر 1394, 13:17 عصر
RmeXXXXXXXXX عزیر
با سلام و تشکر فراوان بابت پاسخ بی نقصتون

بسیار بسیار سپاسگذارم. این دقیقا همون چیزی بود که مدنظرم بود. :تشویق:

RmeXXXXXXXXX
سه شنبه 02 تیر 1394, 00:01 صبح
خواهش میکنم.