Delphi FAQ

Jak zmienić kształt formy

TeWuX

Aby zmienić kształt naszej formy z prostąkątnej na jakąś bardziej wymyślną skorzystamy z Regionów.

Dodajemy:

uses Windows;

Na początek zaokrąglimy brzegi naszej formy.

SetWindowRgn(Handle,CreateRoundRectRgn(0,0,Width+1,Height+1,12,12),true);

Teraz coś trudniejszego, zrobimy prostąkątną formę z okrągłą dziurą w środku:

procedure JakasTam;
var H1, H2 : hrgn;
 
begin
  H1:=CreateRectRgn(0,0,Width,Height);  // Tworzymy prostokątny region
  H2:=CreateEllipticRgn(50,50,200,200);   // teraz okrągły
  CombineRgn(H1,H1,H2,rgn_diff);    // odejmujemy regiony i zapisujemy w pierwszym
  SetWindowRgn(handle,H1,true);     // zatwierdzamy zmianę regionu formy;
end;

Opis użytych funkcji:

SetWindowRgn(Handle, HRegion, redraw);
Handle - (typ: handle) uchwyt do którego mają się odnosić zmiany
HRegion - (typ: HRGN) po prostu ustalony region
Redraw - (typ: boolean) ustaw na true jeśli zmiany mają być odrazu widoczne

CombineRgn(var H3, H1, H2, CombineMode);
H3 - (typ: HRGN) Region docelowy
H1 - (typ: HRGN) Region źródłowy 1
H2 - (typ: HRGN) Region źródłowy 2
CombineMode - rodzaj połączenia regionów H1 i H2
Rodzaje CombineMode:
RGN_AND = 1 - część wspólna z H1 i H2
RGN_OR = 2 - suma (H1 + H2)
RGN_XOR = 3 - rożnica sumy (H1 + H2) i części wspólnej
RGN_DIFF = 4 - różnica (H1 - H2)
RGN_COPY = 5 - ?? tylko wartość z H1

Funkcje tworzące HRegiony:
CreateEllipticRgn
CreateEllipticRgnIndirect
CreatePolyPolygonRgn
CreatePolygonRgn
CreateRectRgn
CreateRectRgnIndirect
CreateRoundRectRgn

FAQ

3 komentarzy

Waldi: a co to są te "ikony zamknij i maxymalizuj" ?? ikony ?

Sama zmiana kształtu formy oznacza że chcemy stworzyć już jakiś niestandardowy interfejs w naszym programie. Można zmienić BorderStyle na bsnone,a funkcje zamykania,maksymalizacji itp można przypisać jakimś przyciskom. Wiadomo np. że rózne wymyślne odtwarzacze mp3 (Winamp i reszta) nie korzysta ze standardowych przycisków minimalizacji, czy zamykania.

no dobra a jak zrobisz tak
SetWindowRgn(Handle,CreateRoundRectRgn(0,0,Width,Height,150,150),true);

albo zamiast 150 dasz 200 lub więcej to jak klikniesz w ikony zamknij maksymalizuj itd??