PDA

View Full Version : مشکل در رسم مربع و دایره در paint



bahar_engineer
یک شنبه 18 اسفند 1387, 17:33 عصر
یه سوال دیگه هم دارم
من یک paint ساختم اما رسم مربع و دایره اش مشکل داره یعنی نمی دونم چطور بنویسم. سرچ کردم تو سایت های خارجی پیدا کردم که به صورت استاتیک و ثابت یک مربع و یک دایره در یک مکان ثابت با رنگ و اندازه ثابت می کشه . اما با موس نیست و ثابت هم هست. حالا یک کد پیدا کردم اما اونم چیزی که من می خوام نیست اما فکر می کنم بشه با کمی تغییر درستش کرد. کد و می ذارم . اگه ممکنه یه نگاه بهش بندازین . ممنون می شم



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

namespace mycsharp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

}

Boolean bHaveMouse;
Point ptOriginal = new Point();
Point ptLast = new Point();

// Called when the left mouse button is pressed.
public void MyMouseDown(Object sender, MouseEventArgs e)
{
// Make a note that we "have the mouse".
bHaveMouse = true;
// Store the "starting point" for this rubber-band rectangle.
ptOriginal.X = e.X;
ptOriginal.Y = e.Y;
// Special value lets us know that no previous
// rectangle needs to be erased.
ptLast.X = -1;
ptLast.Y = -1;
}
// Convert and normalize the points and draw the reversible frame.
private void MyDrawReversibleRectangle(Point p1, Point p2)
{
Rectangle rc = new Rectangle();

// Convert the points to screen coordinates.
p1 = PointToScreen(p1);
p2 = PointToScreen(p2);
// Normalize the rectangle.
if (p1.X < p2.X)
{
rc.X = p1.X;
rc.Width = p2.X - p1.X;
}
else
{
rc.X = p2.X;
rc.Width = p1.X - p2.X;
}
if (p1.Y < p2.Y)
{
rc.Y = p1.Y;
rc.Height = p2.Y - p1.Y;
}
else
{
rc.Y = p2.Y;
rc.Height = p1.Y - p2.Y;
}
// Draw the reversible frame.
ControlPaint.DrawReversibleFrame(rc,
Color.Red, FrameStyle.Thick);
}
// Called when the left mouse button is released.
public void MyMouseUp(Object sender, MouseEventArgs e)
{
// Set internal flag to know we no longer "have the mouse".
bHaveMouse = false;
// If we have drawn previously, draw again in that spot
// to remove the lines.
if (ptLast.X != -1)
{
Point ptCurrent = new Point(e.X, e.Y);
MyDrawReversibleRectangle(ptOriginal, ptLast);
}
// Set flags to know that there is no "previous" line to reverse.
ptLast.X = -1;
ptLast.Y = -1;
ptOriginal.X = -1;
ptOriginal.Y = -1;
}
// Called when the mouse is moved.
public void MyMouseMove(Object sender, MouseEventArgs e)
{
Point ptCurrent = new Point(e.X, e.Y);
// If we "have the mouse", then we draw our lines.
if (bHaveMouse)
{
// If we have drawn previously, draw again in
// that spot to remove the lines.
if (ptLast.X != -1)
{
MyDrawReversibleRectangle(ptOriginal, ptLast);
}
// Update last point.
ptLast = ptCurrent;
// Draw new lines.
MyDrawReversibleRectangle(ptOriginal, ptCurrent);
}
}
// Set up delegates for mouse events.
protected override void OnLoad(System.EventArgs e)
{
MouseDown += new MouseEventHandler(MyMouseDown);
MouseUp += new MouseEventHandler(MyMouseUp);
MouseMove += new MouseEventHandler(MyMouseMove);
bHaveMouse = false;
}

}
}

Amir Oveisi
دوشنبه 19 اسفند 1387, 00:21 صبح
برای رسم یک شکل با موس، باید event مربوط به MouseMove کنترلتو هندل کنی :
1- اولین بار که کلیلک شد موقعیت موس رو نگه دار.
2- وقتی که موس داره حرکت میکنه:
- اگر کلید موس پایین بود --> شکل های موجود رو پاک کن و از نقطه اولی که نگه داشته بودی تا نقطه فعلی موس یک مستطیل بکش.
- اگر کلید موس پایین نبود --> عملیات رسم این مستطیل تموم شده و بر منتظر مرحله یک باش.

موفق باشید
jooje

bahar_engineer
دوشنبه 19 اسفند 1387, 10:47 صبح
از راهنمایی تون ممنونم . سعی می کنم درستش کنم :متفکر:

bahar_engineer
سه شنبه 20 اسفند 1387, 11:38 صبح
سلام
من مشکلم تقریباً حل شده اما الان یه مشکل کوچولو دارم!
توابع رسم شکل من مثلاً دایره به این شکله


//draw Ellipse
private void my_Ellipse(int ToX, int ToY)
{
Graphics my_graph = pictureBox1.CreateGraphics();
my_graph.Clear(Color.White);
Rectangle my_rec = new System.Drawing.Rectangle(x, y, ToX, ToY);
my_graph.DrawEllipse(p, my_rec);
my_graph.Dispose();
}


