Tworząc interfejs aplikacji przeznaczonej pod ekrany dotykowe, w pewnym momencie okazało się, że muszę opracować własną klasę okien typu MessageBox. Wszystko fajnie, działa. Zachciało mi się wypełniać tło tych okienek fajnym gradientem 😉 również działa, ale… pojawił się, nieoczekiwany zupełnie przeze mnie, problem: kontrolka Label z Windows Forms nie posiada możliwości ustawienia koloru tła na przeźroczysty! Skutkuje to oczywiście bardzo brzydkim efektem, w postaci placka tła, rozlanego na pięknym gradiencie okienka 😉
Co zrobić?
Okazuje się, że w kodzie tworzenia okienka kontrolki wystarczy dodać flagę WS_EX_TRANSPARENT do domyślnego zestawu styli. Jak? Stworzymy nową kontrolkę, dziedziczącą po Label. Dodajemy do projektu nową klasę, dodajemy klauzulę using System.Windows.Forms; i wklejamy kod klasy:
//! Klasa kontrolki TransparentLabel
/*!
* Kontrolka dziedziczy praktycznie wszystko po Label,
* jedyne, co zmienia to dodanie jednej flagi do
* stylu okna podczas jego tworzenia: WS_EX_TRANSPARENT.
*/
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; // Włączenie flagi stylu WS_EX_TRANSPARENT
return parms;
}
}
}
