Formularz bez paska tytułowego z możliwością zmiany rozmiaru

dział ogólny

Formularz bez paska tytułowego z możliwością zmiany rozmiaru

Nowy postprzez Cyfrowy Baron » niedziela, 21 czerwca 2009, 18:25

Odpowiedź na pytanie zadane na Mini-Chat'cie.

W pliku nagłówkowym w sekcji private:

Unit1.h
Kod: Zaznacz cały
void __fastcall CreateParams(TCreateParams &Params);


w pliku źródłowym gdziekolwiek:

Unit1.cpp
Kod: Zaznacz cały
void __fastcall TForm1::CreateParams(TCreateParams &Params)
{
        TForm::CreateParams(Params);
        Params.Style &= ~WS_DLGFRAME;
        Params.Style |= WS_POPUP;
}
//---------------------------------------------------------------------------
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
    NieznanyNieznana

Re: Formularz bez paska tytułowego z możliwością zmiany rozmiaru

Nowy postprzez Michal-S2 » niedziela, 21 czerwca 2009, 22:46

Działa dobrze, ale teraz pozostaje problem innej ramki, która się nie wiadomo skąd pojawiła.
ramka.JPG


PS. Mam C++ Builder'a w wersji 6
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Najgorsze nieszczęścia w historii były spowodowane przez idealistów próbujących zmuszać ludzi do tego, "co dla nich dobre"
Bjarne Stroustrup - twórca c++
Avatar użytkownika
Michal-S2
Intelektryk
Intelektryk
 
Posty: 148
Dołączył(a): sobota, 19 lipca 2008, 13:03
Lokalizacja: Gdańsk
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional OEM 64bit
Kompilator: Turbo C++ Explorer
    NieznanyNieznana

Re: Formularz bez paska tytułowego z możliwością zmiany rozmiaru

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 22 czerwca 2009, 00:19

Jakiej znowu ramki. Ustaw BorderStyle formularza na bsSizeable i powinno być dobrze.
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
    NieznanyNieznana

Re: Formularz bez paska tytułowego z możliwością zmiany rozmiaru

Nowy postprzez Michal-S2 » poniedziaÅ‚ek, 22 czerwca 2009, 10:27

Mam tak ustawione, zaraz wrzucÄ™ pliki projektu i skompilowany plik to zobaczysz.
Najgorsze nieszczęścia w historii były spowodowane przez idealistów próbujących zmuszać ludzi do tego, "co dla nich dobre"
Bjarne Stroustrup - twórca c++
Avatar użytkownika
Michal-S2
Intelektryk
Intelektryk
 
Posty: 148
Dołączył(a): sobota, 19 lipca 2008, 13:03
Lokalizacja: Gdańsk
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional OEM 64bit
Kompilator: Turbo C++ Explorer
    NieznanyNieznana

Re: Formularz bez paska tytułowego z możliwością zmiany rozmiaru

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 22 czerwca 2009, 10:49

Już rozumiem o co Tobie chodzi, tylko dlaczego nie piszesz tego wprost.
Chcesz mieć okno bez obramowania z możliwością zmiany rozmiaru. Niestety jest to niemożliwe. Za zmianę rozmiaru okna odpowiada parametr WS_SIZEBOX, jest to rozszerzenie stylu klasy TCreateParms odpowiedzialnej za wszystkie aspekty wyglądu okna.
Możesz ustawić właściwość BorderStyle okna na bsNone i otrzymasz okno bez paska tytułowego i bez ramki, nie będziesz mógł zmieniać jego rozmiaru. Wykorzystując klasę TCreateParams można dodać do tak utworzonego okna styl WS_SIZEBOX umożliwiając w ten sposób zmianę rozmiaru tegoż okna po uchwyceniu jego krawędzi:

Kod: Zaznacz cały
/*
* BorderStyle = bsNone
*/
//---------------------------------------------------------------------------
void __fastcall TForm1::CreateParams(TCreateParams &Params)
{
        TForm::CreateParams(Params);
        Params.Style |= WS_SIZEBOX;
}


Tak więc stosując powyższy kod utworzymy okno bez paska tytułowego i bez ramki, rzecz jednak w tym, że styl WS_SIZEBOX dodaje do formularza (jak to sugeruje nazwa tego stylu) "obudowę" umożliwiającą zmianę rozmiaru, ta "obudowa" to też jest ramka.
Tak wiec możliwość zmiany rozmiaru formularza jest niestety nierozerwalnie związana z ramką.

Czy mam racjÄ™?

Można to sprawdzić. Wystarczy ustawić BorderStyle formularza na bsSizeable, w ten sposób formularz będzie miał belkę tytułową i będzie można zmieniać jego rozmiar. Jeżeli z pomocą klasy TCreateParams usuniemy mu obramowanie, które na dobrą sprawę nie zniknie, to stracimy również możliwość zmiany rozmiaru okna:

Kod: Zaznacz cały
/*
* BorderStyle = bsSizeable
*/
//---------------------------------------------------------------------------
void __fastcall TForm1::CreateParams(TCreateParams &Params)
{
        TForm::CreateParams(Params);
        Params.Style &= -WS_BORDER;
}


Kolejna ciekawostka. Ustawiamy BorderStyle na bsSizeable i usuwamy obramowanie:

Kod: Zaznacz cały
/*
* BorderStyle = bsSizeable
*/
//---------------------------------------------------------------------------
void __fastcall TForm1::CreateParams(TCreateParams &Params)
{
        TForm::CreateParams(Params);
        Params.Style |= WS_POPUP;
        Params.Style &= -WS_BORDER;
}


Okno nie ma ramki, ale nie ma też możliwości zmiany rozmiaru.
Dodajemy styl umożliwiający zmianę rozmiaru:

Kod: Zaznacz cały
/*
* BorderStyle = bsSizeable
*/
//---------------------------------------------------------------------------
void __fastcall TForm1::CreateParams(TCreateParams &Params)
{
        TForm::CreateParams(Params);
        Params.Style |= WS_POPUP;
        Params.Style &= -WS_BORDER;
        Params.Style |= WS_SIZEBOX;
}


Pojawia się ramka. Dzieje się tak dlatego, że ta ramka jest niezbędna do zmiany rozmiaru okna za pomocą myszki. Tak zostało do zapisane w API systemu Windows.
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
    NieznanyNieznana

Re: Formularz bez paska tytułowego z możliwością zmiany rozmiaru

Nowy postprzez Michal-S2 » poniedziaÅ‚ek, 22 czerwca 2009, 15:24

Dziękuję za tak wyczerpującą odpowiedz, ale mam jeszcze jedno pytanie. Czy da się zmienić styl, kolor, itp. tej ramki?
Najgorsze nieszczęścia w historii były spowodowane przez idealistów próbujących zmuszać ludzi do tego, "co dla nich dobre"
Bjarne Stroustrup - twórca c++
Avatar użytkownika
Michal-S2
Intelektryk
Intelektryk
 
Posty: 148
Dołączył(a): sobota, 19 lipca 2008, 13:03
Lokalizacja: Gdańsk
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional OEM 64bit
Kompilator: Turbo C++ Explorer
    NieznanyNieznana

Re: Formularz bez paska tytułowego z możliwością zmiany rozmiaru

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 22 czerwca 2009, 16:23

Da się poprzez zastosowanie takich technik podobnych do zmiany stylu systemu na np. Zune, tylko że dla własnego programu, a nie dla całego systemu. Jest to możliwe, ja niestety pomimo długich poszukiwań wciąż nie wiem jak się zmienia skórki okien i innych komponentów, więc nie pomogę.
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
    NieznanyNieznana


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