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; } } }