PDA

View Full Version : اضافه کردن آیکن به UserControl برای نمایش در ToolBox



BILLY_Mgs
پنج شنبه 24 تیر 1389, 20:34 عصر
سلام ، میخواستم ببینم چه طوری میشه به کنترلی که ساختم آیکن بدم که وقتی توی Toolbox به VS اضافه شد آیکنش این نباشه : !
http://up.iranblog.com/Files/5595ac2275684a12bc1e.JPG
میخوام مثل اینا باشه :
http://up.iranblog.com/Files/b41585c1fe724a2db8cd.JPG

ali.aghdam
جمعه 25 تیر 1389, 01:11 صبح
برای انجام اینکار می بایست از اتریبیوت ToolboxBitmap استفاده کنید .
شکل کلی اون به صورت زیر است :


[ToolboxBitmap("Bitmap File Address" )]


فقط توجه داشته باشید که فایل تصویر می بایست BMP باشد و اندازه آن 16 *16 باشد و 16 رنگ.

برای فهم راحت برای استفاده از مثال زیر استفاده کن


[ToolboxBitmap(@"C:\ToolBox Image.bmp")]
class ExtendedTreeView: TreeView
{
...
}

ali.aghdam
جمعه 25 تیر 1389, 01:15 صبح
راستی اینو یادم رفت که میتونی از تصاویر مربوط به کنترل های خود فریم ورک هم استفاده کنی .

مثلا :


[ToolboxBitmap(typeof(Button))]


یا


[ToolboxBitmap(typeof(TreeView))]

و همینطور تمام کنترل های فریم ورک .موفق باشی

احمد سامعی
جمعه 25 تیر 1389, 10:40 صبح
سلام
با تشکر از علی آقا

اما ببخشید رها حل صحیح این هست:

شما باید یک عکس همانطور که علی آقا گفتن با فرمت bmp هم نام پروژه ساخته و به پروژه اضافه کنید ( به عنوان یک فایل از پروژه) بعد به صورت کد زیر قرار بالای تعریف کلاس قرار بدید

[ToolboxBitmap(typeof(MyControl), "MyControl.bmp")]
public partial class MyControl : UserControl
{
#region 'Constructor'
public MyControl()
{
//add your code
}
#endregion
}

نکته اگر از روش پست دو استفاده کنید وابسته به مسیر کردید که در صورت انتقال به سیستم دیگه یا انتقال عکس دیگه کار نمی کنه حتماً یادتون نره هم نام باشه

اطلاعات تکمیلی در پست 11 ( صفحه بعد) با تشکر از علی آقا

BILLY_Mgs
جمعه 25 تیر 1389, 17:47 عصر
مرسی درست شد ...:بوس:
منبعی دارید که درباره همه ی :[] هایی که بالایه کلاس ( یا جاهایه دیگه ) مینویسیم توضیح داده باشه ؟
مثلا من فهمیدم که برای گذاشتن یه متن برای توضیحات یه پروپرتیس از این استفاده میشه :


[Description("The text of Lable.")]
public string LableText
{
get { return m_LabelText; }
set { m_LabelText = value; }
}

میخوام با بقیش هم آشنا بشم ، ممنون ...

ali.aghdam
جمعه 25 تیر 1389, 18:32 عصر
سلام.
ممنون از آقای سامعی که تلاش کردند توضیحات بنده رو تکمیل کنند .



شما باید یک عکس همانطور که علی آقا گفتن با فرمت bmp هم نام پروژه ساخته و به پروژه اضافه کنید



حتماً یادتون نره هم نام باشه

ولی آقای سامعی شما تاکید کردید که فایل هم نام با کنترل سفارشی باشه در صورتی که بنده در هیچ یک از مستندات دات نت این قسمت رو ندیدم ! تازه حالا اگه توجه کرده باشید تاکید کردید که فایل تصویر هم نام با پروژه باشه !؟(لطف می کنید توضیح بدید)

توجه کنید اگه بخواهید فایل تصویری رو به عنوان ToolboxBitmap کنترلی قرار بدهید بعد از اضافه کردن فایل به پروژه می بایست خصوصیت Build Action فایل رو به Embedded Resource تغییر بدید(تصویر 1 ضمیمه) تا هنگام کامپایل و شکل گیری فایل DLL فایل تصویری به اون تزریق بشه.خوب حالا دیگه نیازی به تغییر نام فایل و همنام کردن با پروژه! نیست

و حالا می تونید مثلا به صورت زیر عمل کنید (به تصویر 1 و 2 ضمیمه توجه کنید):


