Wlasny styl okna

0

Czesc,
chcialbym troche uatrakcyjnic swoja aplikacje zeby nie byla zbyt szablonowa i windowsowa. Pomyslalem, ze nadam jej jakis styl. Znalazlem nawet gotowe style, szablony ale wszystko jest platne albo nie ma wersji dla Lazarus.

Wpadl mi w oko styl jak w zalaczniku.

Oczywiscie na razie nie bede placic za zadne gotowce kiedy moge sprobowac napisac cos takiego sam. Nie mam jednak pojecia jak sie za to zabrac. Googlowalem troche ale znalazlem w wiekszosci ogolniki ktore za duzo mi nie powiedzialy.

Przerobic tlo albo do pewno stopnia buttony bylbym w stanie jednak mam problem z cala reszta.

Mozecie mi podpowiedziec jak zabrac sie w ogole za probem zmiany stylu/kolorystyki 'naglowka' okna, albo przyciskow minimalizuj/maksymalizuj/zamknij?

Jezeli chcialbym zmienic styl Tabow albo StringGrida to powinienem napisac wlasna kontrolke czy moge jakos przerobic te istniejace?

Nie mam w ogole pojecia jak sie za to zabrac;) Prosze o pomoc.

2

Ok, dla przyszlych pokolen. Udalo mi sie znalezc na razie cos takiego ;)

Creating Forms with Custom Title Bars (Part I)
http://www.mindspring.com/~cityzoo/text/ttlbar1.html

Creating Forms with Custom Title Bars (Part II)
http://www.mindspring.com/~cityzoo/text/ttlbar2.html

Creating Forms with Custom Title Bars (Part III)
http://www.mindspring.com/~cityzoo/text/ttlbar3.html

0

Możesz podejść do tematu inaczej, czyli ustawić ramkę na bsNone i samemu rysować powierzchnię formularza; Minus jest taki, że znikają standardowe guziki z prawego górnego rogu, znika obsługa przeciągania okna po ekranie (i rozciągania) oraz ikonka z lewego górnego rogu, a wraz z nią menu kontekstowe (możliwe do wywołania również za pomocą kombinacji Alt+Space); Na pewno coś jeszcze przeoczyłem :]

W każdym razie, jeśli nie ogarniasz Win32 API i/lub nie chcesz godzinami rzeźbić w nim niezrozumiałych setek linii kodu to skorzystaj z prostszych sposobów;

PS: Zmieniłeś póki co jedynie obramowanie okna, a co z jego zawartością?

0

Obsługę przeciągania można dość łatwo zaimplementować.

  Form1=class(TForm)
  ...
  private
    { private declarations }
    XPos, YPos: Integer;
    Moving: Boolean;

procedure TForm1.Form1MouseDown(Sender: TOBject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  XPos:=X;
  YPos:=Y;
  Moving:=True;
end;

procedure TForm1.Form1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  If Moving then Form1.Left:=Form1.Left+X-XPos;
  If Moving then Form1.Top:=Form1.Top+Y-YPos;
end;

procedure TForm1.Form1MouseUp(Sender: TOBject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Moving:=False;
end;

albo tak

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const
  SC_DRAGMOVE = $F012;
begin
  if Button = mbLeft then
  begin
    ReleaseCapture;
    Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
  end;
end;

Mozna tez dodac wykrywanie czy myszka zostala kliknieta np nad rysowanym przez nas title barem :)

Czyli można potraktować formularz jako np wielki Canvas i rysowac po nim np buttony etc?

Nie wiem czy dobrze to zrozumialem i czy dobrze rozumiem 'rysowac' :)

Co do zawartosci okna to caly czas szukam info jak zmieniac buttony, stringgridy itp. i widze, ze sporo roboty z tym bedzie. Moglbys przytoczyc jakie sa prostsze sposoby na ogarniecie tego tematu? Wykuczajac korzystanie z gotowych szablonow bo chce sie czegos nauczyc ;)

//edit

Z tego co doczytalem to mozna np uzyc komponentow juz istniejacych np TBitBtn i nadpisac CN_DRAWITEM.

Wiem, ze co do TitleBara to mozna nadpisac np:

•WM_NCCREATE - Modify window style & store caption size.
•WM_NCCALCSIZE - Return adjusted size of window client area.
•WM_NCHITTEST - Determine if the mouse is over the title bar.
•WM_NCLBUTTONDBLCLK - Close the window if the mouse is over system menu button.
•WM_NCLBUTTONDOWN - Show system menu or handle minimize & maximize.
•WM_NCPAINT - Repaint the non-client area.
•WM_NCACTIVATE - Change the title bar color to indicate active/inactive

Nigdy nie walczylem z takim tematem wiec strasznie mnie to przygniata poki co.

Mozna uzyc tez 'gotowcow' np http://wiki.freepascal.org/BGRAControls#TBCButton
ale nie wiem czy by mnie to zadowolilo ;)

0

Przesuwanie formą to akurat wystarczy tyle:

if Button = mbLeft then
begin
  ReleaseCapture();
  SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
end;

Mozna tez dodac wykrywanie czy myszka zostala kliknieta np nad rysowanym przez nas title barem

Nie tyle można, co należy; Jakiś czas temu była na ten temat dyskusja w tym dziale; Są w niej przykładowe kodu implementacji przesuwania i rozciągania formularza bez systemowego obramowania; Poszukaj sobie tego wątku - @kAzek podał tam fajne i krótkie rozwiązanie;

Czyli można potraktować formularz jako np wielki Canvas i rysowac po nim np buttony etc?

Możesz rysować na płótnie co tylko chcesz; Jednak pamiętaj, że jeśli nie użyjesz jakichś komponentów i będziesz tylko malował jakieś przyciski na kanwie to będziesz musiał również zaprogramować ich własną obsługę, bo w takim przypadku system nie będzie dostarczał standardowych komunikatów (formularz też nie);

Sugeruję jednak trzymać się standardowej konstrukcji aplikacji okienkowych, czyli normalnych komponentów; W przeciwnym razie będziesz musiał napisać własny LCL :]

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