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;
        }
    }
}
Zapisujemy i przechodzimy do formy, nad którą pracujemy. Po rozwinięciu Toolboksa widzimy, że na samej górze pojawiła się nasza nowa kontrolka TransparentLabel. Wstawiamy ją na formę – i cieszymy się labelką z przeźroczystym tłem 🙂
Happy coding!