PDA

View Full Version : حرکت دادن اشیا در زمان اجرای برنامه



kiani.mehdi
جمعه 21 اردیبهشت 1386, 22:29 عصر
سلام به همگی راستش اول یه عذر خواهی بکنم از اینکه چند وقته مطلب ننوشتم ، ترم آخری ها میدونن چی میگم ، پروژه و هزار دربدری دیگه تقاضا های زیادی در مورد آموزش سی شارپ داشتم ، عده ای آموزش از ابتدا و عده ای هم خواستار آموزش نکته ویا حالا موردی را داشتند سعی می کنم که رضایت هردوگروه را به نحوی برآورده کنم
اما مقاله امروز :
حتما تا بحال به این نکته فکر کردین که چه جوری میشه یک کنترل را در زمان اجرای برنامه با موس جابجا کرد
خوب راه حل های متفاوتی ممکن است وجود داشته باشه که یکی از آنها را من امروز براتون میگم
فرض کنید یک دکمه (button) روی فرم دارید ،که می خواین اونو در زمان اجرای برنامه مثل زمان طراحی به راحتی تکان دهید
برای این عمل بایستی از سه رویداد مربوط به موس برای دکمه کمک بگیرین

ابتدا سه متغیر در کلاس به صورت زیر تعریف کنید

int yPosition;
bool isDraged;
می دونید که چون این متغیر ها یا بهتر بگم فیلد ها (چون به متغیر ها در کلاس فیلد و و به توابع متد میگن) در کلاس تعریف شدند ، پس مقادیر اولیه انها به صورت زیر است

xPosition =yPosition =0;
isDreaged=false;

حال اگه به شکل زیر توجه کنین ، متوجه همه چیز خواهید شد،برای انکه دکمه زا از حالت 1 به حالت 2 تغییر مکان بدین باید اونو به اندازه (پاره خط قرمز رنگ) در راستای محور X ها و به اندازه (پاره خط آبی رنگ ) در راستای محور y ها تغیر مکان دهید.
http://www.geocities.com/mb.kiani/btnMoveable.gif

پس بایستی برای جابجا کردن دکمه در رویداد mouseMove مربوط به دکمه این دو مقدار یعنی طول پاره خط های قرمز و آبی رنگ را بدست اورده و به ترتیب با خواص left و top مربوط به دکمه جمع کنید

برای محاسبه این مقادیر به صورت زیر عمل کنید
ابتدا در رویداد mouseDown محلی را که دکمه کلیک شده است بدست آورده و مختصات x و y را به ترتیب به متغیر های xPosition و yPosition نسبت دهید
در واقع در رویداد mousedown بایستی کدهای زیر را بنویسید


private void btnMoveable_MouseDown(object sender, MouseEventArgs e)
{
this.Cursor = Cursors.SizeAll;
xPosition = e.X;
yPosition = e.Y;
isDraged = true;
}
دوخط اول کدهای فوق مختصات x و y کرسر را در متغیر های xPosition و yPosition ذخیره می کند
کاربرد کد خط سوم را کمی بعد توضیح می دهم
و خط آخر هم که شکل کرسر را به شکل sizeAll در آورده که در اعمال درگ کردن معمولا آن را مشاهده کرده اید



حال در رویداد mouseMove کدهای زیر را بنویسید private void btnMoveable_MouseMove(object sender, MouseEventArgs e)
{
if (isDraged)
{

btnMoveable.Left = btnMoveable.Left + e.X - xPosition;
btnMoveable.Top = btnMoveable.Top + e.Y - yPosition;

}
}
درکدهای بالا مقادیر e.X – xposition و e.Y – yposition به ترتیب طول پاره خط های قرمز رنگ و آبی رنگ هستند

واما کاربرد متغیر isDreaged

حتما حدس زده اید که از این متغیر به چه منظور استفاده شده است ، بله درست حدس زدید، از این متغیر بدین منظور استفاده کردم که وقتی اجازه حرکت دادن دکمه را داریم که دکمه فشرده شده است و نگه داشته است . برای همین امر در رویداد mouseDown که در بالا دیدید مقدار متغیر isdfreaged را true کردم و در رویداد mouseMove چک کردم که اگر متغیر true است ،(یعنی اگر دکمه فشرده شده است ) مختصات جدید دکمه را بدست بیاور.

اخرین عملی که باید انجام دهید ،این است که مشخص کنید که چه زمانی عمل انتقال تمام شده است ،بله در هنگامی که دست خود را از روی موس بر می داریم ، یعنی رویداد mouseup
پس در رویداد mouseUp بایستی مقدار متغیر isDraged را true کنیم


private void btnMoveable_MouseUp(object sender, MouseEventArgs e)
{
isDraged = false;
this.Cursor = Cursors.Default;

}
خط دوم کد برای این است که شکل کرسر را به حالت پیش فرض درآورد


*امیدوارم که توضیحات کانل بوده باشه و متوجه همه چیز شده باشین
* اگر سوالی در مورد این مطلب دارین میتونین بپرسین
* این روش برای تمامی آبجکت هایی که دارای سه رویداد فوق می باشند قابل پیاده سازی است
* همان طور که در اول مطلب توضیح دادم ، به روش های مختلفی می توان این کار را انجام داد ، این یکی از روشهایی بود که من گفتم
* اگر خواستید کد را کامل تر کنید بایستی آن را طوری تغییر دهید که محدوده حرکت دکمه را نیز کنترل کند(این عمل که کار فوق الاده آسانی هم هست به عهده خودتان)
* btnMoveable نام دکمه ایست که روی فرم قرار دارد و قرار است انتقال یابد

سورس کامل و دموی برنامه را هم میتونین از اینجا (http://www.esnips.com/doc/b7db6504-ccc0-4958-9875-7c7d881645c5/runtimeMoveableControls)دانلود کنید

kiani.mehdi
جمعه 21 اردیبهشت 1386, 22:56 عصر
نمی دونم چرا این فونت درست نمیشه؟ من مطالب را copy و paste کردم
دوستان مطالب را بدون [Font=Arial] بخونن
یا مدیر محترم لطف کنن و یه فکری به حال این موضوع بکنه

linux
جمعه 21 اردیبهشت 1386, 23:53 عصر
نمی دونم چرا این فونت درست نمیشه؟ من مطالب را copy و paste کردم
دوستان مطالب را بدون [Font=Arial] بخونن
یا مدیر محترم لطف کنن و یه فکری به حال این موضوع بکنه
این قسمت ها را هم نگاه کن
http://msdn.microsoft.com/msdnmag/issues/04/12/CustomFormsDesigner/default.aspx

choobin84
شنبه 22 اردیبهشت 1386, 06:33 صبح
فونت درست نمیشه ، چون شما از داخل ورد
word
دارید مطالب را کپی می کنید.
مایکروسافت ورد بر روی کلماتی که در آن درج می شود افکت هایی هم میذاره . مثلا نوع فونت ، اندازه ، رنگ و... که شما این مطلب را فراموش کرده اید.
یک پیشنهاد ، مطالبتان را به نت پد
notepad
انتقال دهید و از آنجا در این محل کپی کنید

Keramatifar
شنبه 22 اردیبهشت 1386, 12:58 عصر
سلام دوست عزیز
یه نگاهی به کامپوننت DockableObject از مجموعه کامپوننتهای تلریک بنداز

kiani.mehdi
چهارشنبه 26 اردیبهشت 1386, 00:17 صبح
اگه خوب دقت کنید من عرض کردم که روش هی مختلفی برای این عمل وجود دارند
یکی از کاربرد های این کد برای حرکت دادن فرم هایی هستند که خاصیت formBorderStyle آنها None است
البته برای عمل فوق می توان از override کردن تابع wndproc نیز استفاده کرد
اگه خواستین تا کدش را براتون بذارم