PDA

View Full Version : افکت گذاری روی picture box



MiniMicro
پنج شنبه 07 شهریور 1392, 12:35 عصر
سلام خدمت همه ی دوستان چطوری میشه picture box ها رو طوری تنظیم کرد که وقتی ماوس روش رفت بزرگنمایی بشه و وقتی ماوس از روش رفت کوچک بشه پیشاپیش ممنون از راهنماییتون....

shahryari
پنج شنبه 07 شهریور 1392, 12:49 عصر
سلام
Size s;
Point p;
private void pictureBox1_MouseEnter(object sender, EventArgs e)
{
s = pictureBox1.Size;
p = pictureBox1.Location;
pictureBox1.Size = new Size(s.Width + 6, s.Height + 6);
pictureBox1.Location = new Point(p.X - 3, p.Y - 3);
Refresh();
}

private void pictureBox1_MouseLeave(object sender, EventArgs e)
{
pictureBox1.Size = s;
pictureBox1.Location = p;
Refresh();
}

MiniMicro
شنبه 09 شهریور 1392, 09:42 صبح
سلام دوست عزیز ممنون از پاسخ خوبتون اما من وقتی که یک پس زمینه برای فرم انتخاب میکنم حرکت picture box کند میشه آیا راه حلی برای این که سرعت حرکتشون مثل حالت بدون پس زمینه بشه وجود داره؟

aliagamon
شنبه 09 شهریور 1392, 11:49 صبح
منضورتونو دقیقا نفهمیدم ولی اصولا:
دوتا راه دارید....
اول اینکه از thread استفاده کنید...
دوم اینکه برید رو WPF :لبخند:...

MiniMicro
شنبه 09 شهریور 1392, 12:18 عصر
سلام منظور من اینه که ما وقتی روی یک picture box کار هایی رو که دوستمون گفت انجام بدیم خیلی خوب کار انجام میشه ولی وقتی که یه تصویر پس زمینه برای فرم انتخاب می کنیم سرعت بزرگ شدن و کوچک شدن کنترل به نسبت فرم بدون پس زمینه خیلی کم میشه میتونید یه پروژه ایجاد کنید و نتیجه رو ببینید، آیا راهی هست که مشکل رو رفع کرد؟
-اگر با thread میشه چطوری امکان داره و اگر ممکن هست یک مثال بزنید.
-wpf رو یه معرفی کنید و اگر امکان داره یه مثال هم بزنید...

پیشاپیش ممنون از راهنماییتون.

aliagamon
شنبه 09 شهریور 1392, 12:45 عصر
اگه مشکل فلش زدن بکگرانده شما خط refresh رو بردار درست میشه....

MiniMicro
شنبه 09 شهریور 1392, 19:23 عصر
ممنون ولی باز هم سرعتش کم هست یا راه حل دیگه ای داره؟

aliagamon
شنبه 09 شهریور 1392, 19:30 عصر
شاید چون من تو پروژه کوچیک تست میکنم مشکل سرعت پیش نمیاد ....
شما یه تست بکنید....2 تا بکگراند ورکر بزارین رو پروژه و بعد dowork اولی رو بکنید چیز هایی که تو رویداد pictureBox1_MouseEnter و dowork دومی رو هم بکنید کد های درون رویداد leave حالا تو enter اولی و تو leave دومی رو اجرا کنید اینطوری:

backgroundWorker1.RunWorkerAsync();

فکر نکنم دیگه مشکل سرعت وجود داشته باشه...

arefba
شنبه 09 شهریور 1392, 19:33 عصر
اگه اشتباه نکنم یه خاصیت به اسم دابل بافر بود که true می کردی

MiniMicro
شنبه 09 شهریور 1392, 19:45 عصر
اگه اشتباه نکنم یه خاصیت به اسم دابل بافر بود که true می کردی
سلام من همچین خاصیتی ندیدم نه در backgroundworker و نه در picturebox

MiniMicro
شنبه 09 شهریور 1392, 19:51 عصر
شاید چون من تو پروژه کوچیک تست میکنم مشکل سرعت پیش نمیاد ....
شما یه تست بکنید....2 تا بکگراند ورکر بزارین رو پروژه و بعد dowork اولی رو بکنید چیز هایی که تو رویداد pictureBox1_MouseEnter و dowork دومی رو هم بکنید کد های درون رویداد leave حالا تو enter اولی و تو leave دومی رو اجرا کنید اینطوری:

backgroundWorker1.RunWorkerAsync();

فکر نکنم دیگه مشکل سرعت وجود داشته باشه...

سلام کار هایی که من انجام دادم به این صورت هست:
1-اول دو تا backgroundworker روی فرم قرار دادم
2-تو رویداد های enter و leave ، کنترل picture box این کد ها رو قرار دادم:

Size s;
Point p;
private void pbAdd_MouseEnter(object sender, EventArgs e)
{
// s = pbAdd.Size;
// p = pbAdd.Location;
// pbAdd.Size = new Size(s.Width + 12, s.Height + 12);
// pbAdd.Location = new Point(p.X - 6, p.Y -6);
//// Refresh();
backgroundWorker1.RunWorkerAsync();
}

private void pbAdd_MouseLeave(object sender, EventArgs e)
{
// pbAdd.Size = s;
// pbAdd.Location = p;
//// Refresh();
backgroundWorker2.RunWorkerAsync();
}


3- و در رویداد dowork هر کدوم از backgroundworker ها هم به ترتیب این کد ها رو قرار دادم:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
s = pbAdd.Size;
p = pbAdd.Location;
pbAdd.Size = new Size(s.Width + 12, s.Height + 12);
pbAdd.Location = new Point(p.X - 6, p.Y - 6);
Refresh();
}

