PDA

View Full Version : سوال: رسم نقاشی در چند فرم به صورت همزمان در سی شارپ



mohamaddarbandi
پنج شنبه 06 تیر 1387, 11:50 صبح
سلام دوستان.
یه سوال در حین انجام یه پروژه دانشگاهی برام پیش اومده. لطفا راهنماییم کنید:
من یه فرم دارم که توی اون با ابزار paint و pen میشه نقشی کشید. اما این نقاشی قراره در حین کشیدن توسط نقاش، به صورت realtime برای کابران دیگر شبکه هم قابل مشاهده باشه. خودم فکر کردم در حین کشیدن این نقاشی x , y ماوس رو برای بقیه بفرستم و اونها هم نقاشی رو بدون pen و با x , y روی فرم خودشون رسم کنند. اما در مرحله اول برای چک کردن اینکه آیا این کار عملی هست یا نه دو تا فرم درست کردم و سعی کردم روی یکی نقاشی کنم و روی هردو فرم نقاشی رو در حین کشیدن ببینم. اما هیچ راهی پیدا نکردم! مشکل اینه که هیچ حلقه ای نتونستم درست کنم که جای Form1_MouseMove در کد زیر جایگزین بشه!
حالا سوالم اینه:
1. آیا روش فرستادن x , y روش خوبیه؟ و اگه خوب نیست چه روشی برای رسم لحظه به لحظه ی نقاشی روی فرم تمام client های دیگر شبکه پیشنهاد میکنید؟
2. چطور با استفاده از x , y نقاشی که روی یه فرم رسم میشه را روی یه فرم دیگه به صورت لحظه به لحظه نمایش بدم؟ به عبارت دیگه چطور بدون استفاده از pen و با استفاده ازx , yهای متوالی که به کلاس فرم داده میشه یه نقاشی رسم کنم.


این GUI اولیه کشیدن نقاشی روی فرم هست. اولین پاسخ هم کد برنامه هست.

http://i28.tinypic.com/4lg5z5.jpg

mohamaddarbandi
پنج شنبه 06 تیر 1387, 11:55 صبح
برای این که بریسها در بین # وارونه نمایش داده می شدند مجبور شدم توی پاسخها کد رو بذارم. به هر حال ممنون razavi universityجان

in code barnameye balast:


namespace pen
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Graphics g;
Pen p = new Pen(Color.Black);
public int last_point_x=0;
public int last_point_y=0;
public Boolean status = false;
public Boolean draw_line_cheker = false;
private void Form1_Load(object sender, EventArgs e)
{
g = this.CreateGraphics();

}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (draw_line_cheker == true)
{
if (status == false)
{
last_point_x = e.X;
last_point_y = e.Y;
status = true;
}
//draw line
g.DrawLine(p, last_point_x, last_point_y, e.X, e.Y);
last_point_x = e.X;
last_point_y = e.Y;
}
}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (checkBox1.Checked == true)
draw_line_cheker = true;

}

public void Form1_MouseUp(object sender, MouseEventArgs e)
{
draw_line_cheker = false;
status = false;
}



private void eraseButton_Click(object sender, EventArgs e)
{
g.Clear(Color.White);
}

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
switch (checkBox1.Text)
{
case(" ON "):
{
checkBox1.Text = "OFF";
checkBox1.ForeColor = Color.Red;
break;
}
case("OFF"):
{
checkBox1.Text=" ON ";
checkBox1.ForeColor = Color.Green;
break;
}


}
}


}
}

mohamaddarbandi
جمعه 07 تیر 1387, 11:09 صبح
یعنی کسی نمیتونه منو راهنمایی کنه؟
بابا این که برا برنامه نویس های حرفه ای سایت نباید سوال سختی باشه!!!

SabaSabouhi
شنبه 08 تیر 1387, 11:36 صبح
با سلام
من چند تا نكته رو مى‌گم شايد به دردت بخوره.
1. اول اين كه تو هيچ Event Handlerى كد واقعى ننويس، كدهات رو توى رويه‌هاى ديگه بنويس و توى Event Hander اون رويه رو فراخوانى كن.
2. از يك صف (Queue) استفاده كن. به اين صورت كه هر كارى كه خواستى انجام بدى شامل رسم يك نقطه، يك خط، يك منحنى يا غيره فرمان رو در يك صف قرار بده، اما فرمان رو انجام نده.
3. بخشى ديگه از برنامه كه با يك Timer فعال مى‌شه بايد از صف فرمان رو برداره و رسم كنه. اين قسمت هم تو برنامه‌ى اصلى وجود داره و هم تو برنامه‌هاى ديگه.

اين صف بايد شامل يك ساختارى باشه كه حتماً يك سريال داشته باشه به اين دليل كه هر كدام از Clientها بدونن از كدوم سريال به بعد رو بايد دريافت كرده و رسم كنن.

حالا تنها كار باقى مونده اينه كه اين صف رو در شبكه Share كنى، راه‌هاى مختلفى وجود داره كه به‌ترينش اينه كه هر Client از طريق شبكه اطلاعات درخواست و دريافت كنه، راه راحت‌ترش هم استفاده از يك Database هست كه همگى بهش دسترسى دارن.

صبا صبوحى

mohamaddarbandi
دوشنبه 10 تیر 1387, 19:12 عصر
ممنون صبا جان.
ولی قضیه خیلی ساده تر از این حرفها حل شد.

این جواب سوال خودمه. می ذارم اینجا بقیه اگه نیاز پیدا کردند استفاده کنند:
اول اینکه این نقاشی با x و y ماوس و تبدیل اونها به خطهای خیلی کوچک کشیده میشه.(همونطور که در کد بالا پیداست) بنابر این برای فرستادن اون کافیه x و y رو برای بقیه کلاینتها برادکست کنیم. و اونها با استفاده از thread و ابزار pen این x و y ها رو به نقاشی تبدیل کنند.
اگر در این مورد نیاز به اطلاعات بیشتری داشتید پیام بذارید.