CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Inny kształt okna - ambitnie

Inny kształt okna - ambitnie

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Inny kształt okna - ambitnie

Nowy postprzez Mironas » poniedziałek, 3 września 2012, 16:34

Witam,
Chciałbym utworzyć okienko o specyficznym kształcie (łatwizna) ale tak aby tłem okna była grafika z przeźroczystością (np PNG). Chodzi np o cień obrysu. Ważne też jest abym mógł na nim umieścić dodatkowe komponenty (label, memo, button).
Podobny efekt można uzyskać za pomocą komponentu TAdvSmoothSplashScreen (z TMS Component Pack) ale tam nie ma możliwości dodania Memo lub przycisków.
Czy ktoś może ma pomysł jak zbudować/narysować takie okno?
Przykładowy wygląd:
Obrazek
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Inny kształt okna - ambitnie

Nowy postprzez Cyfrowy Baron » wtorek, 4 września 2012, 09:57

NIe da się tego załatwić żadną bitmapą, czy też plikiem PNG z cieniem, przeźroczystością itp. To wymaga rysowania cienia bezpośrednio na ekranie wokół okna w zdarzeniu OnPaint. Samo rysowanie po ekranie to nie problem, ale narysowanie cienia wymaga już użycia jakichś masek, niestety nie wiem jakich i jak się robi taki cień.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Inny kształt okna - ambitnie

Nowy postprzez Mironas » wtorek, 4 września 2012, 10:18

Dziękuję za odpowiedź.
Nie chodzi tu tylko o cień wokół okna ale o przeźroczystość całej bitmapy. Myślę że istnieje jakiś sposób na wyświetlenie grafiki z kanałem alfa (przerysowanie?). Tak działa np wspomniany komponent TAdvSmoothSplashScreen:
Obrazek
Ten dymek z cieniowanym obrysem i przeźroczystością to grafika PNG którą umieściłem w tym komponencie. Wygląda świetnie ale ma wady o których pisałem wyżej. Nie wiem jak jest to realizowane ale okno pod dymkiem można normalnie obsługiwać, przesuwać itp. Ciekawostka - jak chciałem zrobić zrzut ekranu za pomocą programu MWSnap3 to po kliknięciu 'Zrzucaj...' dymek zniknął. Zrzut ekranu udało się zrobić zwykłym PrintScreen-em z klawiatury.

Może ktoś w przyszłości wymyśli jakieś rozwiązanie tego problemu i podzieli się z nami pomysłem.
Pozdrawiam.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Inny kształt okna - ambitnie

Nowy postprzez Cyfrowy Baron » wtorek, 4 września 2012, 10:43

Przecież okno ma dwie właściwości:

AlphaBlend = true - włącza przeźroczystość okna
AlphaBlendValue - określa stopień przeźroczystości w zakresie od 0 - całkowicie przeźroczyste do 255 nieprzeźroczyste.

Problem w tym, że jeżeli określisz w ten sposób przeźroczystość okna to wszystko na tym oknie będzie miało ten sam stopień przeźroczystości, czyli nie tylko np. Bitmapa wczytana np. do Image, ale również wszystkie przyciski, itp.

By to zrobić inaczej musiałbyś użyć dwóch okien z których to pod spodem jest tylko tłem dla tego na wierzchu. Spodnie okno ma regulowany stopień przeźroczystości, a to wierzchnie nie. Okno wierzchnie jest jednak całkowicie przeźroczyste poprzez usunięcie koloru TransparentColor = true, a w TransparentColorValue określasz kolor, który ma być przeźroczysty potem nadajesz oknu kolor ten sam który jest w TransparentColorValue.

TAdvSplashScreen działa na zasadzie rysowania na ekranie z użyciem masek, to nie jest obiekt, który by posiadał powierzchnię lecz zwykła grafika.

Mironas napisał(a):Ten dymek z cieniowanym obrysem i przeźroczystością to grafika PNG którą umieściłem w tym komponencie.


Niczego nie umieściłeś w komponencie, lecz wskazałeś komponentowi grafikę którą ma odrysować na ekranie. Ten komponent nie posiada powierzchni na której można by cokolwiek umieścić. To działa bardziej jak dymek podpowiedzi.

Mironas napisał(a):jak chciałem zrobić zrzut ekranu za pomocą programu MWSnap3 to po kliknięciu 'Zrzucaj...' dymek zniknął.


Gdyż to nie jest okno, lecz grafika, więc nie dało się pobrać do niej uchwytu. PrtScr zrobił zrzut całej zawartości ekranu, ale spróbuj zrobić zrzut dymka z kombinacją Alt+PrtScr a efekt będzie taki sam jak w MWSnap3.

Takie sztuczki z oknem można bez problemu realizować w Windows 7 gdyż ten system to obsługuje, ale w Windows XP tego nie ma dlatego jest to takie kombinowane.

Nie licz na to, że umieszczając grafikę na oknie załatwisz sprawę. Czytałem kiedyś o tym i wiem, że potrzeba jakichś masek, ale nie było kodu więc nie kontynuowałem tematu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Mironas
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Inny kształt okna - ambitnie

Nowy postprzez Mironas » wtorek, 4 września 2012, 12:06

Cyfrowy Baron napisał(a):AlphaBlend = true - włącza przeźroczystość okna
AlphaBlendValue - określa stopień przeźroczystości w zakresie od 0 - całkowicie przeźroczyste do 255 nieprzeźroczyste.

