PDA

View Full Version : سوال: اشکال (Shap) در Visual Studio 2010



AlgorithmX
چهارشنبه 25 خرداد 1390, 15:51 عصر
سلام!
سوالی داشتم که چطوری میشه از اشکالی مانند: دایره، مربع، خط ، .. در فرممون استفاده کنیم؟! و براشوم برنامه بنویسیم. به طور مثال یک شکل مربع گوشه گرد رو رنگی کنیم و برای رویداد کلیک اون برنامه بنویسیم (یک دکمه بسازیم) و بهش بگیم هر وقت موس اومد روش رنگش عوضشه!

در 30# ابزاری با نام Visual Basic PowerPacks وجود داره که این اشکال رو در بر می گیره ولی اسم اون ربطی به 30# نداره و کارکردن با اون و رویدادهاش کار یکم مشکلیه!

آیا ابزار دیگری که مال خود 30 شارپ باشه نمی شناسید؟؟

Programmer 1
پنج شنبه 26 خرداد 1390, 01:57 صبح
در مورد Visual Basic Powerpack بیشتر بدانید (http://www.persiadevelopers.com/articles/power-pack.aspx)

البته اگر میخواهید خودتون یک کنترل گرافیکی طراحی کنید از روش زیر استفاده کنید: خواستم فقط لینک بدم ولی حیفم اومد گفتم بقیه دوستان هم استفاده کنن:

یکی ویژگیهای جالب زبان های NET. این است که برنامه نویس می تواند با استفاده از امکاناتی که این زبان ها و IDE آن فراهم کرده اند کنترل هایی سفارشی برای خود بوجود آورد که شاید در وحله اول سوالی را در ذهن بوجود بیاورد و آن این است که آیا کنترل های استانداردی که Visual Studio در ToolBox قرار داده است (یا حتی آنهای که خودمان می توانیم به Toolbox اضافه کنیم ) برای توسعه نرم افزار کافی نیستند و چه لزومی دارد که برنامه نویس خود به تهیه کنترل های جدید بپردازد؟

در جواب این سوال می توان موارد زیر را برشمرد.

راحت تر کردن کار برنامه نویس انتهایی
ایجاد رابط کاربری مناسب تر
عدم وجود یک Control در زمینه خاص و طراحی آن
کاهش خطا ها و مدیریت راحت تر خطا ها
بخش بندی نمودن پیاده سازی نرم افزار و کار گروهی روی آن
افزایش سرعت توسعه نرم افزار
ناقص بودن کنترل های موجود در زمینه ایی که نیاز است و اصلاح آن
استفاده مجدد
راحت کردن کار برنامه نویس انتهایی از آن حیث که بخشی از برنامه قبلا در قالب کنترل پیاده شده است.و نیازی به پیاده سازی مجدد نیست
ایجاد رابط کاربری مناسب تر به آن جهت که برنامه نویس می تواند با توجه به ویژگیهای نرم افزار و کاربران کنترل هایی راحت تر و یا مفید تر طراحی و در برنامه به کار ببرد.
شاید کنترلی برای مورد خاصی که ما می خواهیم موجود نباشد پس باید خودمان آن را طراحی نماییم.
از آنجا که استفاده از کنترل هایی که قبلا به صورت مجزا طراحی پیاده سازی و تست شده اند باعث کاهش کد می شود و همچنین پیچیدگی کد ها را کاهش می دهد باعث کاهش خطا می شود
از آنجا که ایجاد کنترل ها بخشی از پیاده سازی برنامه است و می توان آن را مجزا و به فرد یا تیمی از برنامه نویسان داد .
بعد از گذشت زمان برنامه نویس یا شرکت دارای بانکی از کنترل ها خواهد بود که با گرفتن پروژه جدید دیگر لزومی ندارد همه چیز از ابتدا پیاده سازی شود و با استفاده از کنترل های موجود روند توسعه نرم افزار برای آن سریعتر می شود .
گاهی اوقات کنترل های موجود دارای نقص بوده یا تمام نیاز ها را برآورده نمی کند که باید مجددا طراحی یا اصلاح شود.

نکته :از آنجا که یک UserControl یک کلاس می باشد پس آشنایی با مفاهیم شی گرایی و طریقه پیاده سازی آن برای ایجاد UserControl لازم می باشد.

اجزاء و ویژگیهای یک کنترل :
خصوصیات (Properties ):اگر به کنترل های استاندارد موجود توجه کنید خواهید دید که هر کدام دارای خاصیت هایی است که شما با استفاده از آن ها رفتار کنترل را مدیریت کرده و به وضعیت کنترل پی می برید برای مثال خاصیت Enable کنترل Timer و خاصیت Text کنترل TextBox .
رویداد ها (Events):هر کنترل دارای رویداد هایی است که با تغییری در حالت درونی کنترل اتفاق می افتد و شما می توانید با استفاده از آنها کد هایی را در هنگام رویداد خاصی به اجرا در آورید .مانند رویداد Click کنترل Button.
متد ها (Methods):می توان متد هایی را برای کنترل بوجود آورد مانند متد متد Select در کنترل TextBox که قسمتی از متن آن را Highlight می کند.
فیلد ها :هر چند در طراحی کنترل معمولا به صورت مستقیم فیلد ها را در دسترس قرار نمی دهند و با استفاده از Properties فیلد ها را کپسوله می کنند ولی می توان فیلد هایی را به صورت Public در اختیار برنامه نویس قرار داد.

ایجا UserControl باید در دو مرحله طراحی و پیاده سازی شود

1.زمان اجرا :موقعی که برنامه نهایی که کنترل بر روی آن قرار دارد، اجرا می شود.

2.زمان طراحی رابط کاربری :زمانی که برنامه نویس کنترل را روی فرم انتقال داده و خواص آن را تنظیم می کند.

برای روشن شدن موضوع کنترل picturebox را در نظر بگیرید این کنترل در هنگام طراحی رابط کاربری، روی فرم قرار می گیرد و در گوشه بالا سمت راست آن یک مثلث ریز مشکی وجود دارد که با کلیک بر روی آن دیالوگی ظاهر شده که می توان برخی خواص عمومی این کنترل را مثل انتخاب تصویر و نوع نمایش تصویر در کادر و.. را به صورت مستقیم مشخص نمود همچنین تغییرات انجام شده بلافاصله نمایش داده می شود پس حتما کد یا تگ های تنظیمی خاصی برای نمایش این ویژگیها در این کنترل لحاظ شده است.

در ادامه قصد داریم تا طریقه طراحی یک کنترل را که پیاده سازی هر دو مرحله آن لازم است را برسی نماییم.

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

1.طرح مسئله :

باید مسئله ای پیش آمده باشد که ما برای حل آن اقدام به طراحی کنترل کرده باشیم . در اینجا در حال ایجاد یک نرم افزار برای کاربردی خاص هستیم که جذابیت رابط کاربری آن اهمیت زیادی دارد (به عنوان مثال نرم افزاری برای کودکان یا یک نرم افزار چند رسانه ای (multimedia) که محاسبات و بانک اطلاعاتی نیز دارد و نمی توان آن را با استفاده از نرم افزار های ساخت مالتی مدیا ایجاد نمود ) یکی از ویژگیهای چنین رابط های کاربری دکمه های 3 وضعیته گرافیکی با اشکال متفاوت است که بی شک برای پدید آوردن چنین واسط هایی وجودشان لزومی است.

2.امکان سنجی و حل مسئله :

با توجه به طرح مسئله متوجه می شویم که به وجود یک کنترل احتیاج داریم که تمام امکانات یک Button را داشته باشد ، چون می دانیم که ایجاد کنترل در C# امکان پذیر است و کار شق القمری هم که نیست پس می توان آن را انجام داد (تجربی—یواش یواش یاد می گیرید)بعلاوه اینکه امکانات یک Button را داشته باشد باید امکانات زیر را نیز داشته باشد:

جنبه های زمان اجرا:
شکل Button قابل تغییر باشد (مستطیلی ،دایره ای ،بیضوی ،لوزی و مستطیل گوش گرد)
در حالت عادی Button یک تصویر را بر روی خود نشان دهد (حالت Top)
با قرار گرفتن اشاره گر ماوس بر روی آن تصویر روی Button تغییر کند (حالت OnMouse)،با ترک کردن محیط کنترل توسط اشاره گر ماوس تصویر مجددا به حالت عادی بر گردد (حالت Top)
با کلیک کردن بر روی آن تصویر تغییر کند و با پایان کلیک تصویر به حالت OnMouse بر گردد.

جنبه های زمان طراحی :
بتوان تصاویر 3 وضعیت کنترل را مشخص نمود (و در زمان اجرا)
بتوان شکل کنترل را مشخص نمود (و در زمان اجرا )
اگر شکلی نیاز به تنظیمات دارد تنظیمات را نیز بتوان تغییر داد و نتایجش را دید.
در هنگام طراحی واسط کاربری با تغییر شکل آن تغییر دیده شود .
با تغییر سایز کنترل در زمان طراحی شکل آن به همان نسبت تغییر کند و تغییرات دیده شود .

نکته :جنبه های زمان طراحی را برای آن لحاظ می کنیم تا در هنگام طراحی واسط کاربری برنامه نویس نهایی به راحتی بتواند بدون اجرا برنامه کنترل را با اندازه و شکل مناسب سر جایش قرار دهد.

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

نکته :برای پیاده سازی نیاز به استفاده از برخی کلاس ها +GDIخواهیم داشت برای آشنایی با +GDI به مجموعه مقالات مروری بر GDI+ نوشته خودم مراجعه کنید در همین سایت.

3.پیاده سازی :

برای ایجاد یک UserControl در Visual Studio به دو شکل می توان عمل نمود

1.اگر بخواهیم یک یا چند Usercontrol را به صورت پروژه ای مجزا ایجاد نماییم (فرض کنید به شما به عنوان یک برنامه نویس گفته اند که فقط کنترلی با مشخصات x برای ما طراحی کن) که در اینصورت از New Project در زیر مجموعه C# گزینه Windows Forms Control Library را انتخاب تا پروژه ای مجزا ایجاد شود که حاثل آن بعد از کامپایل یک فایل DLL می شود که با اضافه کردن آن به ToolBox برنامه نویس نهایی می تواند از کنترل های موجود در آن استفاده نمایید.

2.در خلال ایجاد یک نرم افزار که خود یک Project یا Solution است به این صورت که از منو project گزینه Add User Control… را انتخاب نمایید و نامی را برای کنترل مشخص کنید. که با Build کردن پروژه usercontrol ایجاد شده و به صورت توماتیک در toolbox قرار می گیرد.وبراحتی می توانید آن را بر روی فرم هایتان بکشید .

چون ما در طی ایجاد فرضی یک نرم افزار هستیم و می خواهیم آن را آزمایش نیز بکنیم از روش دوم استفاده می کنیم ولی می توانیم با پایان یافتن کار کد آن را کپی نموده با ایجاد پروژه ای از نوع 1 و قرارا دادن کد در آن یک control به فرم dll داشته باشیم تا برنامه های بعدیمات بتوان از آن استفاده کنیم

نکته :یکی از مزیت های روش دوم در این است که dll کنترل ایجاد نشده پس افراد دیگر نم توانند از کنترل ما استفاده نمایند.و کد آن در فایل EXE برنامه ادغام می شود.

مراحل پیاده سازی :

1.پروژه ای جدید ایجاد نموده و سپس به روش 2 در آن یکUserControlایجاد می کنیم .

مراحل طراحی usercontrol نیز شامل طراحی رابط کاربری و کد می باشد که می توان با کشیدن کنترل های استاندارد یا Usercontrolهای دیگر آن را انجام داد ولی ما برای ایجاد کنترل دکمه 3 وضعیته نیاز به کنترل دیگری نداریم.

در پنجره Solution explorer کنترل ایجاد شده را انتخاب و با راست کلیک بر روی آن View code را انتخاب کنید تا کد کنترل را ببینید.

گامها :

1.فیلد های محلی برای نگهداری وضعیت کنترل

· در ابتدا یک Enum تعریف می کنیم تا شکل های مختلفی را که دکمه می تواند بگیرد را مشخص کنیم

سه شکل پایه که میتواند 5 شکل گفته شده در طرح مسئله را پوشش دهد 1.بیضی که میتوان دایره را نیز با آن پیاده کرد 2.لوزی 3.مستطیل گوش گرد که می توان با مشخص کردن مقدار صفر گرد شدن گوشه مستطیل نیز بوجود آورد (اگر میزان گرد شدن هر گوشه جداگانه قابل تغییر باشد اشکال جالب دیگری نیز می توان بوجود آورد).در ضمن به خاطر داشته باشد که شکل ابتدایی فرم کنترل مستطیلی است و می توان هیچ کدی را برای تغییر شکل آن به مستطیلی ننوشت.

public enum Shape

{

Ellipse, RoundRectangle, Diamond

};

· تعریف متغییری از نوع انوم Shape که قرار است شکل جاری کنترل را نگه دارد.همچنین نباید به صورت خارجی قابل دسترس باشد پس Private است چون توسط خود متدها و خاصیت ها کنترل استفاده می شود.

private Shape buttonshape;

· تعریف 3 متغییر از نوع تصویر (image از gdi+) برای نگه داری تصاویر 3 وضعیت کنترل که در ابتدا خالی هستند.


private Image topimage=null ;

private Image mouseonimage=null ;

private Image clickimage=null ;


اگر لحظه ای فکر کنید متوجه می شوید که هر شکلی کنترل بگیرد باید اندازه اش به عرض و ارتفاع کنترل باشد و باتوجه به نکته زیر

نکته :با ایجاد یک UserControl کلاس ایجاد شده از کلاس UserControl ارث بری خواهد کرد که بسیاری از موارد پایه ای در این کلاس مثل خاصیت اندازه (size )و تصویر زمینه (BackgroundImage) و رویداد های مختلفی مثل click و هر چه دکمه 3 وضعیته ما بخواهد پیاده سازی شده و عملا کنترل ما نیز آن ها را خواهد داشت.

دیگر لزومی به قرار دادن فیلد هایی برای نگهداری عرض و ارتفاع نیست.

· ولی در مورد مستطیل گوش گرد باید اندازه گرد شدن هر یک از گوشه های آن مشخص شود پس 4 فیلد برای نگهداری آن نیاز است.

//*** roundbutton option**

private float topright=10;

private float topleft=10;

private float downright=10;

private float downleft=10;

2. خاصیت ها (Properties)
اولین خاصیت ،خاصیتی است که بتوان از طریق آن شکل کنترل را تغییر داد یا شکل جاری آن را بدست آورد .این کار را با ست کردن(قرار دادن مقدار) فیلد buttonshape که از نوع shape برای نگهداری شکل کنترل قبلا ایجاد نمودیم برای تغییر شکل و برگرداندن مقدار همین فیلد در هنگامی که شکل جاری کنترل لازم است انجام می دهیم .در هنگام ست کردن شکل کنترل بسته به شکل انتخابی با صدا زدن یکی از متد های تغییر شکل (3 متد برای شکل ها متفاوت)شکل کنترل را تغییر می دهیم.

public Shape ButtonShape

{

get

{

return buttonshape;

}

set

{

buttonshape = value;

switch(value)

{

case Shape.Ellipse:

EllipseButton();

break;

case Shape.Diamond:

DiamondButton();

break;

case Shape.RoundRectangle:

RoundButton();

break;

}

}

}


بعدا در قسمت طراحی متدها,3 متد تغییر شکل را ایجاد می کنیم
در این مرحله باید 3 خاصیت را ایجاد نماییم که تصویر وضعیت های 3 گانه کنترل را بگیرد و در 3 فیلدی که قبلا برای نگهداری تصاویر 3 وضعیت ایجاد نمودیم قرار دهد یا آنها را بازیابی نماید

public Image TopImage

{

get

{

return topimage;

}

set

{

topimage = value;

this.BackgroundImage = value;

}

}

public Image MouseOnImage

{

get

{

return mouseonimage;

}

set

{

mouseonimage = value;

}

}

public Image ClickImage

{

get

{

return clickimage;

}

set

{

clickimage = value;

}

}

نکته :در خاصیت Topimage در set بعد از گرفتن تصویر آن را به عنوان پس زمینه کنترل قرار دادیم تا جنبه طراحی را رعایت کرده باشم و هم اینکه با اجرای برنامه حالت نرمال کنترل با تصویر انتخابی مشخص باشد .
حال 4 خاصیت دیگر لازم داریم تا در مورد شکل مستطیل گوش گرد برنامه نویس در موقع طراحی و اجرا بتواند مقدار گردی گوشه ها را مشخص کند .این خاصیت ها همچنین به ایجاد شکل ها جدید کمک می کند .برای اینکه جنبه های زمان طراحی را نیز لحاظ کرده باشیم (یعنی با تغییر مقدارها شکل نیز در زمان طراحی تغییر کند) در هنگام ست کردن مقدار ،متد Reddraw را صدا می زنیم که این متد شکل کنترل را دوباره ترسم می کند .در ادامه آن را پیاده سازی خواهیم نمود

//***** round rectangle property ****

public float TopRight

{

set

{

topright = value;

Redraw();

}

get

{

return topright ;

}

}

public float TopLeft

{

set

{

topleft = value;

Redraw();

}

get

{

return topleft;

}

}

public float DownRight

{

set

{

downright = value;

Redraw();

}

get

{

return downright;

}

}

public float DownLeft

{

set

{

downleft = value;

Redraw();

}

get

{

return downleft;

}

}


3.متد ها
سه متد برای تغییر شکل کنترل داشتیم که آنها را پیاده سازی می کنیم .توجه داشته باشید که روش تغییر شکل یک کنترل به شکلی دیگر طی مقاله ای قبلا توضیح داده شده است

مقاله نحوه ایجاد فرم وکنترلهای غیر مستطیلی شکل

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

private void EllipseButton()

{

GraphicsPath path = new GraphicsPath();

path.AddEllipse(0,0, this.Width, this.Height);

this.Region = new Region(path);

}

private void DiamondButton()

{

GraphicsPath path = new GraphicsPath();

Point[] p=new Point[]{new Point(this.Width/2,0),new

Point(0,this.Height/2),new Point(this.Width/2 ,this.Height),new

Point(this.Width,this.Height/2)};

path.AddPolygon(p);

this.Region = new Region(path);

}

4 نقطه لوزی مشخص شده است و توسط Polygon ایجاد شده است

private void RoundButton()

{

float x = 0, y = 0, w = this.Width, h = this.Height;

GraphicsPath path = new GraphicsPath();

path.AddBezier(x, y + topleft, x, y, x + topleft, y, x + topleft, y);

path.AddLine(x + topleft, y, x + w - topright, y);

path.AddBezier(x + w - topright, y, x + w, y, x + w, y + topright, x + w, y +

topright);

path.AddLine(x + w, y + topright, x + w, y + h - downright);

path.AddBezier(x + w, y + h - downright, x + w, y + h, x + w - downright, y +

h, x + w - downright, y + h);

path.AddLine(x + w - downright, y + h, x + downleft, y + h);

path.AddBezier(x + downleft, y + h, x, y + h, x, y + h - downleft, x, y + h –

downleft);

path.AddLine(x, y + h - downleft, x, y + topleft);

this.Region = new Region(path);

}


گوشه های گرد توسط Bezier و خطوط توسط Line در مسیر گرافیکی رسم شده تا ایجاد یک مستطیل گوش گرد کند.

· متد Redraw که با توجه به شکل انتخابی کنترل مجددا متد ترسم متناسب را صدا زده و باعث ترسم دوباره شکل می شود .از این متد ما برای پوشش دادن جنبه های طراحی استفاده می کنیم .پس هر کجا خواص تغییر شکل تغییر کند این متد را فرا خواهیم خواند

private void Redraw()

{

switch (buttonshape)

{

case Shape.Ellipse:

EllipseButton();

break;

case Shape.Diamond:

DiamondButton();

break;

case Shape.RoundRectangle:

RoundButton();

break;

}

}


4.طراحی رفتار کنترل :

· در صورتی که اشاره گر ماوس بر روی کنترل قرار گیرد تصویر باید به تصویر MouseOn تغییر کند .رویداد MouseHover هنگامی رخ می دهد که ماوس بر روی ناحیه کنترل قرار گیرد پس در هنگام رخ دادن آن تصویر راتغییر می دهیم

private void Graphicalbutton_MouseHover(object sender, EventArgs e)

{

this.BackgroundImage = mouseonimage;

}


نکته:خاصیت BackgroundImageStyle کنترل را به stretch تغییر دهید تا تصاویر به اندازه کنترل شود

· در صورتی که اشاره گر ماوس ناحیه کنترل را ترک کند تصویر باید به تصویر Top تغییر کند .رویداد MouseLeave در هنگام ترک ناحیه کنترل رخ می دهد پس

private void Graphicalbutton_MouseLeave(object sender, EventArgs e)

{

this.BackgroundImage = topimage;

}


· در هنگام کلیک تصویر باید به حالت سوم click برود و با اتمام آن به حالت MouseOn برگردد برای انجام آن در هنگامی که دکمه ماوس فشرده شود (MouseDown) تصویر را تغییر و هنگامی که رها شود (MouseUp)تصویر را به حالت قبل بر می گردانیم .طی 2 رویداد زیر.

private void Graphicalbutton_MouseDown(object sender, MouseEventArgs e)

{

this.BackgroundImage = clickimage;

}

private void Graphicalbutton_MouseUp(object sender, MouseEventArgs e)

{

this.BackgroundImage = mouseonimage;

}

اگر کد ها را کامپایل و کنترل ایجاد شده را از جعبه ابزار بر روی فرم بکشید و پنجره Proprties را باز کنید و آن را در حالت categorized قرار دهید در زیر گروه Misc خواصی را که خودمان ایجاد نمودیم ملاحظه خواهید نمود و می توانید راحت مقادیری برای آن انتساب دهید

نکته :Visual Studioبه صورت خودکار با توجه به نوع خواص ابزار ورود داده را تسهیل می کند مثلا برای خواص از نوع image شما می توانید تصویری را بر گزینید به صورت مسیر مستقیم یا اضافه شدن به منابع.

http://www.persiadevelopers.com/images/articles/gdiusercontrol/New%20Picture.jpg

توجه :اما یک مسئله باقی می ماند و آن اینکه اگر کنترل را در هنگام طراحی بر روی فرم تغییر اندازه دهید متوجه می شوید که بسته به تغییری که انجام گرفته کنترل تغییر شکل لازم را نمی دهد ولی بعد از اجرا می بینیم که تغییر اعمال شده است با توجه به این که یکی از جنبه های طراحی کنترل این بود که در زمان طراحی با تغییر اندازه کنترل تغییر اعمال شود تا برنامه نویس بتواند به درستی و بدون نیاز به اجرا هر کنترل را به شکل مناسب درآورده و در سر جای خود قرار دهد پس می بایست کدی اضافه کنیم تا در هنگام تغییر اندازه کنترل مجددا شکل آن اصلاح شود می توانیم این کد را در رویداد Resize کنترل قرار داده و مجددا آن را کامپایل نماییم پس کدهای زیر را به کد کنترل اضافه نمایید.


private void Graphicalbutton_Resize(object sender, EventArgs e)

{

Redraw();

}


http://www.persiadevelopers.com/images/articles/gdiusercontrol/New%20Picture%20(1).jpg

نکات پایانی :

1. از آنجا که تمام رویداد های لازم برای کنترل با ارث بری از UserControl خود به خود وجود دارد پس نیازی به پیاده سازی رویداد نداریم .ولی ممکن است بخواهید کنترلی بسازیم که رویداد جدیدی داشته باشد انشاءالله در مقالات آینده طریقه طراحی رویداد برای یک کنترل را آموزش خواهم داد.

2. سعی بر این شد که کد های ساده ای برای درک ایجاد کنترل به کار گرفته شود تا کاربر سردرگم نشود و به همین دلیل کد های لازم برای جلوگیری از خطا یا ایجاد افکت گرافیکی یا بسیاری کد های دیگر که با اضافه کردن به کنترل کارایی آن را بالا تر می برد به کار گرفته نشد و شما می توانید با کمی خلاقیت کدهایی را اضافه و کنترلی حرفه ای بوجود آورید

3. با انتخاب تصاویر مناسب برای 3 وضعیت دکمه (طراحی شکل تصویر باتوجه به شکل انتخاب شده )می توانید دکمه های 3 وضعیته گرافیکی جالبی با آن ایجاد کنید

4. می توانید خودتان شکل های دیگری ایجاد و به کنترل اضافه نمایید

5. تگ ها و option هایی برای نمایش کنترل در حالت طراحی و اجرا و شکل قرار گیری در پنجره Properties را می توان استفاده نمود که انشاءالله بعدا طی مقاله ای آموزش می دهم.

6. فرایند ایجاد خواص متد ها و رویداد ها را می توانید با classdiagram ایجاد نمایید

http://www.persiadevelopers.com/images/articles/gdiusercontrol/New%20Picture%20(2).jpg

منبع : www. persiandevelopers .com

AlgorithmX
شنبه 25 تیر 1390, 17:25 عصر
WOo.oOW !
جدا از شما ممنونم جناب Programmer 1 بابت توضیح زیبا و کاملتون!:قلب: کلا پست رو ترکوندید!
اما بعد از مدتی متوجه شدم که بهترین گزینه برای کار با اشکال و کنترل های گرافیکی استفاده از تکنولوژی WPF است! که کلی کد رو به هبچ تبدیل میکنه، و نتیجه بهتری رو هم اراعه میده!

Farshid007
شنبه 25 تیر 1390, 18:01 عصر
اقای کلاس زبان شناسی::::
Shape نه sheip

AlgorithmX
شنبه 25 تیر 1390, 20:42 عصر
دمت گرم:تشویق:به موقع بود!:قهقهه: