PDA

View Full Version : گفتگو: ساخت کمبوباکس آیکون دار ComboBox With Icon



gwbasic
شنبه 02 اردیبهشت 1391, 20:27 عصر
سلام دوستان
فرض کنید می خوایم کمبو باکسی داشته باشیم که هر آیتم آن آیکون هم داشته باشد. کد پیشنهای شما چیست؟
اگر علاقمند هستید لطفا نمونه کدتون رو در قالب یک پروِژه بذارید تا با کمک شما این موضوع رو که می تونه بهونه خوبی برای ساخت کنترل سفارشی و گسترش آن باشه ادامه بدیم

esiprogrammer
شنبه 02 اردیبهشت 1391, 21:56 عصر
چرا این کار رو با WPF انجام نمیدید؟
نوشتن اینگونه کنترلهای سفارشی با WPF بسیار راحته . با چند خط کد XAML میتونین بسازید.
اگه میخواید نمونشو براتون بزارم

gwbasic
شنبه 02 اردیبهشت 1391, 22:48 عصر
صورت سوال رو عوض نکنید مطمئنا در WPF چون کنترلها container‌نیز هستند به راحتی این کار امکانپذیر هست. این تاپیک بهونه ای هست برای بررسی یک سری مسائل در مورد ساخت کنترل سفارشی البته در صورت ابراز علاقه و تمایل دوستان برنامه نویس

amir3321
یک شنبه 03 اردیبهشت 1391, 09:20 صبح
با سلام من یک کد جهت اضافه کردن ایکن به combobox دیدم ولی نحوه اضافه کردن عکس و تکست رو با هم نفهمیدم چون مثل اینکه با ید تکست تبدیل به گرافیک شود و بعد از آن استفاده کرد




private void Form3_Load(object sender, EventArgs e)
{

try
{


// imageList1.Images.Add(bmp);

string[] items = new string[(imageList1.Images.Count - 1)];
for (int i = 0; i < (imageList1.Images.Count - 1); i++)
{

items[i] = i.ToString() ;

}

comboBox1.Items.AddRange(items);

comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
comboBox1.DrawMode = DrawMode.OwnerDrawVariable;
comboBox1.ItemHeight = imageList1.ImageSize.Height;

comboBox1.Width = imageList1.ImageSize.Width + 100;

comboBox1.MaxDropDownItems = imageList1.Images.Count;

comboBox1.Items.Add(imageList1.Images[0]);

}

catch
{

}



}



private void comboBox1_DrawItem_1(object sender, DrawItemEventArgs e)
{
if (e.Index != -1)
{

// e.Graphics.DrawImage(imageList1.Images[e.Index], e.Bounds.Left, e.Bounds.Top);

e.Graphics.DrawImage(imageList1.Images[e.Index], e.Bounds.Left, e.Bounds.Top);
}
}

amir3321
یک شنبه 03 اردیبهشت 1391, 09:45 صبح
یک نمونه سورس پیدا کردم ولی فهمیدن کدهاش مشکل بود شاید بدرد این موضوع بخورد86110

arminkhodaei
یک شنبه 03 اردیبهشت 1391, 10:31 صبح
فکر کنم بشه یه کلاس کاستوم براش نوشت ولی مشکل اینجاست که خیلی سخت میشه به کاملیه Combobox خود مایکروسافت بشه.
مثلاً یک template خاص برای فرمی در نظر بگیرید و روش کار کنیم از نظر ظاهری ...

gwbasic
یک شنبه 03 اردیبهشت 1391, 12:12 عصر
مرسی امیر جان! برای نمایش Icon از متد DrawImage استفاده می شه همانطور که نوشتی و برای نمایش متن هم از متد DrawString مربوط به Graphics استفاده ولی همه اینها باید در یک کلاس جدید که از ComboBox ارث می بره پیاده سازی بشه

ArminKhodaei@ اگه پیاده سازی درست صورت بگیره کامل و بی نقص خواهد بود در ادامه حتما این کار رو خواهیم کرد

Mahmoud.Afrad
دوشنبه 15 خرداد 1391, 11:30 صبح
بنده کلاس زیر رو نوشتم. ItemImages لیستی از عکسهاست

using System.Drawing;
using System.Windows.Forms;

class ComboBoxWithIcon : ComboBox
{
private ImageList _itemImages;
private int _imageX, _imageY;

public ImageList ItemImages
{
get { return _itemImages; }
set
{
_itemImages = value;
if (value != null)
{
DrawMode = DrawMode.OwnerDrawVariable;
}
}
}

protected override void OnDrawItem(DrawItemEventArgs e)
{
base.OnDrawItem(e);

e.DrawBackground();
if (e.Index < 0 || ItemImages == null) return;
string n = Items[e.Index].ToString();
RectangleF rectf;
if (RightToLeft == RightToLeft.Yes)
{
if (e.Index < ItemImages.Images.Count)
{
_imageX = e.Bounds.Right - ItemImages.ImageSize.Width;
_imageY = e.Bounds.Top + (e.Bounds.Height - ItemImages.ImageSize.Height)/2;
e.Graphics.DrawImage(ItemImages.Images[e.Index], _imageX, _imageY);
}
rectf = new RectangleF(e.Bounds.X, e.Bounds.Top, e.Bounds.Right - ItemImages.ImageSize.Width, e.Bounds.Bottom);
e.Graphics.DrawString(n, Font, Brushes.Black, rectf, new StringFormat(StringFormatFlags.DirectionRightToLef t));
}
else
{
if (e.Index < ItemImages.Images.Count)
{
_imageX = e.Bounds.Left;
_imageY = e.Bounds.Top + (e.Bounds.Height - ItemImages.ImageSize.Height)/2;
e.Graphics.DrawImage(ItemImages.Images[e.Index], _imageX, _imageY);
}
rectf = new RectangleF(e.Bounds.X + _itemImages.ImageSize.Width, e.Bounds.Y, e.Bounds.Right, e.Bounds.Bottom);
e.Graphics.DrawString(n, Font, Brushes.Black, rectf);
}
}
}

87869

negar.rafie
جمعه 30 فروردین 1392, 15:55 عصر
میشه بگید چطوری از این کلاس استفاده کنیم؟

Mahmoud.Afrad
جمعه 30 فروردین 1392, 22:50 عصر
یک کلاس (فایل با پسوند .cs) به پروژه اضافه کنید و این کلاس رو توش کپی کنید. یک بار دیباگ کنید و از تولباکس ComboBoxWithIcon را استفاده کنید.
طریقه استفاده هم به اینصورته که یک imagelist روی فرم بزارید. غکسها رو بهش اضافه کنید. این ایمیج لیست را به خاصیت ItemImages این کمبوباکس نسبت بدید. آیتمها رو هم طبق روال معمول add کنید یا از دیتاسورس استفاده کنید.