PDA

View Full Version : آموزش: ساخت کنترل های شفاف(transparent)



haghft
دوشنبه 23 خرداد 1390, 11:04 صبح
اگر توجه کرده باشین بعضی کنترل ها مانند لیبل حتی اگر backcolor آنها transparent باشد باز کاملا شفاف نمیشود و اگر فرم شما backgroundImage داشته باشد دقیقا به این موضوع پی خواهید برد.برای رفع این مشکل شما میتونید با استفاده از روشی که خواهیم گفت یک کنترل سفارشی از آن کنترل بسازید که کاملا شفاف است و هیچ مشکلی هم با backgroundImage ندارد.کافیست شما یک کلاس جدید بسازید و این کدها را بنویسید ما در مثال از Lable استفاده کردیم شما میتوانید به جای لیبل از کنترل های دیگری هم استفاده کنید.
using System.Windows.Forms;

namespace TransparentLabel
{
public class TransparentLabel : Label
{
public TransparentLabel()
{
this.SetStyle(ControlStyles.Opaque, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
}
protected override CreateParams CreateParams
{
get
{
CreateParams parms = base.CreateParams;
parms.ExStyle |= 0x20; // Turn on WS_EX_TRANSPARENT
return parms;
}
}
}
}

Directx
دوشنبه 23 خرداد 1390, 11:13 صبح
سلام دوست عزیز می شه راجع به متد createPrams تون که override کردید توضیح بدید یعنی این خط
parms.ExStyle |= 0x20; // Turn on WS_EX_TRANSPARENT
دقیقا چیکار می کنه؟ یا اصلا توضیح کلی راجع به createparams بدید که کارش چیه و چطور استفاده می شه تا همه ی دوستان استفاده کنند

haghft
دوشنبه 23 خرداد 1390, 13:17 عصر
(http://msdn.microsoft.com/en-us/library/aa251511%28v=vs.60%29.aspx)Extended Window Styles (http://msdn.microsoft.com/en-us/library/aa251511%28v=vs.60%29.aspx)

از API های ویندوز برای مدیریت استایل و قالب پنجره هاست.

exlord
دوشنبه 23 خرداد 1390, 13:48 عصر
اگر توجه کرده باشین بعضی کنترل ها مانند لیبل حتی اگر backcolor آنها transparent باشد باز کاملا شفاف نمیشود و اگر فرم شما backgroundImage داشته باشد دقیقا به این موضوع پی خواهید برد.برای رفع این مشکل شما میتونید با استفاده از روشی که خواهیم گفت یک کنترل سفارشی از آن کنترل بسازید که کاملا شفاف است و هیچ مشکلی هم با backgroundImage ندارد.کافیست شما یک کلاس جدید بسازید و این کدها را بنویسید ما در مثال از Lable استفاده کردیم شما میتوانید به جای لیبل از کنترل های دیگری هم استفاده کنید.
using System.Windows.Forms;

namespace TransparentLabel
{
public class TransparentLabel : Label
{
public TransparentLabel()
{
this.SetStyle(ControlStyles.Opaque, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
}
protected override CreateParams CreateParams
{
get
{
CreateParams parms = base.CreateParams;
parms.ExStyle |= 0x20; // Turn on WS_EX_TRANSPARENT
return parms;
}
}
}
}
فقط کافی برای backColor مقدار alpha رو هم ست کنین ....
this.label1.BackColor = Color.FromArgb(150, Color.White);
150 میزان شفافیت رو نشون میده ... از 0 تا 255

haghft
دوشنبه 23 خرداد 1390, 14:10 عصر
فقط کافی برای backColor مقدار alpha رو هم ست کنین ....
this.label1.BackColor = Color.FromArgb(150, Color.White);
150 میزان شفافیت رو نشون میده ... از 0 تا 255
تو روش شما اگه فرم MDIparent باشه جواب نمیده اما تو اون روشی که من گفتم در هر حال جواب میده حتی backgroundimage داشته باشه و ismdicontainer هم true باشه!

exlord
دوشنبه 23 خرداد 1390, 17:59 عصر
تو روش شما اگه فرم MDIparent باشه جواب نمیده اما تو اون روشی که من گفتم در هر حال جواب میده حتی backgroundimage داشته باشه و ismdicontainer هم true باشه!
خوب دلیلش اینکه توی فرم MDI قرار نیست که لیبل گزاشته بشه ...

haghft
دوشنبه 23 خرداد 1390, 19:08 عصر
اتفاقا منم این فکرو میکردم اما چند وقت پیش یکی همین مشکلو داشت و من ان راه حلو بهش پیشنهاد کردم و کارش راه افتاد.در ضمن مثلا شما بخواهید لیبلی رو progressbar بزارید که درصد رو نشون بده باز روش شما جواب نمیده.ولی تا جایی که میشه باید از روش شما استفاده کرد.

rasol_afkham
پنج شنبه 09 بهمن 1393, 11:02 صبح
اگر توجه کرده باشین بعضی کنترل ها مانند لیبل حتی اگر backcolor آنها transparent باشد باز کاملا شفاف نمیشود و اگر فرم شما backgroundImage داشته باشد دقیقا به این موضوع پی خواهید برد.برای رفع این مشکل شما میتونید با استفاده از روشی که خواهیم گفت یک کنترل سفارشی از آن کنترل بسازید که کاملا شفاف است و هیچ مشکلی هم با backgroundImage ندارد.کافیست شما یک کلاس جدید بسازید و این کدها را بنویسید ما در مثال از Lable استفاده کردیم شما میتوانید به جای لیبل از کنترل های دیگری هم استفاده کنید.
using System.Windows.Forms;

namespace TransparentLabel
{
public class TransparentLabel : Label
{
public TransparentLabel()
{
this.SetStyle(ControlStyles.Opaque, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
}
protected override CreateParams CreateParams
{
get
{
CreateParams parms = base.CreateParams;
parms.ExStyle |= 0x20; // Turn on WS_EX_TRANSPARENT
return parms;
}
}
}
}


با سلام خدمت دوستان:
دوست خوبمون haghft (http://barnamenevis.org/member.php?38205-haghft) سه سال پیش ساخت کنترل های شفاف رو خیلی خوب توضیح دادن. اما اگه بخواهیم که میزان شفافیت کنترلمون رو تعیین کنیم باید چه کار کنیم؟ با این روش میزان شفافیت کنترل ۰ می شه.
البته ناگفته نماند که با استفاده از میزان آلفا می توان مقدار شفافیت را کم کرد٬ اما من در برنامه ام این کدها رو نوشتم٬ ولی با کم و زیاد کردن میزان آلفای رنگ پس زمینه تغییری توی شفافیت اعمال نشد و همچنان میزان شفافیت صفر بود. آیا دوستان راهی برای اینکار پیش نهاد دارند؟ در برنامه ام بر روی فرم چند کنترل دارم و کنترل شفاف را بر روی تمام کنترلها قرار داده ام و کنترلهای زیری کاملا پیدا هستند٬ اما می خواهم که کنترل شفاف که روی بقیه کنترلها قرار دارد کم رنگ باشد نه کاملا شفاف؟