Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
stanilar
Стрелочки можно нарисовать на холсте того компонента, на котором лежат Ваши наследники панели.

А как сделать, чтоб стрелочки были поверх этих самых наследников (в том числе и всяких лейблов, имеджей и прочего, что я могу напихать в свой компонент позже).
29 авг 19, 16:35    [21959997]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
stanilar
Member

Откуда: Спб
Сообщений: 850
asviridenkov,

В твоем случае один и тот же атрибут, для одного и того же элемента будет устанавливается не только из нескольких разных участков кода, но и из нескольких разных типов файлов (js, css, html).
29 авг 19, 16:47    [21960007]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
stanilar
Member

Откуда: Спб
Сообщений: 850
Андрей Игоревич
"для себя"

Думаю что "для себя", если ты не планируешь стать гуру программирования вин-апи, есть задачи и поинтересней и более востребованней.

Андрей Игоревич
Ну и другие вещи (всякие скругленные бары и прочее) они рисует просто прекрасно
у него свой алгоритм рисования. Разницу в картинках не вижу, но предполагаю что на ТееChart для 10-ки, по умолчанию, включено сглаживание для графиков.
29 авг 19, 16:58    [21960014]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
stanilar
Андрей Игоревич
"для себя"

Думаю что "для себя", если ты не планируешь стать гуру программирования вин-апи, есть задачи и поинтересней и более востребованней.
Яж прикладную задачу решить хочу, и хочу "чтоб было красиво (и удобно)" :), потому тыкаюсь в то, что удается найти или что вычитал. Но да, многие пути оказываются слишком сложными.
stanilar
Андрей Игоревич
Ну и другие вещи (всякие скругленные бары и прочее) они рисует просто прекрасно
у него свой алгоритм рисования. Разницу в картинках не вижу, но предполагаю что на ТееChart для 10-ки, по умолчанию, включено сглаживание для графиков.

А я как-то могу "включить" эту функцию сглаживания для своих рисований на канвасе?
П.С. На картинках очень большая разница, может у вас браузер сглаживает или масштабирует?
29 авг 19, 17:25    [21960027]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
asviridenkov
Member

Откуда:
Сообщений: 3950
Андрей Игоревич
А я как-то могу "включить" эту функцию сглаживания для своих рисований на канвасе?


Я уже писал, GDI+ или Direct2D
29 авг 19, 17:36    [21960036]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
asviridenkov
Андрей Игоревич
А я как-то могу "включить" эту функцию сглаживания для своих рисований на канвасе?

Я уже писал, GDI+ или Direct2D
asviridenkov
При желании, за пол года вполне сможете сделать нормальную версию.

Ладно, обойдусь пока без сглаживания... :)
29 авг 19, 18:06    [21960055]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
stanilar
Member

Откуда: Спб
Сообщений: 850
asviridenkov
Я уже писал, GDI+ или Direct2D


Вроде у вин-контролов есть процедура, в котором они сами себя нарисовать могут. Можно самому алгоритм сглаживания написать. И не обязательно за пол года. Задача то сглаживать стрелочки? Такую, может быть, можно и из учебника скопипастить.
29 авг 19, 19:13    [21960100]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Я вот совсем чуть поковырялся с наследниками TGraphicControl (ну для примера тот же Image или SpeedButton) и такой вопрос возник, как же его на передний план выносить выше панелей, это же по сути рисунки. В интернете предлагают способы которые опять перекрывает другие компоненты. Пока вот не могу придумать. Есть ли возможность создать какой-нибудь невидимый слой, которые не перекрывает компоненты?
29 авг 19, 21:25    [21960146]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
DimaBr
Member

Откуда:
Сообщений: 11322
Все ваши шестиугольники и стрелочки - TGraphicsControl, а ПОЛЕ на котором они в конечно итоге нарисованы - TWinControl.
29 авг 19, 21:30    [21960150]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
DimaBr
Все ваши шестиугольники и стрелочки - TGraphicsControl, а ПОЛЕ на котором они в конечно итоге нарисованы - TWinControl.

Я понимаю (это очевидно), но как я понял из написанного, мне предлагают отказаться от TWinControl использовав для рисования стрелок сразу TGraphicsControl на Форме/Большой Панели. Так как 3+ сотни TWinControl - это плохо.
Отказываться от панелей под шестигранники не хочется, они удобные. А вот как стрелочки поверх нарисовать без TWinControl под них пока не понял.
29 авг 19, 21:41    [21960155]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
DimaBr
Member

Откуда:
Сообщений: 11322
автор
Отказываться от панелей под шестигранники не хочется, они удобные.

Что именно удобного ?
автор
А вот как стрелочки поверх нарисовать без TWinControl под них пока не понял.

Графические Стрелочки могут быть нарисованы на Оконном контроле. Чтобы они были поверх шестиугольников, сами шестиугольники должны быть графическими.
29 авг 19, 21:52    [21960158]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
DimaBr
автор
Отказываться от панелей под шестигранники не хочется, они удобные.

