Я собираюсь построить производный класс Control
, который поддерживает свойство Opcacity
.
Этот контроль может разместить текст и изображение и beable исчезать их и в
Вот мой код:.Управление затуханием в C#
internal class FadeControl : Control
{
private int opacity = 100;
public FadeControl()
{
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
}
public int Opacity
{
get
{
return opacity;
}
set
{
if (value > 100) opacity = 100;
else if (value < 1) opacity = 1;
else opacity = value;
if (Parent != null)
Parent.Invalidate(Bounds, true);
}
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | 0x20;
return cp;
}
}
protected override void OnPaintBackground(PaintEventArgs e)
{
//do nothing
}
protected override void OnMove(EventArgs e)
{
RecreateHandle();
}
protected override void OnPaint(PaintEventArgs e)
{
using (Graphics g = e.Graphics)
{
Rectangle bounds = new Rectangle(0, 0, Width - 1, Height - 1);
int alpha = (opacity * 255)/100;
using (Brush bckColor = new SolidBrush(Color.FromArgb(alpha, BackColor)))
{
if (BackColor != Color.Transparent)
g.FillRectangle(bckColor, bounds);
}
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.Matrix33 = (float)alpha/255;
ImageAttributes imageAttr = new ImageAttributes();
imageAttr.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
if (BackgroundImage != null)
g.DrawImage(BackgroundImage, bounds, 0, 0, Width, Height, GraphicsUnit.Pixel, imageAttr);
if (Text != string.Empty)
{
using (Brush txtBrush = new SolidBrush(Color.FromArgb(alpha, ForeColor)))
{
g.DrawString(Text, Font, txtBrush, 5, 5);
}
}
}
}
protected override void OnBackColorChanged(EventArgs e)
{
if (Parent != null)
Parent.Invalidate(Bounds, true);
base.OnBackColorChanged(e);
}
protected override void OnParentBackColorChanged(EventArgs e)
{
Invalidate();
base.OnParentBackColorChanged(e);
}
}
Я гнал управления на форме, которая имеет таймер на нем.
Таймер устанавливает непрозрачность элемента управления от 0 до 100 и обратно и его работоспособность.
Проблема, которую я пытаюсь решить, заключается в том, что элемент управления мерцает при изменении его непрозрачности.
Настройка элемента управления на ControlStyles.DoubleBuffer
сделает управление невидимым для формы.
Любые советы приветствуются.
Это неизбежно, когда вы используете WS_EX_TRANSPARENT. Так что не используйте его. –
Возможный дубликат [Fade a panel-Windows forms] (http://stackoverflow.com/questions/10178559/fade-a-panel-windows-forms) –
Элемент управления по ссылке не поддерживает прозрачную обратную цветность. Я хотел бы, чтобы cotrol мог исчезать и исчезать, имея PNG-изображения и тексты. – toy4fun