[ToolboxBitmap(typeof(SplitButton ),"AliAghdam.bmp")]
public class SplitButton : Button
{
...
{
و حالا بعد از اضافه کردن نتیجه مطلوب رو بدست می آرید(تصویر 3 ضمیمه)

اما آقای سامعی میشه توضیح بدید که چرا راه حل شما صحیح است ؟ و وقتی ما یک فایل رو با کنترل هم نام می کنیم چطور بدون تغییر خصیصه Build Action فایل ،اون فایل به DLL تزریق میشه؟



اما ببخشید رها حل صحیح این هست:

در رابطه با سوال آقای BILLY_Mgs (http://barnamenevis.org/forum/member.php?u=108471) کد های که بین [] اتریبیوت هستند و فریم ورک پر است از اتریبیوت های مختلف که بهترین منبع MSDN است .

BILLY_Mgs
جمعه 25 تیر 1389, 19:10 عصر
توجه کنید اگه بخواهید فایل تصویری رو به عنوان ToolboxBitmap کنترلی قرار بدهید بعد از اضافه کردن فایل به پروژه می بایست خصوصیت Build Action فایل رو به Embedded Resource تغییر بدید(تصویر 1 ضمیمه) تا هنگام کامپایل و شکل گیری فایل DLL فایل تصویری به اون تزریق بشه.خوب حالا دیگه نیازی به تغییر نام فایل و همنام کردن با پروژه! نیست


کاملا درسته !
منم همین کارو کردم تا درست شد.
ضمنا از این هم میشه استفاده کرد
1 : 1 فایل bmp 16*16 به Solution اضافه کنید
2 : در Solution Explorer روی فایل راست کلیک کنید و توی Properties بزنید و Build Action را Embedded Resource تغییر بدید.
3 : کد کلاس خودتونو مثل این بنویسید :


internal class resfinder { }

namespace MyControls
{
[ToolboxBitmap(typeof(resfinder), "ClassLibrary1.MyButton.bmp")]
public class MyButton : Button
{
}
}

ClassLibrary1 و resfinder ها نباید تغییر کنند و MyButton.bmp هم میتونین اسم همون فایل bmp را بزارید. اسم کلاس هم که دست خودتونه :بامزه:

ali.aghdam
جمعه 25 تیر 1389, 20:45 عصر
3 : کد کلاس خودتونو مثل این بنویسید :


internal class resfinder { }

namespace MyControls
{
[ToolboxBitmap(typeof(resfinder), "ClassLibrary1.MyButton.bmp")]
public class MyButton : Button
{
}
}




میبخشید این همون روشیه که من گفتم ! درسته؟

فقط میشه بگید نقش کلاس resfinder اینجا چیه و چرا Type کلاس سفارشی رو قرار ندادید و این کلاس رو استفاده کردید!؟
راستی نیازی نبود که اسم پروژه رو قبل از فایل (اونجای که قرمز کردم) ذکر کنید چون فایل درون همین پروژه هستش .
اصلا لزوم وجود این کلاس(resfinder ) چیه؟ بدون این کلاس و هیچ گونه افزونگی کد نویسی میشه این عملو انجام داد (پست بالا)

BILLY_Mgs
جمعه 25 تیر 1389, 21:50 عصر
هیچ فرقی نداره منم با رمش شما رفتم ولی دیدم اینم میشه!
خط سوم ه پست بالا نوشتم (ضمنا از این هم میشه استفاده کرد)
وقتی resfinder رو میزارید باید ClassLibrary1 رو بزارید


There are a lot of ways it won't work, I've found only one reliable way, documented by this webpage. The step-by-step instructions: create a new class library project, name it ClassLibrary1. Add a bitmap resource and name it "MyButton.bmp". Click the bitmap in the Solution Explorer and change the Build Action to "Embedded Resource".

Write your control class code like this:
using System;
using System.Drawing;
using System.Windows.Forms;

internal class resfinder { }

namespace MyControls
{
[ToolboxBitmap(typeof(resfinder), "ClassLibrary1.MyButton.bmp")]
public class MyButton : Button
{
}
}

The "resfinder" class is a trick to let the GetImageFromResource() method find the bitmap resource in the proper namespace. This is necessary because I made the namespace for the control ("MyControls") different from the default namespace of the class library ("ClassLibrary1"). The resfinder type reference forces .NET to look for the bitmap resource in "ClassLibrary1.MyButton.bmp" rather than "MyControls.ClassLibrary1.MyButton.bmp".

Build the project. Open the project that will use your control. Right-click the tool box and select "Choose items...". Click on Browse and select the ClassLibrary1.dll assembly. You should now see the MyButton control with the proper bitmap.

ali.aghdam
جمعه 25 تیر 1389, 22:12 عصر
هیچ فرقی نداره منم با رمش شما رفتم ولی دیدم اینم میشه!
خط سوم ه پست بالا نوشتم (ضمنا از این هم میشه استفاده کرد)
وقتی resfinder رو میزارید باید ClassLibrary1 رو بزارید

دوست عزیز بنده اگه توجه کرده باشید پرسیدم که دلیل وجود resfinder چیست ؟ و چرا شما ClassLibrary1 رو قرار دادید ؟

دوست عزیز ظاهرا اینطور که معلومه این مطلب رو از جایی کپی کردید ، لطفا لینک مطلب رو برای حفظ قانون کپی رایت قرار دهید (برای رعایت کپی رایت اول باید خودمونو اصلاح کنیم) تا هم منبع معلوم بشه هم بنده با نویسنده مطلب یه گفتگویی داشته باشم.

راستی هر مطلب و روشی رو دید تا امتحان و از چکونگی عملکرد آن مطمعن نشدید اینطور انتشار ندهید که باعث سر در گمی مبتدیان دراون قسمت نشود.

منتظر شما و آقای سامعی هستیم.

احمد سامعی
جمعه 25 تیر 1389, 23:44 عصر
سلام
من اول از دوستان معذرت می خوام به خاطر اینکه عجله کردم و در پست 4 دو نکته را نگفتم:

در نهایت کل کارهایی که باید کرد این هست:

1. یک عکس هم نام پروژه با فرمت bmp و با سایز 16*16 طراحی کرده و به پروژه اضافه می کنیم
2. در Properties این عکس Build Action را به Embedded Resource تغییر می دیم (تا به پروژه تزریق بشه)
3. کد کلاس به شکل زیر می نویسم

[ToolboxBitmap(typeof(MyControl), "MyControl.bmp")]
public partial class MyControl : UserControl
{
#region 'Constructor'
public MyControl()
{
//add your code
}
#endregion
}

اما در جواب علی آقا من دلیل اینکه چرا باید هم نام باشه و مستنداش رو نمی دونم تجربی بهش رسیدم من که با نام دیگه امتحان کردم جواب نداد البته تو پروژه اصلی نشون می ده اما وقتی به پروژه دیگه ای منتقل بشه مشکل داره این روش رو هم از روی یک کامپونت تو codeproject.com پیدا کردم

من برای C#‎‎ زیاد به سایت ماکروسافت سر نزدم اما از بخش ASP.NET سایت ماکروسافت که زیاد خوندم همین مقدار فهمیدم که خیلی جاها خودش هم توضیح قابل قبولی برای بعضی از کدها و دستوراتش نداره و خیلی از کدها یا خطاهاش رو هواست و جوابی نداره

ali.aghdam
شنبه 26 تیر 1389, 00:17 صبح
سلام
من اول از دوستان معذرت می خوام به خاطر اینکه عجله کردم و در پست 4 دو نکته را نگفتم:

در نهایت کل کارهایی که باید کرد این هست:

1. یک عکس هم نام پروژه با فرمت bmp و با سایز 16*16 طراحی کرده و به پروژه اضافه می کنیم
2. در Properties این عکس Build Action را به Embedded Resource تغییر می دیم (تا به پروژه تزریق بشه)
3. کد کلاس به شکل زیر می نویسم

[ToolboxBitmap(typeof(MyControl), "MyControl.bmp")]
public partial class MyControl : UserControl
{
#region 'Constructor'
public MyControl()
{
//add your code
}
#endregion
}اما در جواب علی آقا من دلیل اینکه چرا باید هم نام باشه و مستنداش رو نمی دونم تجربی بهش رسیدم من که با نام دیگه امتحان کردم جواب نداد البته تو پروژه اصلی نشون می ده اما وقتی به پروژه دیگه ای منتقل بشه مشکل داره این روش رو هم از روی یک کامپونت تو codeproject.com پیدا کردم

من برای C#‎‎‎ زیاد به سایت ماکروسافت سر نزدم اما از بخش ASP.NET سایت ماکروسافت که زیاد خوندم همین مقدار فهمیدم که خیلی جاها خودش هم توضیح قابل قبولی برای بعضی از کدها و دستوراتش نداره و خیلی از کدها یا خطاهاش رو هواست و جوابی نداره

سلام
ببینید دوست عزیز من اینو اصلا قبول ندارم که " خیلی جاها خودش هم توضیح قابل قبولی برای بعضی از کدها و دستوراتش نداره و خیلی از کدها یا خطاهاش رو هواست و جوابی نداره "میشه یه نمونه از اون کدها رو معرفی کنی تا ما هم بدونیم!:متفکر:

و شما اگه اون پست قبلی + (http://www.barnamenevis.org/forum/showpost.php?p=1042900&postcount=6) رو چک کنید متوجه می شیدکه بنده همون کار رو انجام دادم با یه فایل به نام AliAghdam.bmp و اون تصویری که گذاشتم (ضمیمه 3)تو یه پروژه و البته تو یه سیستم دیگست !

راستی این روش شما رو دارم پیگیری می کنم تا به نحوه عملکردش پی ببرم انشاالله.

ویه نکته که اصلا نیازی نیست که تصویر هم نام با پروژه باشه بلکه باید هم نام با کنترل سفارشی باشه که دارید این اتریبیوت رو بهش نسبت می دید(من که هنوز درگیر این پیچیدگیم)

ولی هنوز از (آقا/خانوم) ؟ BILLY_Mgs (http://www.barnamenevis.org/forum/member.php?u=108471) خبری نیست تا دوباره بیان و با اون کدهاشون همه رو شگفت زده بکنند و توضیح کداشونم هم بدن.

احمد سامعی
شنبه 26 تیر 1389, 00:33 صبح
ویه نکته که اصلا نیازی نیست که تصویر هم نام با پروژه باشه بلکه باید هم نام با کنترل سفارشی باشه که دارید این اتریبیوت رو بهش نسبت می دید(من که هنوز درگیر این پیچیدگیم)

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

و درباره مشکلات ماکروسافت می تونم به خطای viewEnableStateMAC در ASP.NET اشاره کنم که در سایت خودش سه تا راه داده و در نهایت گفته راه حل قاطعی برای این خطا وجود نداره و باید باهاش سر کنید:قهقهه: و متاسفانه هیچ کدام از اون راه حل ها هم جواب نمی ده و مشکلات دیگه ای برای سایت به وجود می یاره الان لینکش یادم نیست اما می تونید سرچ بزنید (این یک نمونه بود و ...)

البته فکر کنم این بحث ها به این تاپیک مربوط نمی شه و ممکن توسط مدیر تالار قفل بشه که درست هم هست

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

BILLY_Mgs
شنبه 26 تیر 1389, 14:44 عصر
http://social.msdn.microsoft.com/forums/en-US/Vsexpressvcs/thread/4bd5a9cd-4730-41f6-a123-cb49b9ea420b/

قبل پاسخ شما این برا من کار کرد


This worked great for me too. Some notes:

1. Add internal class resfinder { } once - in one of your classes.

2. ClassLibrary1 is the Default namespace that appears in your Project->Properties property sheet. Use Reflect to double check the full names of the bitmaps in the resource file. If there are no resources, see #3 below.

3. Don't forget to change the Build Action to Embed Resource in the Properties for each bitmap file.
هنوزم میگم ماله شما صحیح تره! و باید بین صحیح و صحیح تر ، صحیحتر رو انتخاب کرد!
(آقا/خانوم)ali.aghdam تشکر هارو از پست هاتون حذف کردم به نظرم ارزشش رو نداشت...

ali.aghdam
شنبه 26 تیر 1389, 21:12 عصر
سلام به همه ی دوستان برنامه نویسی

عزیزان ببینید اگر من از شما سوالی پرسیدم ، مطمعا باشید برای این بود که همه از نحوه کد نویسی دیگران و به طور کلی با نحوه کد نویسی استاندارد آشنا بشیم نه اینکه خواسته باشم کسی رو ناراحت کنم!

راستی (آقا/خانوم)BILLY_Mgs نمی تونم اون عمل شما رو درک کنم و هیچ احساسی بهش ندارم.

و کلا این تایپیک دیگه از نظر بنده فراموش شدست.از خداوند متعال عزت و سرافرازي تمامی دوستان برنامه نویس را مسئلت دارم و امیدوارم در اوج به هم بپیوندیم.

marzieh_641
شنبه 23 بهمن 1389, 00:18 صبح
من همه این کارا رو کردن ولی درست نشد - وقتی ازش object می سازی یعنی می اندازی روی فرم شکلش عوش می شود اما شکل tool box عوض نمی شود