Что именно удобного ?

Ну основное что на них будет несколько label и image (на котором буду рисовать другие картинки (не стрелочки, но вместе со стрелочками)), может потом ещё что-то буду добавлять из компонентов (там много всего разного в зависимости от загруженных данных). Которые я просто кинул на панель и дальше мне только саму панельку двигать и больше ни о чем не думать (в картинках примерах я показал что у меня всё двигается, перемещается и перетаскивается, маштабируется, сейчас сделано через взаимные связи координат).
На что ещё можно кинуть другие компоненты и при этом, что бы можно было обрезать компонент по контуру (шестиугольник)? Ещё на панель удобно перетаскивать мышкой чрез предельно простые две строчки кода.

DimaBr
автор
А вот как стрелочки поверх нарисовать без TWinControl под них пока не понял.

Графические Стрелочки могут быть нарисованы на Оконном контроле. Чтобы они были поверх шестиугольников, сами шестиугольники должны быть графическими.
И это мало чем будет отличаться от того, что рисую я сейчас, просто перехват координат на рисунке и события будет сам делфи делать.

Я хочу, что бы была возможность навести/кликнуть на любое число/рисунок и увидеть дополнительную информацию, по сути у меня получилось почти всё, кроме треклятых стрелочек :).
29 авг 19, 22:38    [21960178]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Я тут подумал, что может не очень точно выразился в часть "не блокирует взаимодействие", то место где сами стрелки находятся, там можно и блокировать взаимодействие(это не очень важно), просто все доступные способы рисования стрелки блокируют не только контур стрелки, но и весь прямоугольник в который она вписана.
В принципе я могу обрезать панель чуть шире стрелки и сделать её прозрачной, по крайней мере то ужасное обрезание лесенками не будет видно. Но это всё равно приведет у нескольким сотням ВиндКонтролов.
29 авг 19, 22:48    [21960180]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
DimaBr
Member

