2009-09-26 2 views
2

Мне нужно иметь полупрозрачное изображение (используя альфа-смешение), нарисованное на полностью прозрачной форме - это означает, что изображение будет нарисовано поверх прозрачного содержимого.Полупрозрачное изображение на прозрачной форме

В настоящее время изображение всегда нарисовано над цветом фона окна, даже если само окно прозрачно.

Это текущее состояние, спасибо за любую помощь.

public Form1() 
{ 
    InitializeComponent(); 

    SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true); 

    MakeTransparent(); 
} 

private void MakeTransparent() 
{ 
    NativeMethods.SetLayeredWindowAttributes(Handle, COLORREF.FromColor(BackColor), 255, Constants.ULW_ALPHA | Constants.ULW_COLORKEY); 
} 

protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams cp = base.CreateParams; 
     cp.Style |= (Constants.WS_EX_LAYERED | Constants.WS_EX_TOOLWINDOW); 
     return cp; 
    } 
} 

private void OnPaint(object sender, PaintEventArgs e) 
{ 
    using (Bitmap bitmap = new Bitmap("c:\\semi-transparent.png")) 
    { 
     e.Graphics.DrawImage(bitmap, 0, 0); 
    } 
} 
+0

Попробуйте отключить двойной буфер. – Ruud

ответ

1

Я предполагаю, что форма не поддерживает прозрачный цвет фона, это вполне может быть невозможно. Таким образом, фон формы всегда имеет цвет, даже при рисовании изображения с альфа-каналом на нем.

Вот аналогичный вопрос:

1

Ну, спасибо за ответ.

Я действительно смог сделать это с помощью функции UpdateLayeredWindow, но мне пришлось всегда обновлять растровое изображение всего окна, даже если мне действительно нужно перерисовать только небольшую часть окна.

Захват содержимого экрана и рисование его под изображением на самом деле не является решением, потому что мне нужно, чтобы мое окно было подвижным.

+0

Я недавно наткнулся на http://www.codeproject.com/KB/GDI-plus/LovelyGoldFishDeskPet.aspx. И снова попытался найти этот вопрос. :-) – Joey

Смежные вопросы