Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Градиентная заливка [D7, WinXP]


Юрий__________   (14.03.18 12:04

Здравствуйте форумчане,
необходимо линейным градиентом залить прямоугольник, прямоугольник с скругленными углами, эллипс, трехугольник.

Прямоугольник я залил. Как залить скажем эллипс?
Проблема с определением границ заливки.
Я вижу два варианта : 1. Описать элипс и т.д. математически и
если точка за пределами фигуры ее не закрашавать.
2. Закрасить прямоугольник градиентом и каким-то образом вырезать из него нужную фигуру. Как это сделать не знаю.
3. Может еще есть варианты?


RWolf ©   (14.03.18 12:11[1]

ну, Ellipse() в WinAPI есть, дело только за тем, чтобы подобрать маску для его наложения на прямоугольник, заранее закрашенный градиентом.


Игорь Шевченко ©   (14.03.18 13:07[2]

SelectClipRgn и прочие фукнции для управления отсечением.

Туча их:

https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd183436(v=vs.85).aspx


Pavia ©   (14.03.18 15:04[3]

http://www.crossgl.com/aggpas/macosx/gradients_contour.app.zip


Pavia ©   (14.03.18 15:04[4]

http://www.crossgl.com/aggpas/macosx/gradients_contour.app.zip


Redmond   (14.03.18 17:35[5]

> Pavia ©   (14.03.18 15:04) [3]

MacOS..? В теме пометка "WinXP". Может лучше тогда уж лучше отправлять на оригинал?: http://www.antigrain.com/demo/

Юрий__________, сперва надо определиться что и как именно вы делаете - чем вы пользуетесь, а чем нельзя пользоваться. VCL? WinAPI (GDI, GDI+, под оба)? Прочие сторонние библиотеки? Заливка своим алгоритмом "руками"?
Хотя одного VCL полагаю не хватит. Так что предварительный ответ:

1. Описать фигуру математически и закрашивать только если пиксель внутри фигуры - но вы потратите прилично времени чтоб это оптимизировать.
2. Закрасить прямоугольник градиентом, сделать такого же размера ч/б маску с фигурой - и рисовать куда требуется через битовую маску.
3. Покорячится с WinAPI функциями для рисования, плюс регионы и GradientFill().
4. Попробовать через GDI+.
5. Воспользоваться сторонними библиотеками, которые уже умеют это.


Игорь Шевченко ©   (14.03.18 22:16[6]

 BeginPath(SomeCanvas.Handle);
 Ellipse(SomeCanvas.Handle, ....);
 EndPath(SomeCanvas.Handle);
 Rgn := PathToRegion(SomeCanvas.Handle);
 SelectClipRgn(SomeCanvas.Handle, Rgn);
 GradientFill(SomeCanvas.Handle, ....);
 SelectClipRgn(SomeCanvas.Handle, 0);
 DeleteObject(Rgn);


dmk ©   (15.03.18 00:30[7]

Изучайте вектора.


dmk ©   (15.03.18 00:32[8]

По сути внешний контур - это Alpha-маска.
Закрашиваете прямоугольник, а потом выводите с маской сделанной из контура.


dmk ©   (15.03.18 01:15[9]

Вот векторная заливка в 3D:
https://yadi.sk/i/R2eitAvY3SJRKH
https://yadi.sk/i/-mirqdnf3TNz3p

В 2D проще делается.
Каждая точка считается отдельно.
Даже вдоль Безье залить можно.


Юрий__________   (16.03.18 18:31[10]

Спасибо,
сделал следующим  образом,
создал BMP в размер моего объекта, закрасил градиентом.
Затем создал маску и вырезал нужный участок.


Var
    Reg: hRGN;
    BMP,Fon : TBitMap;

   Begin

   try

    Fon:=TBitMap.Create;
    Fon.Width:=Width;
    Fon.Height:=Height;

    // Создаем второй BMP
    BMP := TBitMap.Create;
    BMP.Width:=Width;
    BMP.Height:=Height;
 

    // Градиентом заливаем объект Fon, цветом clBlue - моя процедура
    GradientBMP(Fon,clBlue);

    // Присваиваем фон
      BMP.Canvas.Brush.Bitmap:=Fon;

   

     // Создаю регион
    Case fTypeFigure of

    Rect :      Reg := CreateRectRgn(0, 0, Width-1, Height-1);
    Elipse :    Reg := CreateEllipticRgn (0, 0, Width-1, Height-1); // Создадим элипс
    RoundRect : Reg := CreateRoundRectRgn(0, 0, Width-1, Height-1,Width div 4,Height div 4);

    end; // Case
   

      // Прорисовываем регион
      PaintRgn (BMP.Canvas.Handle, Reg);

      // Рисуем окантовку региона
      BMP.Canvas.Brush.Color :=fColorPen;
      FrameRgn (BMP.Canvas.Handle, Reg, Bmp.Canvas.Brush.Handle, fWidthPen,fWidthPen);

      BMP.Transparent:=True;

     // Выведем на Канву - Can
     Can.Draw(Left,Top,BMP);

    finally

     Fon.Free;
     BMP.Free;
     DeleteObject (Reg);

    end;


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо