نحوه ایحاد فرم
و کنترل های غیر مستطیلی شکل(None Rectangle Forms and controls )
شاید شما هم جزء آن دسته از برنامه نویسانی
باشید که دوست دارند توی برنامشان از فرم ها و کنترل هایی غیر مسطیلی شکل
استفاده کنند قصد دارم توی این مقاله شما را با نحوه ایجاد چنین مورد هایی
آشنا کنم.
تا حالا شاید برنامه هایی زیادی را
دیده باشید که با شکلای عجیب غریب فرم هاشون شما را متعجب کرده باشند ،یا
اینکه نیاز پیدا کرده باشید که فرم یا کنترلی توی برنامتان استفاده کنید که
شکلش فقط مستطیلی نباشد به عنوان مثال یک Button گرد یا فرمی به شکل بیضی
یا ...
اما چطور می شود فرم یا کنترل غیر
مسطیلی را در #C بوجود آورد ،اگر تجربه برنامه نویسی با زبان های قدیمی
تری مثل VB یا ++C را داشته باشد شاید بدونید که توی این زبان ها ایجاد
چنین فرم و کنترل هایی یکم سخته و مثلا باید از API های ویندوز استفاده
کنید ولی اصلا نگران نباشید چون توی #C هم این کار آسونه و هم کاربردی و
نیاز به درگیر شدن با چیزی غیر از امکانات زبان #C را ندارد و از همه
مهمتر بار اضافی هم روی سیتم نمی آورد.
هر فرم یا کنترلی (کنترل استاندارد
یا کنترل کاربر) شامل یک ناحیه کاری می شود که ناحیه کاری یک فرم یا کنترل
، در NET. در خاصیت Region فرم یا کنترل می باشد .برای آن که شکل فرم یا
کنترل را تغییر دهیم کافی است که ناحیه کاری آن را تغییر دهیم.بنابراین
باید مقدار خاصیت Region آن را تغییر دهیم خاصیت Region از نوع کلاس Region
می باشد که یکی از کلاس های فضای نام
System.Drawing می باشد. یکی از ویژگی های این کلاس این است که
سازنده ای دارد که پارامتری از نوع کلاس GraphicsPath را می پذیرد.
GraphicsPath
:کلاسی از فضای نام
System.Drawing.Drawing2D است که در ترسیمات 2 بعدی استفاده می شود و
مسیری گرافیکی را در خود نگه می دارد و مورد استفاده کلاس های گرافیکی دیگر
است .کاربردی که این کلاس دارد این است که می تواند شکلی را که ما می
خواهیم به فرم منتقل کنیم را می توانیم در شی از نوع این کلاس ترسم و
نگهداری نماییم. این
کلاس دارای متد هایی زیادی برای ترسیم انواع و اقسام اشکال می باشد و خاصیت
های جالبی در اجتماع گرفتن از آنها دارد.
گام های
ایجاد فرمی غیر بیضوی
1.ابتدا شی ای از کلاس GraphicsPath ایجاد می
کنیم.(نامش را mypath گذاشتیم)
System.Drawing.Drawing2D.GraphicsPath mypath =
new
System.Drawing.Drawing2D.GraphicsPath();
2.شکلی
را که می خواهیم فرم به خود بگیرد را به کمک متد های ترسم آن در mypath رسم
نماییم .(در اینجا بیضی).
mypath.AddEllipse(0, 0, 400, 300);
پارامتر اول و دوم نقطه شروع (x,y) و پارامتر
سوم و چهارم عرض و ارتفاع
بیضی می باشد.
نکته :این کلاس دارای متد های دیگری
برای ترسیم اشکال دیگر می باشد

نکته :تمام اشکال به مسیر گرافیکی اضافه
می شود و این اشکال به هم متصل می شوند بنابراین می توان ترکیب های شکلی
جالبی با آن بوجود آورد .
3.حال باید شی ای از نوع کلاس
Region ایجاد و سپس با سازنده ای که
مقداری از نوع کلاس
GraphicsPath
را می پذیرد آن را مقدار دهی نمود
System.Drawing.Region
MyFormRegion = new System.Drawing.Region(mypath);
4.خاصیت Region
فرم را با ناحیه ایجاد شده (MyFormRegion)
مقدار دهی کنیم.
this.Region = MyFormRegion;
می توانیم کدهای 1تا 4 را در رویداد Load فرم
قرار دهیم تا به محض لود شدن فرم شکل آن تغییر کند بنابراین کل کد به صورت
یکجا به شکل زیر می باشد.
private void Form1_Load(object sender, EventArgs e)
{
System.Drawing.Drawing2D.GraphicsPath mypath =
new
System.Drawing.Drawing2D.GraphicsPath();
mypath.AddEllipse(0, 0, 400, 300);
System.Drawing.Region MyFormRegion =
new System.Drawing.Region(mypath);
this.Region = MyFormRegion;
}
از نکات جالب کلاس
GraphicsPath پذیرش متن می باشد بنابراین شما می توانید یک متن را
به عنوان ناحیه کاری قرار دهید که نهایتا شکل فرمتان به شکل آن متن در می
آید.
(به وسیله متد AddString می توانید متن را
اضافه نمایید).
نکته :همین کار را می توانید برای هر نوع کنترل
دیگری استفاده کنید مثلا برای گرد کردن Button
از کد زیر استفاده کنید.
private void Form1_Load(object sender, EventArgs e)
{
button1.Width = 75;
button1.Height = 75;
System.Drawing.Drawing2D.GraphicsPath mypath =
new
System.Drawing.Drawing2D.GraphicsPath();
mypath.AddEllipse(3, 3, 68, 68);
System.Drawing.Region MyButtonRegion =
new System.Drawing.Region(mypath);
button1.Region = MyButtonRegion;
}
و با قرار دادن یک تصویر (به شکل دایره ای 3
بعدی )برای خاصیت BackgroundImage دکمه به آن جلوه دایره ای 3 بعدی دهید.
.jpg)
نکته :اگر می خواهید که button با قرار گرفتن
ماوس بر روی آن و کلیک بر روی آن شکلش تغییر کند می بایست برای رویداد
MouseHover (هر گاه ماوس بر روی دکمه قرار دارد) و رویداد MouseLeave
(موقعی که ماوس از روی دکمه کنار رود)و MouseDown و MouseUp آن ، کدی برای
تغییر شکل/تصوی قرار دهید که در مقاله ای پیرامون ایجاد UserControl آن را
شرح خواهیم داد.