دستور my_graph.Clear(Color.White); رو اگه نذارم با هر بار drag o drop چندین دایره پشت سر هم می کشه که قابل کنترل نیست.
الان وقتی دایره می کشم بعد می خوام یه شکل دیگه بکشم می ره روی قبلی ها! یعنی صفحه سفید می شه و بعد دایره رسم می شه. در رابطه با بقیه هم همینطوره
اگه هم pictureBox1.Image = myimg; رو به اول کد تابعم اضافه کنم مثلاً وقتی خط می کشم حالا می رم دایره بکشم اون خط هنوز هستش اما دایره از روی صفحه می پره یعنی با برداشتن موس دایره هم محو می شه !
یه جای کار مشکل داره می تونین کمک کنین؟
تو رویدار کلیک موس و حرکت موس هم این خط رو گذاشتم:pictureBox1.Image = myimg; اما بازم مشکلم همینه!

bahar_engineer
چهارشنبه 21 اسفند 1387, 10:54 صبح
من توی این رسم مربع و دایره مشکل دارم
کمک کنید اساتید محترم
کدشو بذارم تحویل می گیرین؟؟!!
وقتی رسم می کنم مشکلی نداره فقط هر بار یکی را رسم می کنه . مثلاً دایره اون هم یک بار
اگه دو تا بخوام بکشم قبلی حذف می شه . یا اگه دایره کشیدم حالا بخوام مربع بکشم بازم حذف می شه شکل قبلی.
تاپیک ها رو خوندم ... اما من نمی تونم کدهامو تو رویداد paint بذارم. آخه یه تابع که باید فراخوانی بشه !
چکار کنم؟

mostafaaa
چهارشنبه 21 اسفند 1387, 11:41 صبح
سلام دوست من
برای این کار من قبلا یه کلاس نوشتم که به راحتی میتونی باهاش کار کنی، فقط کافی کنترلت رو بهش بدی و باقی کارها رو خود کلاس انجام میده :

public class DrawEllibseWithMouse
{
private struct ORD
{
public int X1;
public int X2;
public int Y1;
public int Y2;
}
private Control _ctrl;
public DrawEllibseWithMouse(Control ctrl)
{
_ctrl = ctrl;
}
private List<ORD> lstOrd = new List<ORD>();
private int X1;
private int X2;
private int Y1;
private int Y2;
private bool _CanDraw = false;
private void MouseDown(object sender, MouseEventArgs e)
{
if (e.Button ==MouseButtons .Left ) {
X1 = _ctrl.PointToClient(Cursor.Position).X;
Y1 = _ctrl.PointToClient(Cursor.Position).Y;
}
}
private void MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left) {
X2 = (_ctrl.PointToClient(Cursor.Position).X) - X1;
Y2 = (_ctrl.PointToClient(Cursor.Position).Y) - Y1;
_ctrl.Refresh();
foreach (ORD O in lstOrd) {
_ctrl.CreateGraphics() .DrawEllipse(Pens.Black , O.X1, O.Y1, O.X2, O.Y2);
}
_ctrl.CreateGraphics().DrawEllipse(Pens.Black, X1, Y1, X2, Y2);
}
}
private void MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left) {
ORD Temp = default(ORD);
Temp.X1 = X1;
Temp.X2 = X2;
Temp.Y1 = Y1;
Temp.Y2 = Y2;
lstOrd.Add(Temp);
}
}
public bool CanDraw {
get { return _CanDraw; }
set {
if (value) {
_ctrl.MouseDown += MouseDown;
_ctrl.MouseMove += MouseMove;
_ctrl.MouseUp += MouseUp;
}
else {
_ctrl.MouseDown -= MouseDown;
_ctrl.MouseMove -= MouseMove;
_ctrl.MouseUp -= MouseUp;
}
_CanDraw = value;
}
}
}
برای استفاده هم کافیه :

private void Form1_Load(object sender, EventArgs e)
{
DrawEllibseWithMouse DE = new DrawEllibseWithMouse(this );
DE.CanDraw = true;
}

bahar_engineer
چهارشنبه 21 اسفند 1387, 17:12 عصر
سلام
ممنون کلاس جالبی نوشتین
می تونم ازش استفاده کنم و برای مربع و خط هم توسعه اش بدم!!
خیلی لطف کردین

jojoba2010
چهارشنبه 21 اسفند 1387, 18:24 عصر
من در form2 که از form1 فراخوانی شده می خواهم به object های form1 (مثلا label1,textbox1,...) دسترسی داشته باشم بدون اینکه شی ای از form1 (که باز است ) بسازیم.

bahar_engineer
پنج شنبه 22 اسفند 1387, 17:31 عصر
فکر کنم اینطوری بشه :
در رویداد لود فرم 2 یا مثلاً کلیک یکی از باتن ها می نویسید:


form1.textbox1.text="HI"; //ACCESS TO TEXTBOX1 IN FORM1 BY FORM2