PDA

View Full Version : اسکرول با حرکت ماوس



مهدی رحیم زاده
سه شنبه 20 شهریور 1386, 21:04 عصر
سلام
این برنامه رو نگاه کنید ...
یک panel که توش یک picture box قرار داره ، اندازه عکس بزرگه و برای همین panel باید اسکرول بشه . من می خوام با حرکت ماوس این اسکرول انجام بشه طوری که کاربر بتونه عکس رو به راحتی با حرکت ماوس ببینه ...
مشکل من اینه که نمی دونم چطوری بفهمم که کدوم قسمت از عکس داره نمایش داده میشه تا بر طبق اون اسکرول کنم . مثلا اگر ماوس از سمت چپ و راست و یا بالا و پایین panel به میزان 100 پیکسل فاصله داشت اسکرول به میزان معینی انجام بشه و اگر هم نه اسکرول انجام نشه ...
ببینید شما می تونید منو راهنمایید کنید ...
اینجوری در نظر بگیرید که می خوام یک viewer واسه نشون دادن عکسای بزرگ طراحی کنم که کاربر بتونه با حرکت ماوس تمام عکس رو ببینه ( خودش اسکرول بش
ممنون میشم راهنمایی کنید :قلب:

مهدی رحیم زاده
چهارشنبه 21 شهریور 1386, 15:42 عصر
من می تونم این کار رو انجام بدم اما سرعتش اونقدر بالاست که موقع حرکت هیچی دیده نمیشه ...
شما می تونید اونو درست کنید ...

mehdisiavashian
چهارشنبه 21 شهریور 1386, 16:50 عصر
من می تونم این کار رو انجام بدم اما سرعتش اونقدر بالاست که موقع حرکت هیچی دیده نمیشه ...شما می تونید اونو درست کنید ...

اگه میشه کد رو بزارین... فکر کنم با timer بشه یه کارایی کرد...

مهدی رحیم زاده
چهارشنبه 21 شهریور 1386, 18:29 عصر
من این کد رو توی رویداد نوشتم و تقریبا درست کار می کنه،

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
line_x_position = e.X;
line_y_position = e.Y;
//
if (checkBox2.Checked == true)
{
if (line_x_position > 500)
{
this.panel1.HorizontalScroll.Value = ((line_x_position) - 30);
System.Threading.Thread.Sleep(50);
pictureBox1.Refresh();
}
else
this.panel1.HorizontalScroll.Value = 0;
if ((line_y_position) > 350)
{
this.panel1.VerticalScroll.Value = (line_y_position - 30);
System.Threading.Thread.Sleep(50);
pictureBox1.Refresh();
}
else
this.panel1.VerticalScroll.Value = 0;
}
}

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

System.Threading.Thread.Sleep(50);
چکار کنم که درست بشه !!!

PC2st
چهارشنبه 21 شهریور 1386, 23:36 عصر
دلیل اینکه این کدها سریع انجام میشه، بخاطر اینه که پس از تغییر محل Scroll های panel1، کنترل pictureBox1 هم جابجا میشه و با جابجا شدن کنترل pictureBox1، رویداد MouseMove دوباره فراخوانده میشه و این یعنی اینکه دستورات داخل متد pictureBox1_MouseMove، پشت سر هم اجرا میشوند.

برای راه حل، باید کاری کنید که تا پایان عملیات scroll، کنترل pictureBox1 به MouseMove پاسخ نده. یا اینکه handle مربوط به رویداد MouseMove رو غیر فعال کنید و پس از اینکه scroll بطور کامل انجام شد، دوباره این handle رو ایجاد کنید.

مهدی رحیم زاده
پنج شنبه 22 شهریور 1386, 16:48 عصر
برای راه حل، باید کاری کنید که تا پایان عملیات scroll، کنترل pictureBox1 به MouseMove پاسخ نده. یا اینکه handle مربوط به رویداد MouseMove رو غیر فعال کنید و پس از اینکه scroll بطور کامل انجام شد، دوباره این handle رو ایجاد کنید.

میشه بگید که چطوری این کار رو انجام بدم ؟؟؟

PC2st
پنج شنبه 22 شهریور 1386, 18:30 عصر
برای غیر فعال کردن Event، میشه توسط =- اون Handle رو از بین برد و دوباره توسط =+ آنرا اکتیو کرد (ممکنه راه حل جالبی نباشه). یا اینکه کاری کنیم که به پیامهای MouseMove از کنترل، پاسخی داده نشه (این راه رو زیاد آشنا نیستم).

