![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как нарисовать на канвасе полумесяц? [D7]
Canvas © (2005-11-15 02:14:00)Какой функцией? Или такой нету?
Джо (2005-11-16 03:16:00) [1]Писал наспех, поэтому не делал блоков try/finally, просто пример, доработай его.
Джо (2005-11-16 03:14:00) [2]
> [13] Canvas (16.11.05 02:53)
Тут просто берется из GDI готовое перо черного цвета, это просто чтобы упростить код. Код, имеющий более практическое применение выглядел бы примерно так:
procedure DrawHalfMoonShape (ACanvas: TCanvas; Left,Top,Radius: Integer);
var
Dc: HDC;
Rgn1,
Rgn2: HRGN;
begin
Dc := ACanvas.Handle;
Rgn1 := CreateEllipticRgn(Left-Radius,Top-Radius,Left+Radius,Top+Radius);
if Rgn1 = 0 then
RaiseLastOSError;
Inc (Left, Radius div 5);
Dec (Top, Radius div 5);
Dec(Radius,Radius div 5);
Rgn2 := CreateEllipticRgn(Left-Radius,Top-Radius,Left+Radius,Top+Radius);
if Rgn2 = 0 then
RaiseLastOSError;
if CombineRgn(Rgn1,Rgn1,Rgn2,RGN_DIFF) = ERROR then
RaiseLastOSError;
if not FillRgn(DC,RGN1,ACanvas.Brush.Handle) then
RaiseLastOSError;
if not FrameRgn(DC,Rgn1,ACanvas.Pen.Handle,ACanvas.Pen.Width,ACanvas.Pen.Width) then
RaiseLastOSError;
DeleteObject (Rgn1);
DeleteObject (Rgn2);
end;
А кисть и перо устанавливаем для канвы перед вызовом процедуры:
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Canvas.Brush.Style := bsSolid;
Image1.Canvas.Brush.Color := clTeal;
Image1.Canvas.Pen.Style := psSolid;
Image1.Canvas.Pen.Color := clRed;
DrawHalfMoonShape(Image1.Canvas,100,100,50);
end;
Canvas (2005-11-16 02:53:00) [3]
> Джо © (15.11.05 03:43) [5]
> FrameRgn(DC,Rgn1,GetStockObject(BLACK_BRUSH),1,1);
А как цвет поменять в этой строчке? Чтобы не чёрный, а бежевый, или ещё какой?
И, кстати, спасибо! Помогло.
Джо (2005-11-15 05:06:00) [4]
> Форму Земли не знаешь, что-ли ? Шар она. Примерно.
Я знаю форму Земли. И именно поэтому я могу ее нарисовать. Не знал бы формы - не мог бы нарисовать.
П.С. Форма Земли - не шар. Но, весьма примерно-таки - шар =)
Canvas (2005-11-15 04:56:00) [5]
> Джо © (15.11.05 04:48) [10]
>
>
> > [9] Canvas (15.11.05 04:43)
> > Посчитать - последнее дело. Главное - нарисовать!
>
> Как можно нарисовать то, форму чего не знаешь?
Примерно.
Форму Земли не знаешь, что-ли ? Шар она. Примерно.
Джо (2005-11-15 04:48:00) [6]
> [9] Canvas (15.11.05 04:43)
> Посчитать - последнее дело. Главное - нарисовать!
Как можно нарисовать то, форму чего не знаешь?
Canvas (2005-11-15 04:43:00) [7]
> Джо © (15.11.05 04:13) [7]
>
>
> > [6] Canvas (15.11.05 04:08)
>
> Ну, тогда, "нарисовать", имхо - последний вопрос. Сначала
> нужно выяснить, как ее посчитать, а потом уже рисовать.
Посчитать - последнее дело. Главное - нарисовать!
Джо (2005-11-15 04:17:00) [8]Не знаю, до чего там дошли, но вот ссылка на обсуждение алгоритмов:
http://www.astronomy.ru/forum/index.php?board=9;action=display;threadid=1176
Джо (2005-11-15 04:13:00) [9]
> [6] Canvas (15.11.05 04:08)
Ну, тогда, "нарисовать", имхо - последний вопрос. Сначала нужно выяснить, как ее посчитать, а потом уже рисовать.
Canvas (2005-11-15 04:08:00) [10]
> Джо © (15.11.05 03:43) [5]
> Или нужно не "стилизованное", а именно фазы луны изображать?
Фазы!
Там день такой-то - такая то луна, такой то - такая ...
Джо (2005-11-15 03:43:00) [11]Что-то я путанно, похоже изъяснился. Проиллюстрирую примерным кодом (в нем нет обработки ошибок и возможны ляпы, просто иллюстрация):
procedure DrawHalfMoonShape (Dc: HDC; Left,Top,Radius: Integer);
var
Rgn1,
Rgn2: HRGN;
begin
Rgn1 := CreateEllipticRgn(Left-Radius,Top-Radius,Left+Radius,Top+Radius);
Inc (Left, Radius div 5);
Dec (Top, Radius div 5);
Dec(Radius,Radius div 5);
Rgn2 := CreateEllipticRgn(Left-Radius,Top-Radius,Left+Radius,Top+Radius);
CombineRgn(Rgn1,Rgn1,Rgn2,RGN_DIFF);
FrameRgn(DC,Rgn1,GetStockObject(BLACK_BRUSH),1,1);
DeleteObject (Rgn1);
DeleteObject (Rgn2);
end;
Рисуем стилизованное изображение полумесяца на TImage:
procedure TForm1.Button1Click(Sender: TObject);
begin
DrawHalfMoonShape(Image1.Canvas.Handle,100,100,50);
end;
Или нужно не "стилизованное", а именно фазы луны изображать?
Джо (2005-11-15 03:32:00) [12]Но, конечно, все зависит от того, какая именно фигура понимается под полумесяцем.
Джо (2005-11-15 03:30:00) [13]1. Создаешь 2 еллиптических региона функцией CreateEllipticRgn. Один из них должен "накладываться" на другой соответствующим образом.
2. "Вырезаешь" из одной окружности другую функцией CombineRgn с флагом RGN_DIFF (уточни по MSDN).
3. Рисуешь получившийся "обрезанный" регион функциями FillRgn и/или FrameRgn.
Ну, примерно, так бы я действовал.
Canvas (2005-11-15 03:09:00) [14]А может уроком по астрономии?
Германн (2005-11-15 02:31:00) [15]2 Canvas (15.11.05 02:14)
Ты озабочен религией?