CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Pojawianie się formularza

Pojawianie się formularza

dział ogólny

Pojawianie się formularza

Nowy postprzez Pitek » poniedziałek, 1 listopada 2010, 16:33

Witam !
Chciałbym zrobić coś takiego aby formularz programu otwierał się w taki sposób alby stopniowo malała jego przezroczystość (stopniowo się pokazywał).
Czy jest to temat prosty, czy trzeba jednak wykombinować jakąś zawiłą funkcję której w ogóle nie zrozumie?
Nie mam pojęcia do jakiego parametru się odwołać. Zauważyłem że program Babilon Cyfrowego Barona zachowuje się w sposób o jaki chodzi.
Czy można potem sterować szybkością pojawiania się?

P.S. Przepraszam Baronie ponieważ pojawiłem się na chat'cie a potem ścięło mi net i głupio wyszło :(
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Pojawianie się formularza

Nowy postprzez Cyfrowy Baron » poniedziałek, 1 listopada 2010, 17:19

To bardzo proste. Ustawiasz właściwość AlphaBlend formularza na true. Właściwość AlphaBlendValue ustawiasz np. na 1. Właściwość AlphaBlend włącza przeźroczystość formularza w stopniu określonym we właściwości AlphaBlendValue, przy czym wartość 0 to formularz całkowicie przeźroczysty, a 255 to nieprzeźroczysty. Pośrednie wartości określają stopień przeźroczystości. Kanały alpha w okienkach są obsługiwane przez system Windows począwszy od wersji XP. W Win 2k chyba też, ale pewien nie jestem. Wcześniejsze wersje nie obsługują kanałów alpha.
Umieszczasz na formularzu komponent Timer1 typu TTimer, ustawiasz mu właściwość Enabled na true, a Interval np. na 40.
W zdarzeniu OnTimer obiektu Timer1 zmieniasz stopień przeźroczystości formularza:


KOD cpp:     UKRYJ  
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 if(this->AlphaBlendValue < 238)
 {
  this->AlphaBlendValue += 34;
 }
 else
 {
  this->AlphaBlendValue = 255;
  Timer1->Enabled = false;
 }
}


Dobrana przeze mnie szybkość wyłaniania się okna jest chyba najbardziej optymalna, nie za szybko i nie za wolno. Szybkością wyłaniania możesz sterować zmieniając właściwość Interval obiektu Timer1, ale zbyt duża wartość sprawi, że okno będzie wyłaniać się skokowo. Przy zmianie szybkości wyłaniania lepiej jest zmieniać wartość dodawaną do AlphaBlendValue, przy czym powinna to być wartość podzielna bez reszty przez wartość podaną w warunku. W przykładzie dodawana jest wartość 34, gdyż 238 : 34 = 7, czyli zegar wykona siedem cykli po których przeźroczystość zostanie całkowicie wyłączona.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Pitek
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: Pojawianie się formularza

Nowy postprzez Pitek » poniedziałek, 1 listopada 2010, 19:37

A jak ten myk zastosować przy zamykaniu programu bo sprawdzanie w zdarzeniu onClose formularza głównego czy jego AlphaBlendValue przybrała wartość 0 nie działa. Program co prawda "zanika" ale potem się nie zamyka.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Pojawianie się formularza

Nowy postprzez Cyfrowy Baron » poniedziałek, 1 listopada 2010, 21:38

Nie polecam tej sztuczki przy zamykani. Po wybraniu przez użytkownika polecenia zamknięcia program powinien po prostu jak najszybciej zakończyć działanie bez udziwnień. Jeżeli się upierasz przy tym, to wymaga to użycia zdarzenia OnCloseQuery i zmiennej sterującej. W zdarzeniu tylko uruchamiasz zegar. Pokombinuje! Jak sobie nie poradzisz to pomogę, ale dopiero jutro, gdyż dziś już mi się nie chce.
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

Sterowanie przeźroczystością formularza - AlphaBelndValue

Nowy postprzez Cyfrowy Baron » wtorek, 2 listopada 2010, 08:52

Podaję gotowe rozwiązanie:

Plik nagłówkowy np. Unit1.h:
KOD cpp:     UKRYJ  
private:
        bool close, timeSwitch;


Plik źródlowy np. Unit1.cpp:
KOD cpp:     UKRYJ  
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 close = false;
 timeSwitch = false;
 AlphaBlend = true;
 AlphaBlendValue = 1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 if(timeSwitch)
 {
    if(this->AlphaBlendValue > 34)
    {
     this->AlphaBlendValue -= 34;
    }
    else
    {
     this->AlphaBlendValue = 1;
     Timer1->Enabled = false;
     close = true;
     Close();
    }
 }
 else
 {
    if(this->AlphaBlendValue < 238)
    {
     this->AlphaBlendValue += 34;
    }
    else
    {
     this->AlphaBlendValue = 255;
     Timer1->Enabled = false;
    }
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
 timeSwitch = true;
 Timer1->Enabled = !close;
 CanClose = close;
}
//---------------------------------------------------------------------------


Wyjaśnienie:
Zmienna CanClose występująca jako argument funkcji-zdarzenia OnCloseQuery dla formularza, w zależności od przyjętej wartości decyduje o tym czy można zamknąć okno czy nie. Jeżeli przekażesz zmiennej wartość false, to okno się nie zamknie. By je zamknąć trzeba przekazać jej wartość true, która to wartość jest domyślną dla tej zmiennej.

W przykładzie przy próbie zamknięcia programu wywoływane jest zdarzenie OnCloseQuery, a tam:
  1. przestawiana jest zmienna sterująca timeSwitch decydująca o tym, który kod wykona się w zdarzeniu OnTimer obiektu Timer1. Przy wartości timeSwitch = false; zdarzenie OnTimer będzie realizować kod zmniejszający przeźroczystość, przy true - zwiększający,
  2. właściwość Enabled obiektu Timer1 ustawiana jest na wartość odwrotną od wartości zmiennej close, po uruchomieniu programu zmienna close przyjmuje wartość false, więc przy zamknięciu właściwość Enabled przyjmuje wartość odwrotną, a więc true, co uruchamia zegar,
  3. zmiennej CanClose przypisana zostaje wartość zmiennej close, czyli false, więc okno się nie zamknie.
  4. w zdarzeniu OnTimer zegar sprawdza wartość zmiennej timeSwitch, a ponieważ teraz ta zmienna ma wartość true, to wykonywany jest kod zwiększajacy przeźroczystość - patrz pkt. 1,
  5. gdy warunek if(this->AlphaBlendValue > 34) dobrnie do końca, czyli nie jest już spełniany wykonywany jest kod w bloku else, a tam Timer1 jest zatrzymywany, zmienna close przyjmuje wartość true i wywołana jest funkcja Close() nakazująca zamknięcie okna programu, co znów wywołuje zdarzenie OnCloseQuery,
  6. teraz jednak w zdarzeniu OnCloseQuery właściwość Enabled obiektu Timer1 ustawiana jest na wartość odwrotną od wartości zmiennej close, a ponieważ teraz ta zmienna ma wartość true - patrz pkt. 5, więc Enabled = false; a co za tym idzie zegar nie jest już uruchamiany,
  7. zmiennej CanClose przypisana zostaje wartość zmiennej close, tym razem jednak jest to już wartość true, a wiec okno zostanie zamknięte, a ponieważ jest to główne okno programu, więc program zakończy działanie.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Pitek
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


  • 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 5 gości