CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Przezroczysty forma lub panel ?

Przezroczysty forma lub panel ?

dział ogólny

Przezroczysty forma lub panel ?

Nowy postprzez Corvis » wtorek, 1 maja 2012, 08:31

Witam,

Zacznę może od tego co chcę osiągnąć.

Mam formatkę na którą wrzuciłem TAdvSmoothPanel - musiałem go użyć bo klient zażyczył sobie gradient jako tło aplikacji. (Załącznik numer 1). Problem zaczyna się wtedy gdy muszę położyć na panel 2 komponenty np. Label i ComboBox. Problem polega na tym że Panel nie jest przezroczysty i wygląda to słabo. (Załącznik numer 2). Próbowałem to rozwiązać używając Formy zamiast panela i robiąc taką sztuczkę:

KOD cpp:     UKRYJ  
void __fastcall TFrmTest::FormCreate(TObject *Sender) {
        this->Brush->Style = bsClear;
}


No i z początku wyglądało tak jak by coś zadziałało (Załącznik 3). Jednak po zmianie rozmiaru okna powstał dziwny efekt (Załącznik 4).

Nie bardzo wiem jak to zrobić i czy w ogóle da się zrobić żeby panel albo forma była przezroczysta. Chyba, że zna ktoś jakiś inny komponent na którym mogę położyć inne typu label, combo, button i będzie on przezroczysty ? Ideałem był by przezroczysty GridPanel.

Pozdrawiam,
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Przezroczysty forma lub panel ?

Nowy postprzez Corvis » wtorek, 1 maja 2012, 08:33

Nie wszedł mi 4 załącznik nie wiem czemu. Dorzucam go tutaj.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Przezroczysty forma lub panel ?

Nowy postprzez Cyfrowy Baron » wtorek, 1 maja 2012, 08:42

Piszesz dość niejasno. Nie wiem o co chodzi z tymi Editami i Labelami, co właściwie chcesz osiągnąć? Co do tej sztuczki, to chyba powinieneś umieścić ten kod w zdarzeniu OnPaint fomularza, gdyż to zdarzenie jest wywoływane każdorazowo, gdy formularz wymaga odrysowania, czyli również przy zmianie jego rozmiaru. Używanie klasy TCanvas ma to do siebie, że efekty jakie w niej wywołasz są nietrwałe i wymagają odświeżania i do tego służy zdarzenie OnPaint.

Napisz jakoś zrozumiale jaki efekt chcesz osiągnąć.

Problem zaczyna się wtedy gdy muszę położyć na panel 2 komponenty np. Label i ComboBox. Problem polega na tym że Panel nie jest przezroczysty i wygląda to słabo. (Załącznik numer 2).


Jak ma być przeźroczysty skoro wypełniasz go gradientem. Ten opis jest sprzeczny sam w sobie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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: Przezroczysty forma lub panel ?

Nowy postprzez Corvis » wtorek, 1 maja 2012, 09:04

W załączniku jeszcze raz wrzucam o co mi wychodzi.

1 zestaw komponentów jest to Label + ComboBox położony na Panelu a panel dopiero na TAdvSmoothPanelu - zostaje tutaj białe tło zwykłego panela
2 zestaw komponentów jest to Label + ComboBox położony bezpośrednio na TAdvSmoothPanelu - taki efekt chcę osiągnąć ale używając zwykłego panela

Dlaczego muszę położyć komponenty wpierw na zwykłym panelu ? Bo potem chce to wszystko skalować i poukładać je w rzędy. Bez tego raczej będzie mi ciężko

Mam nadzieję, że teraz jasno napisałem :)

Wzór.png
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Przezroczysty forma lub panel ?

Nowy postprzez Cyfrowy Baron » wtorek, 1 maja 2012, 09:13

Ja osiągnąłem taki efekt:

gradient.png


Bez dodatkowych komponentów, za pomocą kilku linijek kodu:

KOD cpp:     UKRYJ  
void __fastcall TForm1::FormPaint(TObject *Sender)
{
 int iHeight = (this->ClientHeight + 255) / 256 ;

 for (int Row = 0; Row <= 255; Row++)
 {
  this->Canvas->Brush->Color = RGB(0, 0, 255-Row);
  this->Canvas->FillRect(Rect(0, Row * iHeight, this->ClientWidth, (Row + 1) * iHeight));
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
 FormPaint(NULL);

 this->Invalidate();
}


Pozostaje tylko kwestia opracowania odpowiedniego gradientu za pomocą liczb jak w przykładzie. Jak widzisz w kodzie ja użyłem składowej RGB, gdzie R=0, G=0 i zmieniana jest tylko wartość B czyli niebieskiego w zakresie od 255 do 113.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Corvis
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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: Przezroczysty forma lub panel ?

Nowy postprzez Corvis » wtorek, 1 maja 2012, 09:16

Edit. Przecież mogę użyć formy zamiast Panela :)

Dzięki !!!!
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Przezroczysty forma lub panel ?

