Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Непрямоугольные формы

0 views
Skip to first unread message

Vladimir Shishkin

unread,
May 18, 1999, 3:00:00 AM5/18/99
to
Hi, All!
Подскажите каким образом можно создавать "непрямоугольные" формы. Например
как в Kai Power Tools (типа циферблата) т.е. на основе некоторого контура?
Киньте примерчик, pls или ссылочку где можно посмотреть.
Bye!
VSh

Anton Saburov

unread,
May 18, 1999, 3:00:00 AM5/18/99
to

Vladimir Shishkin пишет в сообщении <7hrj5n$sdp$1...@px.f1.ru> ...


Ответ на этоот вопрос можно найти в FAQ
Их лежит несколько штук на http://delphi.da.ru
По-моему интересный примерчик в FAQ
"Использование Windows API и VCL" от Akzhan'а

Anton S.
an...@lanck.ru

"I hope ..."

Anton Saburov

unread,
May 18, 1999, 3:00:00 AM5/18/99
to

Vladimir Shishkin пишет в сообщении <7hrj5n$sdp$1...@px.f1.ru> ...
>Hi, All!
>Подскажите каким образом можно создавать "непрямоугольные" формы. Например
>как в Kai Power Tools (типа циферблата) т.е. на основе некоторого контура?
>Киньте примерчик, pls или ссылочку где можно посмотреть.


Вот еще на закуску (FAQ от Nick Slepchenko)

> Как сделать произвольную (непрямоугольную) форму?

Win32 (Windows'95 or Windows NT 4.0 or above).
Достаточно создать регион нужной формы и вызвать SetWindowRgn -
HRGN rgn := CreateEllipticRgn( 10,10,100,100 );
SetWindowRgn( hMyWnd,rgn ); // Вот и будет круглое окно
При этом регион этот теперь используется Windows и будет уничтожен при
закрытии окна.

Вот, например:
........................................................
procedure TForm1.FormCreate(Sender: TObject);
const W=36*pi/180;
var R,R1,R2: HRgn; X,Y,i:integer;
function S(a:integer;R:integer):integer;
begin
Result:=round(R*sin(W*a));
end;
function C(a:integer;R:integer):integer;
begin
Result:=round(R*cos(W*a));
end;
function GetStarReg(X,Y,R:integer):HRGN;
var P : array [0..4] of TPoint;
begin
P[0] := Point(X, Y-R);
P[1] := Point(X-S(4,R), Y-C(4,R));
P[2] := Point(X-S(8,R), Y-C(8,R));
P[3] := Point(X-S(2,R), Y-C(2,R));
P[4] := Point(X-S(6,R), Y-C(6,R));
Result := CreatePolygonRgn(P, 5, WINDING);
end;
begin
X:=Width div 2;
Y:=Height div 2;
R:=GetStarReg(X,Y,100);
i:=1;
repeat
R1:=GetStarReg(X-S(i,120),Y-C(i,110),40);
CombineRgn(R,R,R1,RGN_OR);
inc(i,2);
until i>9;
R1:=GetStarReg(X,Y,30);
CombineRgn(R,R,R1,RGN_DIFF);
R1:=CreateEllipticRgn(3,3,Width-6,Height-6);
R2:=CreateEllipticRgn(20,10,Width-20,Height-10);
CombineRgn(R1,R1,R2,RGN_DIFF);
CombineRgn(R,R,R1,RGN_OR);
SetWindowRgn(Handle, R, True);
end;

gvgss

unread,
May 19, 1999, 3:00:00 AM5/19/99
to
Добрый день !

In <7hrj5n$sdp$1...@px.f1.ru> Vladimir Shishkin (sh...@valley.ru) wrote:
> Hi, All!
> Подскажите каким образом можно создавать "непрямоугольные" формы. Например
> как в Kai Power Tools (типа циферблата) т.е. на основе некоторого контура?
> Киньте примерчик, pls или ссылочку где можно посмотреть.

> Bye!
> VSh

несколько дней назад народ писал :


In <7gcijo$qvc$1...@merryer.comcent.nikolaev.ua> Родион Тарабанов (u...@comcent.mk.ua) wrote:
> Sergey Teliatnik пишет в сообщении <7gbf5a$5fh$2...@conjurer.tyumen.ru> ...
>>Можно ли создать дочернюю панель не в виде прямоугольника, а в виде
> например
>>треугольника.
>>
> Да можно.
> В книге С. Орлика "Секреты Delphi" приведен небольшой пример относительно
> создания окна с дыркой.

> ...
> var
> FormRgn: HRGN;
> EllRgn:HRGN;
> ...
> procedure Form1.Create(sender: TObject);
> begin

> {область совпадающая с окном}
> FormRgn:= CreateRectRgn(0,0, Width, Height);

> {область дырки}
> EllRgn := CreateEllipticRgn(....);

> {Вырезаем дырку в окне}
> CombaineRgn(FormRgn, FormRgn, EllRgn, RGN_DIFF);

> {Присваеваем область окну}
> SetWindowRgn(Handle, FormRgn, True);
> end;

> procedure TForm1.FormDestroy(sender: TObject);
> begin
> deleteObject(FormRgn);
> deleteObject(EllRgn);
> end;

> конец цитаты.

> Очевидно, что для создания треугольных окон и иже с ними (Windowed Controls)
> необходимо использовать такие функции API как:

> CombineRgn
> CreateEllipticRgn
> CreateEllipticRgnIndirect
> CreatePolygonRgn
> CreatePolyPolygonRgn
> CreateRectRgn
> CreateRectRgnIndirect
> CreateRoundRectRgn
> EqualRgn
> ExtCreateRegion
> FillRgn
> FrameRgn
> GetPolyFillMode
> GetRegionData
> GetRgnBox
> InvertRgn
> OffsetRgn
> PaintRgn
> PtInRegion
> RectInRegion
> SetPolyFillMode

> Подробнее см хелп.

> BR Rodion


С Уважением.
Лукин Виктор.


Bunin Oleg

unread,
May 19, 1999, 3:00:00 AM5/19/99
to
Vladimir Shishkin пишет в сообщении <7hrj5n$sdp$1...@px.f1.ru> ...
>Hi, All!
>Подскажите каким образом можно создавать "непрямоугольные" формы. Например
>как в Kai Power Tools (типа циферблата) т.е. на основе некоторого контура?
>Киньте примерчик, pls или ссылочку где можно посмотреть.
>Bye!
>VSh


ftp://sunsite.icm.edu.pl:/vol/wojsyl3/delphi/ftp/d20free/formrgn.zip

0 new messages