Próbowałem już podobnego rozwiązania ale się sprawdza tylko połowicznie. Można uzyskać efekt przeźroczystości ale przeźroczystość jest jednolita na całym obszarze. Nie da się zrobić np zanikających cieni na krawędziach.

Cyfrowy Baron napisał(a):By to zrobić inaczej musiałbyś użyć dwóch okien z których to pod spodem jest tylko tłem dla tego na wierzchu.

Podsunąłeś mi tym inny (podobny) pomysł który rozwiązał wszystkie problemy. Dodałem nowe okientko (Form7) umieściłem na nim wszystkie potrzebne komponenty i ustawiłem takie właściwości formy:
BorderStyle = bsNone;
FormStyle = fsStayOnTop;
Color = clAqua;
TransparentColor = true;
TransparentColorValue = clAqua;
Position = poDesigned;

Dodałem publiczną funkcję:
KOD cpp:     UKRYJ  
public:
  void Start(int X, int Y);
 

W oknie umieściłem komponent TAdvSmoothSplashScreen (z TMS Component Pack) i wstawiłem mu tło PNG z dymkiem.
Okno to wywołuję podając współrzędne gdzie ma się ukazać:
KOD cpp:     UKRYJ  
  Form7->Start(x, y);
  SetFocus();
 

W tym oknie mam coś takiego:
KOD cpp:     UKRYJ  
void TForm7::Start(int X, int Y)
{
  // pokaz dymek
  AdvSmoothSplashScreen1->DisplayPosX = X;
  AdvSmoothSplashScreen1->DisplayPosY = Y;
  AdvSmoothSplashScreen1->Show();
  // pokaz komponenty okna
  Left = X;
  Top = Y;
  Show();
}
//---------------------------------------------------------------------------
void __fastcall TForm7::AdvGlowButton2Click(TObject *Sender)
{
  Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm7::FormClose(TObject *Sender, TCloseAction &Action)
{
  AdvSmoothSplashScreen1->Hide();
}
//---------------------------------------------------------------------------
 

Całość daje taki efekt:
Obrazek
Czyli rozmyte cienie, to co ma być przeźroczyste to jest, można wstawiać dowolne komponenty, można dalej pracować na oknie pod dymkiem, no i całość łatwo się obsługuje. Jedyna wada - trzeba mieć TAdvSmoothSplashScreen który niestety jest płatny.

Dzięki za inspirację.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Inny kształt okna - ambitnie

Nowy postprzez sebaskow » niedziela, 9 grudnia 2012, 11:30

Witam.

Spodobał mi się problem przeźroczystej podpowiedzi, postanowiłem więc utworzyć sobie takiego hinta. Zrobiłem to w następujący sposób:

1) Skopiowałem fragment ekranu do utworzonej bitmapy.
2) Narysowałem na kolejnej bitmapie przy pomocy GDI obrazek hinta ( jeszcze jest graficznie nie dopracowany )
3) Wykonałem obliczenia na kolorach pixeli, odjąłem kolor obrazka hinta od kolorów fragmentu ekranu - tutaj tła.
4) Kopiuje nowo utworzona bitmape połączoną z dwóch na ekran w dowolnym miejscu.
5) Przy usuwaniu hinta odrysowuje fragment ekranu utworzony w punkcie 1.

W załączniku programik :)

Muszę jeszcze oprogramować zdarzenie odświeżania "chmurki"

Pozdrawiam
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Ostatnio edytowano poniedziałek, 10 grudnia 2012, 10:09 przez sebaskow, łącznie edytowano 1 raz
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows 7Firefox

Re: Inny kształt okna - ambitnie

Nowy postprzez Cyfrowy Baron » niedziela, 9 grudnia 2012, 18:52

sebaskow napisał(a):W załączniku programik :)


:?: :!: :?:
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Inny kształt okna - ambitnie

Nowy postprzez Mironas » poniedziałek, 10 grudnia 2012, 10:43

A co jeśli zmienia się obraz pod hint-em?

PS
Może zamiast EXE-ka podasz kawałek kodu?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Inny kształt okna - ambitnie

Nowy postprzez Cyfrowy Baron » poniedziałek, 10 grudnia 2012, 13:48

To niestety nic innego jak rysowanie po ekranie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Inny kształt okna - ambitnie

Nowy postprzez sebaskow » wtorek, 11 grudnia 2012, 09:52

Na razie pracuję nad tym obecny mój kod to jeden wielki bałagan, ale nie ma problemu. Jak już będzie gotowa funkcja oczywiście podam kod poukładany :D
Wiem że muszę wykonać odświeżanie pod Hintem. :)

Pozdrawiam
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows XPChrome

Re: Inny kształt okna - ambitnie

Nowy postprzez polymorphism » wtorek, 11 grudnia 2012, 10:57

Kod potencjalnie powoduje wyciek. obrazek, tlo i ekran tworzysz za każdym wciśnięciem przycisku, a usuwasz tylko raz, przy zamykaniu okna. Użyj inteligentnych wskaźników (auto_ptr na przykład)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Inny kształt okna - ambitnie

Nowy postprzez sebaskow » niedziela, 23 grudnia 2012, 22:39

W załączniku programik :D
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
sebaskow
Intelektryk
Intelektryk
 
Posty: 135
Dołączył(a): wtorek, 3 maja 2011, 08:30
Lokalizacja: Katowice
Podziękował : 10
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++ Builder XE7
Gadu Gadu: 0
    Windows XPChrome


Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości

cron