private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
pbAdd.Size = s;
pbAdd.Location = p;
Refresh();
}

ولی یه خطایی داد:


Cross-thread operation not valid: Control 'pbAdd' accessed from a thread other than the thread it was created on.

آیا کارهایی که من انجام دادم درست بوده؟
راه حل پیشنهادی شما چیه؟

aliagamon
شنبه 09 شهریور 1392, 19:51 عصر
سلام من همچین خاصیتی ندیدم نه در backgroundworker و نه در picturebox
در هیچ کدوم نیست....نو فرم لود بنویسش....

aliagamon
شنبه 09 شهریور 1392, 19:52 عصر
سلام کار هایی که من انجام دادم به این صورت هست:
1-اول دو تا backgroundworker روی فرم قرار دادم
2-تو رویداد های enter و leave ، کنترل picture box این کد ها رو قرار دادم:

Size s;
Point p;
private void pbAdd_MouseEnter(object sender, EventArgs e)
{
// s = pbAdd.Size;
// p = pbAdd.Location;
// pbAdd.Size = new Size(s.Width + 12, s.Height + 12);
// pbAdd.Location = new Point(p.X - 6, p.Y -6);
//// Refresh();
backgroundWorker1.RunWorkerAsync();
}

private void pbAdd_MouseLeave(object sender, EventArgs e)
{
// pbAdd.Size = s;
// pbAdd.Location = p;
//// Refresh();
backgroundWorker2.RunWorkerAsync();
}


3- و در رویداد dowork هر کدوم از backgroundworker ها هم به ترتیب این کد ها رو قرار دادم:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
s = pbAdd.Size;
p = pbAdd.Location;
pbAdd.Size = new Size(s.Width + 12, s.Height + 12);
pbAdd.Location = new Point(p.X - 6, p.Y - 6);
Refresh();
}

private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
pbAdd.Size = s;
pbAdd.Location = p;
Refresh();
}

ولی یه خطایی داد:

آیا کارهایی که من انجام دادم درست بوده؟
راه حل پیشنهادی شما چیه؟
اینو تو فرم لود بنویس:
CheckForIllegalCrossThreadCalls = false;

MiniMicro
شنبه 09 شهریور 1392, 19:53 عصر
در هیچ کدوم نیست....نو فرم لود بنویسش....

اما تو فرم لود نوشتم چیزی نبود میشه یه مثال بزنید؟

aliagamon
شنبه 09 شهریور 1392, 19:54 عصر
اما تو فرم لود نوشتم چیزی نبود میشه یه مثال بزنید؟
private void Form1_Load(object sender, EventArgs e)
{
DoubleBuffered = true;
}

MiniMicro
شنبه 09 شهریور 1392, 19:56 عصر
CheckForIllegalCrossThreadCalls = false;
نوشتم اما اتفاقی که میفته اینه وقتی که ماوس میره رو کنترل picturebox وقتی picturebox بالا میاد یه تیکه از عکس پشت خودش رو هم میاره بالا"کپی میکنه"
و بعد خطایی که میگیره:

This BackgroundWorker is currently busy and cannot run multiple tasks concurrently.
تا جایی که من میدونم backgroundworker یکی از ابزارهایی هست که برای برنامه نویسی موازی ازش استفاده میشه ولی پیغام خطایی که داده میگه :
"بک گراند ورکر الان مشغول هست و نمیتونه چند تا کار رو به صورت همزمان انجام بده."

MiniMicro
شنبه 09 شهریور 1392, 20:07 عصر
تازه اتفاق جالبی که افتاد اینه که اینقدر با ماوس رو picture box رفتم و برگشتم کنترل کلاً غیب شد این از چیه؟:متفکر:
اومدیم ابرو شو درست کنیم زدیم چشمشو درآوردیم:لبخندساده:

aliagamon
شنبه 09 شهریور 1392, 20:10 عصر
دلیلش اینه که backgrundworker در اون لحظه busy هست....فکر کنم شما تو چنتا پیکچر باکس دارین استفاده میکنین درسته؟
خوب باید اینطوری استفاده کنید:

backgroundWorker1.RunWorkerAsync(1);
backgroundWorker1.RunWorkerAsync(2);
backgroundWorker1.RunWorkerAsync(3);
backgroundWorker1.RunWorkerAsync(4);

یعنی هر با که استفاده میکنید یه ارگومان بدید درست میشه(مثلا پیکچر باکس اولی از اولین خط استفاده کنه دومی از دومین خط و الی اخر)

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

shahryari
شنبه 09 شهریور 1392, 20:48 عصر
داداش لزوم استفاده از بکگراند ورکر در این مورد شما چیه؟؟؟؟
کار سنگینی انجام نمیده که برنامه قفل کنه
بدون بکگراند امتحان کردی؟؟؟

aliagamon
شنبه 09 شهریور 1392, 20:53 عصر
داداش لزوم استفاده از بکگراند ورکر در این مورد شما چیه؟؟؟؟
کار سنگینی انجام نمیده که برنامه قفل کنه
بدون بکگراند امتحان کردی؟؟؟
والا واسه منم کند نیست ولی ایشون میگن که کنده ......گفتم شاید با بکگراندورکر مشکل حل بشه....:لبخند:

MiniMicro
یک شنبه 10 شهریور 1392, 09:47 صبح
سلام دوستن من سورس رو قرار میدم شما بررسی کنید وقتی که بدون پس زمینه برای فرم این کار رو انجام میدم هیچ مشکل کندی ای وجود نداره ولی وقتی یه پس زمینه برای فرم قرار میدم کند بودن بالا و پایین رفتن picture box خودش رو نشون میده.
http://code2code.persiangig.com/SourceCodes/WindowsFormsApplication2.rar/download