Nowy postprzez Cyfrowy Baron » wtorek, 1 maja 2012, 09:25

Dla Twojego gradientu algorytm może wyglądać tak:

KOD cpp:     UKRYJ  
 int iHeight = (ClientHeight + 255) / 256 ;

 for (int Row = 0; Row <= 255; Row++)
 {

   this->Canvas->Brush->Color = RGB(191 - (Row/3), 216 - (Row/4), 237 - (Row/7) );

   this->Canvas->FillRect(Rect(0, Row * iHeight, ClientWidth, (Row + 1) * iHeight));

 }



Po dodaniu obrazka do postu jako załącznika kliknij na przycisk wstaw go w linii, by dodać go do postu jako grafikę, potem łatwiej się takie duże obrazki przegląda, bo można je sobie wyświetlić w osobnym oknie podglądu.



Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Corvis
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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: Przezroczysty forma lub panel ?

Nowy postprzez Corvis » wtorek, 1 maja 2012, 12:17

Dzięki będę kombinował
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Przezroczysty forma lub panel ?

Nowy postprzez Corvis » czwartek, 3 maja 2012, 17:16

Baronie mam jeszcze jedno pytanie.

Skąd te dzielenia w tej linii kodu ?? Możesz mi to wyjaśnić ????

KOD cpp:     UKRYJ  
this->Canvas->Brush->Color = RGB(191 - (Row/3), 216 - (Row/4), 237 - (Row/7) );


Zrobiłem już to co chciałem teraz muszę podobierać gradienty tak żeby nie było efektu jak w załączniku

gradienty.png
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Przezroczysty forma lub panel ?

Nowy postprzez Cyfrowy Baron » czwartek, 3 maja 2012, 17:39

Nie wiem skąd, gdyż w podanym przez ciebie fragmencie kodu błędu nie ma i u mnie ten kod nie daje tego efektu. Nie wiem co ty tam porobiłeś. Potrzebuję więcej kodu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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: Przezroczysty forma lub panel ?

Nowy postprzez Corvis » czwartek, 3 maja 2012, 18:07

Baronie źle zrozumiałeś.

Taki efekt jak na zdjęciu musi być gdyż wrzuciłem 18 formatek i każda rysuje taki sam gradient :) Teraz muszę dopasować to żeby nie było znaku.

Moje pytanie dotyczyło dlaczego tutaj jest dzielenie:

KOD cpp:     UKRYJ  
this->Canvas->Brush->Color = RGB(191 - (Row/3), 216 - (Row/4), 237 - (Row/7) );


(Row/3) , (Row/4) ,(Row/7) - skąd to jest ??
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Przezroczysty forma lub panel ?

Nowy postprzez polymorphism » czwartek, 3 maja 2012, 18:14

Corvis, nie żartuj ;)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
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 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Przezroczysty forma lub panel ?

Nowy postprzez Corvis » czwartek, 3 maja 2012, 18:24

Nie żartuję :) czemu akurat 3,4,7 a nie 5,8,9 ??
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Przezroczysty forma lub panel ?

Nowy postprzez Cyfrowy Baron » czwartek, 3 maja 2012, 18:56

A zmień te liczby to zobaczysz. Kolor to składowe RGB, a każda składowa zawiera się w przedziale 0-255. Dzielenie zastosowałem po to by wyszedł gradient a nie jednolity kolor, ponieważ zmienna Row zawiera się w przedziale od 0 do 255 to muszę tak ograniczyć wartość odejmowaną by nie spadła poniżej 0 a gradient zawarł się pomiędzy zadanymi kolorami.

Weźmy ten fragment: 237 - (Row/7) dla Row = 0 wynik dzielenia wyniesie 0, ale dla Row = 255 wynik dzielenia wyniesie 36, więc w pierwszym przypadku od liczby 237 odejmuję 0, a w drugim odejmuję 36, dzięki temu uzyskuje gradient w przedziale koloru dla B = od 237 do 201. I tak powstaje gradient.

Co to tego znaku, to go nie zlikwidujesz, gdyż to efekt kontrastu między kolorami, musiałbyś tam rysować dokładnie taki sam gradient jak dla tych kontrolek i to dokładnie w tej samej pozycji. Nie jest dla mnie jednak jasne co ty tam po wyczyniałeś i skąd bierze się ten gradient?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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: Przezroczysty forma lub panel ?

Nowy postprzez Corvis » czwartek, 3 maja 2012, 21:03

Dzięki za wyjaśnienie już wszystko jasne :)

Cyfrowy Baron napisał(a):Nie jest dla mnie jednak jasne co ty tam po wyczyniałeś i skąd bierze się ten gradient?!


W załączniku dodałem jak to wygląda w środowisku Buildera. Jest TGridPanel na który wrzucam formatki które rysują jednakowy gradient. Dlatego daje to taki kontrast.

Teraz muszę pobrać odpowiednią wartość koloru jak zaznaczyłem na rysunku (A - kolor początkowy, B - kolor końcowy) i narysować gradient dla każdej kontrolki.

GridPanel.jpg
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

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