Kontrolka dziedzicząca po Label, FadeIn, FadeOut, opacity

0

Howdy!

Pół dnia dziś męczę się ze stworzeniem kontrolki (UserControl) dziedziczącej po Label. Chciałbym, by miała dodatkowe funkcje FadeIn i FadeOut.

Pokopałem nieco w sieci, znalazłem różne przykłady:

Ale mimo różnych miksów i wariacji nadal nie udało mi się sprawić, by ów kontrolka zmieniła płynnie swoją przeźroczystość.
Mam w niej ustawiony kolor tła i tekstu, ma wyglądać jak prostokąt, więc chodzi o przeźroczystość całej kontrolki, a nie np. tylko tła czy tylko tekstu (takie przykłady też znajdywałem).

Pętelkę i dodatkowe metody umiem sobie zrobić, nie będę tu tego kodu wklejał. To, czego mi brakuje, to tej magicznej linijki ustawiającej przeźroczystość (bądź malującej całość w OnPaint).

0

Eee... to jest element HTML, a ja piszę o UserControl, na klasycznym desktopowym programie.

0
Marooned napisał(a):

Eee... to jest element HTML, a ja piszę o UserControl, na klasycznym desktopowym programie.

To jest WPF ;)

0

Tak, próbowałem różnych wariacji w stylu:

protected override void OnPaint(PaintEventArgs e) {
  e.Graphics.Clear(Color.FromArgb(this.opacity, this.BackColor));
  Rectangle r = new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height);
  TextRenderer.DrawText(e.Graphics, this.Text, this.Font, r, Color.Black, Color.Empty, TextFormatFlags.HorizontalCenter | TextFormatFlags.Top);
}

zmieniając w pętli opacity.
Inny znaleziony przykład to:

protected override void OnPaintBackground(PaintEventArgs e) {
  e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(this.opacity, this.BackColor)), this.ClientRectangle);
}

W konstruktorze wszelakie

this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor, true);

Czy też

protected override CreateParams CreateParams {
  get {
    CreateParams cp = base.CreateParams;
    cp.ExStyle |= 0x20;  // Turn on WS_EX_TRANSPARENT
    return cp;
  }
}
0

IMO będzie ciężko to zrobić, i polecał bym Ci przesiąść się na WPF. Nie dawno w pracy zaczeliśmy nowy projekt, gdzie GUI robię w WPF - poezja.

Popatrz tutaj: http://www.codeproject.com/Articles/140611/WPF-Tutorial-Beginning

Na początku trochę ciężko przywyknąć do XAML'u, jednak po jakimś czasie robienie GUI jest naprawdę wygodne. Jeśli w samym XAML'u nie dajesz rady, to włączasz MS Blend'a (część pakietu MS Expression) i robisz kontrolki prawie jak w Photoshopie, kopiujesz XAML'a i wklejasz w projekcie.

Pare 'live' screenów:

Widok z poziomu designer'a:

user image

Widok z poziomu XAML'a:

user image

0

Problemem chyba nie jest przezroczystość samej kontrolki, tylko fakt, że nie prześwitują spod niej inne kontrolki:

amelinium.png

To jest label przy „opacity” na 128, czyli 50%, używając mniej-wiecej twojego kodu.
Odcień rysowany jest wyraźnie ciemniejszy od zadanego Lime.

Tutaj wydaje się że jest „oficjalne” rozwiązanie, ale w VB.Net i na dodatek kod rozjechany, więc nie wczytywałem się.

0

@szulak dzięki za chęci, ale to projekt pisany przez wiele osób, ja tam jestem pionkiem i to "niestety" ja się muszę dopasować.

@Azarien to by miało sens, bo u mnie też się ta zieleń ściemniała aż do czerni, więc to tak, jakby przeźroczystość była nadawana kontrolce, ale ona miała czerń pod sobą, która już była "na stałe".

Z powodu nietrywialności problemu oficjalnie odpuszczam sobie poszukiwanie rozwiązania. To był tylko mój pomysł na pojawianie się komunikatu. Ponieważ belkę z komunikatem umieściłem na górze, to zamiast bawić się przeźroczystością, to zwiększam wysokość od 0 do 20, czyli belka rozwija się z góry i tam też się chowa. Rozwiązanie mnie satysfakcjonuje, ale... no właśnie, zrobię lekki offtop w stosunku do pierwotnego pytania, ale tu kolejne pytanie. Ustawiłem jej Dock na DockStyle.Top co by dopasowała się szerokością do rodzica, ale czy jest możliwość by zmiana jej wysokości nie przesuwała reszty elementów w dół? Coś w rodzaju nakładki przysłaniającej to co pod nią.

0

Ustaw Anchor na Top, Left, Right,
Dock zostaw na None, a w metodzie która pokazuje belkę ustawiaj ręcznie szerokość i pozycję:

            panel2.Location = new Point(0, 0);
            panel2.Width = panel2.Parent.ClientSize.Width;
            panel2.Visible = true;
            // itd.
0

Dopiero teraz skorzystałem z ostatniej odpowiedzi i niestety, nic się nie wyświetla. Nie widać elementu w ogóle.

1 użytkowników online, w tym zalogowanych: 0, gości: 1