Въпреки че WinForms не е подходящ за прозрачност в потребителските контроли, това е възможно. Вижте тази статия тук. В него авторът предлага извличане от Panel, а не от UserControl и замяна на метода OnPaintBackground, за да не прави нищо. това ще спре изчертаването на вашия фон
protected override void OnPaintBackground(PaintEventArgs pevent)
{
//do nothing
}
protected override void OnMove(EventArgs e)
{
RecreateHandle();
}
// Override the CreateParams property:
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = 0x00000020; //WS_EX_TRANSPARENT
return cp;
}
}
И накрая, като замените функцията OnPaint, можете да нарисувате вашата картинна кутия.
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
//Do your drawing here
}
Използвайки това, можете да създадете персонализирана картинна кутия с прозрачност, но имайте предвид, че ще получите трептене и замъгляване, ако я местите по екрана в реално време.
Използвайки тази и подобни техники, успяхме да получим приложение WinForms, Premex XPort за изобразяване с марка, подобна на техния уебсайт. Това включва множество прозрачни контроли, хакове за рисуване и всякакви други, за да се покаже правилно.
В заключение, причината, поради която Winforms прави това лошо, е в технологиите, базирани на Win32, една контрола притежава един пиксел на екрана. Няма начин наистина да комбинирате пиксели с прозрачност, както бихте очаквали в HTML или WPF. По-късните технологии на Windows (WPF) правят това особено добре, така че ако наистина искате да използвате сериозно прозрачността в приложението си, бих предложил да преминете към тази платформа, поне отчасти (WPF може да се хоства в WinForms и обратно).
С Най-Добри Пожелания,
person
Dr. Andrew Burnett-Thompson
schedule
31.12.2011
note.Invalidate();
след преместването му? Илиpanel.Invalidate();
? - person LarsTech   schedule 31.12.2011