PDA

View Full Version : سوال: ساخت یک navigator



es.es.es
سه شنبه 07 آذر 1391, 12:18 عصر
سلام دوستان
من میخوام یه مسیری روی فرمم داشته باشم و یه کنترل مثل باتن روی این مسیر باشه و با دکمه های بالا پایین و چپ و راست هدایتش کنم البته اینجاشو مشکل ندارم فقط میخوام نمیدونم چطوری باید اون مسیرو بسازم که کنترلم از اون بیرون نزنه

es.es.es
سه شنبه 07 آذر 1391, 13:04 عصر
کسی نبود جواب مارو بده

SHD.NET
سه شنبه 07 آذر 1391, 16:43 عصر
دوست عزیز فک کنم این تاپیک پاسخ شما رو بده . ولی این یه Picturebox هستش که محدودیتش تو پنله .
یعنی شما می تونی picture رو با دکمه ها هدایتش کنی و از پنل بیرون نره . البته مربوط به vb.net هستش که خودت یکم روش کارکنی راحت می تونی تبدیلش کنی .

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

مشاهده تاپبک (http://barnamenevis.org/showthread.php?370096-%D8%AE%D8%A7%D8%B1%D8%AC-%D9%86%D8%B4%D8%AF%D9%86-%D8%B9%DA%A9%D8%B3-%D8%A7%D8%B2-%DA%A9%D8%A7%D8%AF%D8%B1-%D9%BE%D9%86%D9%84-%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C%DB%8C-%D8%9F)

:چشمک:\\\موفق باشید///:چشمک:

es.es.es
سه شنبه 07 آذر 1391, 18:11 عصر
ممنون از شما ولی من منظورم این نبود من میخوام داخل همین پنل یه مسیر داشته باشم حالا این مسیرا میتونن Line باشن من میخوام همین picture box روی اون خط ها بمونه یه چیزی تقریبا مثل بازی هزار راه مثلا چندتا خط به هم وصل باشه مثل خط لوله بعد شی ما فقط روی اونا حرکت کنه
ممنون

SHD.NET
سه شنبه 07 آذر 1391, 18:28 عصر
الان یه سورس مینویسم براتو میذارم

es.es.es
سه شنبه 07 آذر 1391, 19:47 عصر
ممنون میشم ازتون لطفا با سی شارپ بنویسید البته الگوریتم رو هم بگید کافیه

plus
سه شنبه 07 آذر 1391, 20:27 عصر
اگه با مفهوم Region آشنایی داشته باشید میتونید با Region این کار رو بکنید.یک دکمه توی فرم درست کنید، مشخصه KeyPreview اون رو True کنید و :


Region movingRegion;
public Form1()
{
InitializeComponent();
button1.Width = 20;
button1.Height = 20;
movingRegion = new Region(new Rectangle(10, 10, 50, 200));
movingRegion.Union(new Rectangle(10, 210, 100, 50));
button1.Location = new Point(10, 10);
}

~Form1()
{
if (movingRegion != null)
movingRegion.Dispose();
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
int movePixelCount = 5;
Point newLocation = button1.Location;
switch (e.KeyCode)
{
case Keys.Up:
newLocation.Y -= movePixelCount;
break;
case Keys.Down:
newLocation.Y += movePixelCount;
break;
case Keys.Left:
newLocation.X -= movePixelCount;
break;
case Keys.Right:
newLocation.X += movePixelCount;
break;
}
TryMove(newLocation);
}

private void TryMove(Point Location)
{
if (Location != button1.Location)
{
Rectangle newRectangle = new Rectangle(Location, button1.Size);
using (Region complimentRegion = movingRegion.Clone())
{
complimentRegion.Complement(newRectangle);
using (Graphics graphics = CreateGraphics())
{
if (complimentRegion.IsEmpty(graphics))
{
button1.Location = Location;
}
else
{
System.Media.SystemSounds.Beep.Play();
}
}
}
}
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
using (Region paintRegion = new Region(ClientRectangle))
{
paintRegion.Intersect(movingRegion);
paintRegion.Intersect(e.ClipRectangle);
using (SolidBrush brush = new SolidBrush(Color.Red))
e.Graphics.FillRegion(brush, paintRegion);
}
}


در سازنده فرم، اندازه دکمه 20 در 20 میشه، و یک Region به شکل L با استفاده از دو چهار ضلعی ساخته میشه و محل اولیه دکمه در جایی داخل Region تعیین میشه.
در رویداد KeyDown فرم، بسته به اینکه چه کلیدی ای فشار داده شده محل جدید دکمه محاسبه میشه و به تابع TryMove فرستاده میشه.
تابع TryMove، بررسی میشه که آیا اگه دکمه در محل جدید قرار بگیره از Region خارج میشه یا نه.این شرط با Compliment کردن (اگه اشتباه نکنم معنیش مکمل میشه) Region با محل جدید دکمه چک میشه. اگه حاصل این مکمل خالی باشه یعنی محل جدید کاملا داخل Region هست و دکمه به محل جدید برده میشه.
در رویداد Paint فرم هم، Region روی فرم رسم میشه تا کاربر اونو ببینه.
در ضمن System.Drawing رو به namespace ها اضافه کنید.
سوالی بود در خدمتم.

es.es.es
سه شنبه 07 آذر 1391, 21:35 عصر
فوق العاده ممنونم فقط اگه میشه یکم درباره region توضیح بدید چون اصلا نمیدونم چیه
البته چند تا سوال دیگم هست

plus
سه شنبه 07 آذر 1391, 21:44 عصر
Region به معنی ناحیه هست و یک ناحیه رو مشخص میکنه که این ناحیه به هر شکلی میتونه باشه و لزوما چهار ضلعی نیست.اگه شما میخواستن اون دکمه رو فقط توی یک محیط چهار ضلعی محدود کنید نیازی به Region نبود و با یک Rectangle (چهار ضلعی) کار میکردین.ولی حالا که میخوایین محدوده شما یک محدوده نا منظم باشه، باید محیط نامنظمی رو تعریف کنید و برای این کار از Region استفاده میشه که میتونی هر شکلی داشته باشه.

es.es.es
پنج شنبه 09 آذر 1391, 00:17 صبح
آقا یکم این کده گیحم کرد اول بگم این ارورو واسه همه اون حاهایی که MoingRegion رو نوشتیم میده
Error 1 The name 'movingRegion' does not exist in the current context
اما چند تا سوال
1_ این شکل L کجا درست میشه؟
2-
~Form1()
{ if (movingRegion != null)
movingRegion.Dispose();
}

این قسمت چیه و این form1~ چیه
3-این قسمت
using (Region complimentRegion = movingRegion.Clone())
{ complimentRegion.Complement(newRectangle);
using (Graphics graphics = CreateGraphics())

دقیقا چطوری میفهمه که اون شی تو region هست یا نه
4-این قسمت paint رو هم اصلا نمیدونم چیه اگر میشه کارشو توضیح بدید
ببخشید زیاد شد شرمنده:گریه:
ممنون میشم جواب بدید
راستی button هم keypreview نداره

plus
پنج شنبه 09 آذر 1391, 00:32 صبح
کد رو اصلاح کردم خط اولش کپی نشده بود. شما باید متغیر movingRegion رو در کلاس فرم به صورت سراسری تعریف کنید:


Region movingRegion;


شکل L در سازنده فرم با استفاده از دو تا چهار ضلعی ساخته میشه :


movingRegion = new Region(new Rectangle(10, 10, 50, 200));

movingRegion.Union(new Rectangle(10, 210, 100, 50));

به متد Form~، در برنامه نویسی شی گرا Destructor گفته میشه. این متد زمانی فراخوانی میشه که کلاس Form کارش تموم بشه.ازونجا که متغیر movingRegion فضا میگیره من توی Destrcutor فرم فضای اون رو آزاد کردم. (البته با توجه به مدیریت خود #C شاید نیازی به این قسمت نیست.

در مورد اینکه چطوری متوجه میشه داخل اون هست یا نه.اینطوری مثال میزنم که شما اگه دو مجموعه داشته باشی:


A = {1, 2, 3, 4, 6, 7}
B = {3, 4, 9}

مکمل یا Compliment مجموعه A نسبت به B میشه اون عضو هایی از B که در A نیستند:


A.Compliment(B) = {9}

حالا اگه حاصل این مکمل خالی باشه، میتونی نتیجه بگیری که B کاملا در A است...
خوب حالا این مثال رو تعمیم بدین به برنامه ما. در این برنامه Region ما A و محل جدید دکمه، B هست...با مکمل گیری از Region نسبت به محل جدید و بررسی خالی بودنش میفهیمیم محل جدید کاملا در Region هست یا نه.
Paint هم برای نمایش Region روی فرم هست..توضیح Paint از این بحث و حوصله من خارجه :-D
در ضمن من KeyPreview فرم رو گفتم True کنید نه دکمه رو.

es.es.es
پنج شنبه 09 آذر 1391, 13:50 عصر
یعنی این union یه مستطیل به region اضافه میکنه درسته؟
ممنون البته نمیدونم چرا button حرکت نمیکنه ولی جاش lable گذاشتم درست شد
فقط یه سوال دیگه چون این برنامه نویگیتوره باید قابلیت نویگیت داشته باشه یعنی میخوام مختصات شی رو هم داشته باشیم مثلا میخوام بگم هرجایی هست بره به ابتدا یا انتها

plus
پنج شنبه 09 آذر 1391, 14:54 عصر
یعنی این union یه مستطیل به region اضافه میکنه درسته؟
ممنون البته نمیدونم چرا button حرکت نمیکنه ولی جاش lable گذاشتم درست شد
فقط یه سوال دیگه چون این برنامه نویگیتوره باید قابلیت نویگیت داشته باشه یعنی میخوام مختصات شی رو هم داشته باشیم مثلا میخوام بگم هرجایی هست بره به ابتدا یا انتها

بله ابتدا یک Region به شکل مستطیل درست میشه و در خط بعد یه مستطیل دیگه به Region اضافه میشه.
من دکمه گذاشتم کار میکرد نمیدونم!! مطمئینید KeyPreview فرم رو True کردین؟
مختصات شی رو که با استفاده از مشخصه Left و Top اون میتونید نسبت به بالا-چپ فرم داشته باشید...اما ازونجا که توی این مثال نقطه شروع Region در (10و 10) هست، اگه مختصات رو نسبت به بالا چپ Region بخوایین باید Top و Left رو 10 کم کنید...
به صورت کلی برای Region ابتدا و انتها معنی نداره، ولی اگه مختصات خاصی مد نظرتون هست که بره، با متد TryMove میتونین مختصات رو (که باز بر اساس بالا چپ فرم هست) تعیین کنید.
کلا شما برای اینکه به چیزی که میخوای برسی، باید با این اشیا کار کنی تا خودت مسلط بشی...

es.es.es
جمعه 10 آذر 1391, 00:03 صبح
ممنونم خیلی ممونم هر چی اینترنت رو گشتم چیزی در این باره پیدا نکردم با اینکه ترم آخرم فوق دیپلمم اصلا نمیدونستم region چیه (دانشگاه داریم( ممنون که کمک کردید شاید به درد کسای دیگه هم بخوره
بازم ممنون

plus
جمعه 10 آذر 1391, 02:22 صبح
خواهش میکنم