Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Создание формы произвольного вида...

Автор: b13st 13.11.2006 21:41

Вобщем, я делаю форму произвольного вида, вот таким способом (в данном случае круглую):

 R1 := CreateElliPticRgn(0,0,100,100);
SetWindowRgn(Handle, R1, True);


и я хочу сделать вокруг нее оборку (как бы подчеркнуть границу формы), вот так -
	 Canvas.Brush.Color := clBlack; 
FrameRgn (Canvas.Handle, R1, Canvas.Brush.Handle, 2, 2);


Но в результате ни чего не изменилось - получается та же форма без оборки..
Собственно сам вопрос - как сделать вокруг формы рамку (оборку)?

Автор: volvo 13.11.2006 21:46

Где находится у тебя код с FrameRgn ? Должен быть в OnPaint ...

Автор: b13st 13.11.2006 22:15

 	   R1 := CreateElliPticRgn(0,0,100,100);
SetWindowRgn(Handle, R1, True);
-
в OnCreate, а
 	 Canvas.Brush.Color := clBlack;
FrameRgn (Canvas.Handle, R1, Canvas.Brush.Handle, 2, 2);

в OnPaint.

Автор: мисс_граффити 13.11.2006 22:39

а если форму свернуть/развернуть - появится оборка?

Автор: b13st 13.11.2006 23:29

Цитата
если форму свернуть/развернуть - появится оборка?


нет, ничего не происходит...

Автор: volvo 14.11.2006 1:12

И не будет...

Читаем здесь: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/pantdraw_2him.asp

Цитата
After a successful call to SetWindowRgn, the system owns the region specified by the region handle hRgn. The system does not make a copy of the region. Thus, you should not make any further function calls with this region handle. In particular, do not delete this region handle. The system deletes the region handle when it no longer needed.


Попробуй это:
procedure TForm1.FormCreate(Sender: TObject);
var
region: HRGN;
begin
BorderStyle := bsNone;
region := CreateEllipticRgn(0, 0, 100, 100);
SetWindowRgn(Handle, region, True);
end;

procedure TForm1.FormPaint(Sender: TObject);
var
T: HRGN;
begin
Canvas.Brush.Color := clBlack;

T := CreateEllipticRgn(0, 0, 100, 100);
try
FrameRgn(Canvas.Handle, TempRgn, Canvas.Brush.Handle, 2, 2);
finally
DeleteObject(TempRgn);
end;

end;

Автор: b13st 14.11.2006 1:59

volvo, спасибо.