Откуда:
Сообщений: 11322
автор
Ну основное что на них будет несколько label и image (на котором буду рисовать другие картинки

Зачем кидать какие то дополнительные контролы ? Не проще ли просто вывести текст и картинку поверх шестиугольника ?

автор
Я хочу, что бы была возможность навести/кликнуть на любое число/рисунок и увидеть дополнительную информацию

Разве нельзя обработать клик по шестиугольнику ?
29 авг 19, 22:54    [21960181]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
DimaBr
Member

Откуда:
Сообщений: 11322
Смотрите, какая есть заготовка !!!

К сообщению приложен файл. Размер - 10Kb
29 авг 19, 22:56    [21960183]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
DimaBr
автор
Ну основное что на них будет несколько label и image (на котором буду рисовать другие картинки

Зачем кидать какие то дополнительные контролы ? Не проще ли просто вывести текст и картинку поверх шестиугольника ?

автор
Я хочу, что бы была возможность навести/кликнуть на любое число/рисунок и увидеть дополнительную информацию

Разве нельзя обработать клик по шестиугольнику ?

Ну я вначале это описал, всё можно, даже не просто можно, я как бы уже всё это сделал почти так (просто перехват координат и события реализовал сам, а не через компоненты).

Сложно объяснить не углубляясь в суть отображаемых данных (а это долго), но панель с контролами просто банально удобнее как с алгоритмичесткой точки зрения (есть один компонент, который полностью самодостаточен, рисование, перемещение, вывод данных, обработку событий, вывод хинтов и т.п. всё можно реализовать внутри него, а я просто присваиваю параметры и всё), так и с точки зрения кода. Ну банально, вот хочу я переместить один шестиугольник (смотри картинки "примеры" в первом комментарии), в случае с панелькой я просто перемешаю её и как бы всё, больше ничего не надо, а в случае с компонентами надо их как-то связать (компоненты одного шестиугольника), перемещать совместно.
Я попробую сделать как вы говорите, может там и не так всё сложно. Просто уж больно мне компонент- наследник панели понравился, ни тебе канвасы не нужны, ни какие-то дополнительные условия.
DimaBr
Смотрите, какая есть заготовка !!!

А что тут происходит?
29 авг 19, 23:18    [21960187]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
asviridenkov
Member

Откуда:
Сообщений: 3950
Андрей Игоревич
Сложно объяснить не углубляясь в суть отображаемых данных (а это долго), но панель с контролами просто банально удобнее как с алгоритмичесткой точки зрения


Пока не захотите все это зуммировать
29 авг 19, 23:28    [21960188]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
asviridenkov
Андрей Игоревич
Сложно объяснить не углубляясь в суть отображаемых данных (а это долго), но панель с контролами просто банально удобнее как с алгоритмичесткой точки зрения


Пока не захотите все это зуммировать

А в чем подводные камни? Я планировал отключать видимость панели на которой они расположены (и всех своих компонентов), далее менять размеры панелей, "перевырезать" форму и опять включать. Хотя лейблы надо будет смещать, но относительные координаты просто на коэффициент помножить, не сложно, вроде. Если панели созданы и невидимы SetWindowRgn, вроде, быстро работает.
29 авг 19, 23:34    [21960189]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
DimaBr
Member

Откуда:
Сообщений: 11322
+ на коленке

TMyShape = class(TPaintBox)
  protected
    procedure Paint; override;
  public
    Text1: string;
    Text2: string;
    Text3: string;
end;

procedure TMyShape.Paint;
var P : array [1..7] of TPoint;
    a,i,R: integer;
begin
  Canvas.Brush.Color := clRed;
  Canvas.Brush.Style := bsSolid;
  a := 0;
  R := Width div 2;
  for i:= 1 to 7 do begin
    P[i].x := R+Round(R*sin(a*pi/180));
    P[i].y := R+Round(R*cos(a*pi/180));
    a := a+60;
  end;
  Canvas.Polygon(P);
  Canvas.TextOut((Width-Canvas.TextWidth(Text1)) div 2,10,Text1);
  Canvas.TextOut((Width-Canvas.TextWidth(Text2)) div 2,22,Text2);
  Canvas.TextOut((Width-Canvas.TextWidth(Text3)) div 2,35,Text3);
end;

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
    S: TMyShape;
begin
  for i := 0 to 999 do begin
    S := TMyShape.Create(self);
    S.Parent := self;
    S.SetBounds(Random(Width-60),Random(Height-60),60,60);
    S.Text1 := '№ '+IntToStr(i);
    S.Text2 := FormatFloat('#0.00',Random*1000);
    S.Text3 := FormatFloat('#0.000',Random*1000);
  end;
end;

Картинка с другого сайта.
30 авг 19, 00:04    [21960193]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
DimaBr
Member

Откуда:
Сообщений: 11322
Картинка с другого сайта.
30 авг 19, 00:14    [21960199]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
DimaBr
+
Картинка с другого сайта.

Повторил, заменив текс на лейблы. В принципе рабочая схема. Но по факту - стрелки это рисунок который всё время надо перерисовывать. Ну и форма Пейнбокса таки квадрат в который что-то вписано, с соответсвующим перекрытием
Картинка с другого сайта.
30 авг 19, 11:41    [21960406]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5263
Андрей Игоревич
DimaBr
+
Картинка с другого сайта.

Но по факту - стрелки это рисунок который всё время надо перерисовывать.
потому что кадр нужно генерировать целиком, сразу со всеми элементами, и только после этого выводить на экран, например
Картинка с другого сайта.
30 авг 19, 12:07    [21960440]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5328
Андрей Игоревич
Повторил, заменив текс на лейблы. В принципе рабочая схема. Но по факту - стрелки это рисунок который всё время надо перерисовывать. Ну и форма Пейнбокса таки квадрат в который что-то вписано, с соответсвующим перекрытием
Выставь просто DoubleBuffered = True у контейнера (в данном случае это TForm1) на котором находятся все компоненты. VCL сделает двойную буферизацию.
30 авг 19, 12:30    [21960471]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Квейд
Андрей Игоревич
пропущено...

Но по факту - стрелки это рисунок который всё время надо перерисовывать.
потому что кадр нужно генерировать целиком, сразу со всеми элементами, и только после этого выводить на экран, например
+
Картинка с другого сайта.

Понятно, просто тоже надо продумывать будет. А что у вас на гифке происходит?
kealon(Ruslan)
Андрей Игоревич
Повторил, заменив текс на лейблы. В принципе рабочая схема. Но по факту - стрелки это рисунок который всё время надо перерисовывать. Ну и форма Пейнбокса таки квадрат в который что-то вписано, с соответсвующим перекрытием.

Выставь просто DoubleBuffered = True у контейнера (в данном случае это TForm1) на котором находятся все компоненты. VCL сделает двойную буферизацию.

Спасибо, попробую, не успел ещё с ней разобраться.

Сообщение было отредактировано: 2 сен 19, 21:07
30 авг 19, 13:20    [21960515]     Ответить | Цитировать Сообщить модератору
 Re: Создание компонента сложной формы (аккуратной контурной стрелки).  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5263
Андрей Игоревич
Понятно, просто тоже надо продумывать будет. А что у вас на гифке происходит?


Это пример того, о чем я говорил. Кадр со всеми элементами (линиями и якорями, за которые линии "цепляются") прорисовывается в буфере, затем целиком выводится на экран. Получается плавная анимация. В вашей задаче нужно реализовать подобный механизм.

К сообщению приложен файл. Размер - 16Kb


Сообщение было отредактировано: 2 сен 19, 21:09
30 авг 19, 13:29    [21960526]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / Delphi Ответить