PDA

View Full Version : مشکل این برنامه کجاست؟



vinnie-paz
پنج شنبه 06 مهر 1391, 12:09 عصر
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{

public partial class Form1 : Form
{
int X, Y;
Bitmap bmp;
Graphics g;

public Form1()
{

InitializeComponent();
}



private void Form1_Load(object sender, EventArgs e)
{
bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
g = Graphics.FromImage(bmp);
g.Clear(Color.White);
pictureBox1.Image = bmp;
}

private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
bmp.SetPixel(e.X, e.Y, Color.Blue);
pictureBox1.Image = bmp;
}

private void pictureBox1_Click(object sender, EventArgs e)
{

}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
bmp.SetPixel(e.X, e.Y, Color.Blue);
pictureBox1.Image = bmp;
g.DrawLine(Pens.Blue, X, Y, e.X, e.Y);
pictureBox1.Image = bmp;

}
}
}
1-در رویداد mouse move بجای دستور setpixel دستور drawline بنویسید و دو متغیر سراسری x و y را تعریف کنید.(من تا این قسمتو انجام دادم ولی متاسفانه بعدش ...)
2-چجوری میشه در رویداد mousedown مختصات e.X و e.Y را داخل x و y بریزیم.(در همین رویداد یک متغیر f را که سراسری تعریف کرده ایم و از نوع bool است مقدار true بدهیم.
3-مرحله ی 1 را بصورت if در بیاورید یعنی در mousemove یک if دور کل 4 دستور نوشته شده قرار دهید.
4-در رویداد mouse up متغیر f را false کنید.(گفته مثه خط کشیدن تو paint باشه وقتی کلیک کردی خط رسم بشه و وقتی کلیک رو رها کردی قطع بشه) لطفا اگه کسی میدونه جوابمو بده مرسی از همه دوستان

morteza271
پنج شنبه 06 مهر 1391, 12:18 عصر
کدتون رو درست کردم.
بفرمائید :
int X, Y;
Bitmap bmp;
Graphics g;
bool f = false;

private void Form2_Load(object sender, EventArgs e)
{
bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
g = Graphics.FromImage(bmp);
g.Clear(Color.White);
pictureBox1.Image = bmp;
}

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
bmp.SetPixel(e.X, e.Y, Color.Blue);
X = e.X;
Y = e.Y;
pictureBox1.Image = bmp;
f = true;
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (f)
{
bmp.SetPixel(e.X, e.Y, Color.Blue);
pictureBox1.Image = bmp;
g.DrawLine(Pens.Blue, X, Y, e.X, e.Y);
pictureBox1.Image = bmp;
}
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
f = false;
}

harani
پنج شنبه 06 مهر 1391, 12:18 عصر
خب این کد چیکار میکنه ؟؟؟؟؟ همیشه اول کارایبی کدتونو بگبد شاید یکی راه حل کوتاهتر و بهتری رو بدونه .

vinnie-paz
پنج شنبه 06 مهر 1391, 12:23 عصر
دمه جفتتون گرم مرسی

vinnie-paz
پنج شنبه 06 مهر 1391, 12:30 عصر
آقا این جواب داد ولی خطی که رسم میکنه حالت طیفه خورشیدی پیدا کرده مشکلش چی میتونه باشه؟

vinnie-paz
پنج شنبه 06 مهر 1391, 12:33 عصر
خب این کد چیکار میکنه ؟؟؟؟؟ همیشه اول کارایبی کدتونو بگبد شاید یکی راه حل کوتاهتر و بهتری رو بدونه .

داداش مرسی که جواب میدی واقعا دستتون درد نکنه کدشو دوستمون لطف کرد گذاشت ولی مشکلی که هنوز دارم اینه که خطو بصورت طیف خورشیدی رسم میکنه نه یک خط راست مثه paint

harani
پنج شنبه 06 مهر 1391, 12:33 عصر
شما میخواین خط بکشید تو فرمتون چیکار میخواین بکنید بگید تا راهنمایی کنم . لطف کنید کداتونم تو تگ #C بذارید .

اینو ببین رسم خط تو کنترل picture box هستش .اتفاقاً برا خودتونم جواب دادم مگه درست نبود .
http://barnamenevis.org/showthread.php?362664-%D8%B1%D8%B3%D9%85-%D8%AE%D8%B7

vinnie-paz
پنج شنبه 06 مهر 1391, 12:36 عصر
بگید کدتون برای چی هستش تا راهنماییت کنم .

دوست گلم مثه یه خط ساده که تو paint میکشیم میخوام حالت mousedown ش خطو رسم کنه و در حالت mouseup ش دیگه خطی رسم نکنه. بازم ممنون

morteza271
پنج شنبه 06 مهر 1391, 12:53 عصر
بفرمائید دوست عزیز :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestPictureBox
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