در هر صورت یک راه سومی به ذهنم رسید، که بنظر از دوتای قبلی بهتره و اون استفاده از یک فیلد از نوع bool هست، مثلا، کد رو شبیه به زیر میشه نوشت:


bool isDone = false;
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if(!this.isDone)
{
if(e.X > 100)
{
this.panel1.HorizontalScroll.Value = e.X - 99;
pictureBox1.Refresh();
}
else
this.panel1.HorizontalScroll.Value = 0;
if(e.Y > 100)
{
this.panel1.VerticalScroll.Value = e.Y - 99;
pictureBox1.Refresh();
}
else
this.panel1.VerticalScroll.Value = 0;
this.isDone = true;
}
else
this.isDone = false;
}

همون کدهای خودتون هست با یک سری تغییرات جزیی.

مهدی رحیم زاده
پنج شنبه 22 شهریور 1386, 21:33 عصر
سلام دوست عزیز
من هنوز کد شما رو تست نکردم ، این کدو خودم نوشتم اما یه مشکل کوچولو داره و اون اینه که وقتی اسکرول انجام میشه تصویر کشیده میشه و درست نشون داده نمیشه ، برای حل مشکل اول اومدم و بعد از هر بار اسکرول یک بار picturebox رو refresh کردم اما اون جوری هم تصویر تیکه تیکه نمایش داده میشه ، شما راه بهتری برای حل مشکل سراغ ندارین ؟؟؟

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
//check point
if (panel1.HorizontalScroll.Value + 60 < e.X)
if (vertical_scroll-1 < this.pictureBox1.Width)
horizontal_scroll ++;
if (panel1.VerticalScroll.Value + 60 < e.Y)
if (vertical_scroll-1 < this.pictureBox1.Height)
vertical_scroll++;
//
if (panel1.HorizontalScroll.Value + panel1.Width - 60 > e.X)
if (horizontal_scroll > 0)
horizontal_scroll--;
if (panel1.VerticalScroll.Value + panel1.Height - 60 > e.Y)
if (vertical_scroll > 0)
vertical_scroll--;
//
//
if (horizontal_scroll > 0 && horizontal_scroll < this.pictureBox1.Width)
this.panel1.HorizontalScroll.Value = horizontal_scroll;

if (vertical_scroll > 0 && vertical_scroll < this.pictureBox1.Height)
this.panel1.VerticalScroll.Value = vertical_scroll;

}

hamid_isf_1360
جمعه 23 شهریور 1386, 01:10 صبح
شما باید فوکوس را به پانل ببرید مثلا با روش زیر



private void pictureBox2_MouseMove(object sender, MouseEventArgs e)
{
panel1.Focus();
{

مهدی رحیم زاده
جمعه 23 شهریور 1386, 08:19 صبح
برای حل مشکل اول اومدم و بعد از هر بار اسکرول یک بار picturebox رو refresh کردم اما اون جوری هم تصویر تیکه تیکه نمایش داده میشه ، شما راه بهتری برای حل مشکل سراغ ندارین ؟؟؟


شما باید فوکوس را به پانل ببرید مثلا با روش زیر

کد:
private void pictureBox2_MouseMove(object sender, MouseEventArgs e)
{
panel1.Focus();
{
راستش با Focus درست نشد ، اما من اومدم توی اولین خط رویداد MouseMove از refresh استفاده کردم ، لرزش خیلی کم شده اما بازم لرزش داره که موقع کار زیاد چشم رو اذیت می کنه و موجب کسل شدن میشه ، اگر کسی راهی میدونه که بدون هیچ لرزشی این مشکل رو بر طرف کنم ، لطف کنه و پیشنهاد بده ، یا راهنمایی کنه ....

ممنون از همه

arash1718
جمعه 23 شهریور 1386, 12:46 عصر
دوست عززیز من همچین مشکلی داشتم قبلا و اونجا از توابع گرافیکی استفاده می کردم ، مشکل از panel فکر می کنم باشه. من مشکل این حالت که به اصطلاح به آن لگ زدن میگن رو با عوض کردن کنترل های panel با picturebox حل کردم.

مهدی رحیم زاده
جمعه 23 شهریور 1386, 13:28 عصر
راستش من درست متوجه نشدم شما چی می گید ، میشه بیشتر توضیح بدین ...