int X, Y;
Bitmap bmp;
Graphics g;
bool f = false;

List<Lines> lstLines;

private void Form2_Load(object sender, EventArgs e)
{
lstLines = new List<Lines>();

bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
g = Graphics.FromImage(bmp);
g.Clear(Color.White);
pictureBox1.Image = bmp;
}

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
X = e.X;
Y = e.Y;
f = true;
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (f)
{
g.Clear(Color.White);
pictureBox1.Image = bmp;

foreach (var Item in lstLines)
{
g.DrawLine(Pens.Blue, Item.X1, Item.Y1, Item.X2, Item.Y2);
pictureBox1.Image = bmp;
}
g.DrawLine(Pens.Blue, X, Y, e.X, e.Y);
pictureBox1.Image = bmp;
}
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
lstLines.Add(new Lines() { X1 = X, Y1 = Y, X2 = e.X, Y2 = e.Y });
f = false;
}
}

public class Lines
{
public int X1;
public int Y1;
public int X2;
public int Y2;
}
}


این الان دقیقا همونی هست که میخوای!البته هنوزم جای کار برای بهتر کردنش هست.من فقط اینو سریع برای شما نوشتم.
اگه مشکلی بود بگین تا کمکتون کنم.
موفق باشید

vinnie-paz
پنج شنبه 06 مهر 1391, 13:00 عصر
مرسی واقعا نمیدونم با چه زبونی ازت تشکر کنم آقا 2 تا سوال دیگه بپرسم دیگه قول میدم مزاحمتون نشم ببین من این کدارو نوشتم خوب ولی وقتی اجراش میکنم اولا اینکه حالت mousemove ش باعث میشه که وقتی موس را روی picturebox میبرم اون امواج خورشیدی میاد میگم نمیشه همین کدارو دستکاری کنیم که درست بشه؟ و این کدایی که شما میزاری تو چی تایپشون میکنی که انقدر مرتب میاره؟ مرسی دوست عزیزم
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{

public partial class Form1 : Form
{
bool f = true;
int X, Y;
Bitmap bmp;
Graphics g;

public Form1()
{

InitializeComponent();
}



private void Form1_Load(object sender, EventArgs e)
{
bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
g = Graphics.FromImage(bmp);
g.Clear(Color.White);
pictureBox1.Image = bmp;
}

private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
bmp.SetPixel(e.X, e.Y, Color.Blue);
pictureBox1.Image = bmp;
}

private void pictureBox1_Click(object sender, EventArgs e)
{

}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (f)
{
//bmp.SetPixel(e.X, e.Y, Color.Blue);
pictureBox1.Image = bmp;
g.DrawLine(Pens.Blue,X,Y , e.X, e.Y);
pictureBox1.Image = bmp;

}
}

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
bmp.SetPixel(e.X, e.Y, Color.Blue);
X = e.X;
Y = e.Y;
pictureBox1.Image = bmp;
f = true;
}
int xup, yup;
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
f = false;
xup = e.X;//k
yup = e.Y;//j

Graphics g = pictureBox1.CreateGraphics();//h
SolidBrush sb = new SolidBrush(Color.Black);//g
Pen p = new Pen(sb, 1);//b
g.DrawLine(p, X, Y, xup, yup);

}
}
}

morteza271
پنج شنبه 06 مهر 1391, 13:12 عصر
خواهش میکنم دوست عزیز.

در مورد اینکه طیفی میاره باید بگم که در رویداد MouseMove همیشه شما دارین یه خط جدید ایجاد می کنید در صورتی که هنوز موس رها نشده و نباید اون خط رسم بشه.
این کاری که من کردم دقیقا همون کار شماس ولی خطهای قبلی رو پاک میکنم و خطهای جدید رو دوباره رسم میکنم. لیست خطهای واقعی هم که در متغیر lstLines ذخیره میشن و تا وقتی که موس رو رها نکنیم هیچ خط جدید به این لیست اضافه نمیشه! و وقتی که موس رو رها کردیم خط جدید به لیست اضافه میشه.

به غیر از این روش نمیشه کاری کرد چون در هنگام حرکت موس خط ایجاد میشه.

در مورد سوال دومتون :
در قسمت بالای جاییکه متن رو تایپ می کنید چند تا گزینه هست مثلا C++ و C# و ...
هر کدوم رو که بزنید یک تگ ایجاد میشه و میتونید کدتون رو داخل اون بنویسید تا درست دیده بشه.
موفق باشید

vinnie-paz
پنج شنبه 06 مهر 1391, 13:18 عصر
یه دنیا ممنون داداش خدا واسه ی این فروم حفظت کنه مثه شما کم پیدا میشه خیلی ماهی:تشویق::قلب: