Делаем краудсорсовый проект по Canvas - страница 22

 
Nikolai Semko:
Почти доделал пример класса GButton, но нужно убегать. Завтра доделаю и представлю.
Отлично. Очень любопытно. )
 
Реter Konow:
Отлично. Очень любопытно. )


Вот что получилось. 


Кнопку можно выводить за задний план и на передний, задавать фиксацию нажатия или без фиксации.

В файле примера CanvasButton.mq5 реализована возможность перетаскивания кнопки мышью. Для этого просто нужно нажать Ctrl для перемещения синей кнопки, и Shift для перемещения красной кнопки.

Т.к. класс GButton является потомком класса CCanvas, в примере продемонстрирована  возможность использования функций класса CCanvas на примере окружности CircleWu (Это реализовано в OnInit). А значит можно и текст писать на кнопке с помощью функций класса CCanvas. 

Данный класс, конечно же не претендует на чистовой. Графика не блещет совершенством и 3D весьма условно, не реализованы тени, не проведена оптимизация скорости выполнения. И скорей всего есть масса шероховатостей и отсутствие различных проверок. Так что не судите строго.

Если чуть больше времени потратить, конечно и такое можно сделать:


Просто я попробовал... можно сказать, - задать направление.


файл Canvas.mqh отличается от оригинала только тем что массив m_pixels определен как public.

Файлы:
GButton.mqh  20 kb
Canvas.mqh  152 kb
 
Nikolai Semko:


Вот что получилось. 


Кнопку можно выводить за задний план и на передний, задавать фиксацию нажатия или без фиксации.

В файле примера CanvasButton.mq5 реализована возможность перетаскивания кнопки мышью. Для этого просто нужно нажать Ctrl для перемещения синей кнопки, и Shift для перемещения красной кнопки.

Т.к. класс GButton является потомком класса CCanvas, в примере продемонстрирована  возможность использования функций класса CCanvas на примере окружности CircleWu (Это реализовано в OnInit). А значит можно и текст писать на кнопке с помощью функций класса CCanvas. 

Данный класс, конечно же не претендует на чистовой. Графика не блещет совершенством и 3D весьма условно, не реализованы тени, не проведена оптимизация скорости выполнения. И скорей всего есть масса шероховатостей и отсутствие различных проверок. Так что не судите строго.

Если чуть больше времени потратить, конечно и такое можно сделать:


Просто я попробовал... можно сказать, - задать направление.


файл Canvas.mqh отличается от оригинала только тем что массив m_pixels определен как public.

Николай, на мой взгляд, получилось не плохо. Начало положено, дальше можно развивать. Такой тип кнопки я бы назвал клавишей. Если ты разделишь по краям 4 четкие линии рамки: - верхнюю, левую светлыю и правую, нижнюю - темные для отжатого состояния и наоборот для нажатого состояния, получиться еще качественней (только нужно добавить светлый фон, а то темные линии на фоне черного графика не будут видны). Ну а потом текст и картинку можно установить. 

Короче, хорошая попытка. )

 
Реter Konow:

. Если ты разделишь по краям 4 четкие линии рамки: - верхнюю, левую светлыю и правую, нижнюю - темные для отжатого состояния и наоборот для нажатого состояния, получиться еще качественней (только нужно добавить светлый фон, а то темные линии на фоне черного графика не будут видны). 

Да понятно,  что нарисовать можно как угодно.  В данном случае я не ставил целью добиться шедевра.  Но первое что хочется доработать,  это чтобы при иницализации формировать все массивы изображения кнопки (в данном случае два)  и потом их только копировать через ArrayCopy, чтобы не формировать изображение каждый раз.  Это значительно убыстрит работу,  но ценой дополнительного расхода ОЗУ,  Но т.к. сейчас уже обычное явление  на компьютерах 16 гигов ОЗУ, а если будет даже очень много кнопок,  вряд ли дополнительный расход памяти превысит  1-2 Мб,  тем более,  если одинаковые кнопки будут пользоваться одними массивами. Так что не думаю ,  что это проблема. Главное скорость. 
 
Nikolai Semko:
Да понятно,  что нарисовать можно как угодно.  В данном случае я не ставил целью добиться шедевра.  Но первое что хочется доработать,  это чтобы при иницализации формировать все массивы изображения кнопки (в данном случае два)  и потом их только копировать через ArrayCopy, чтобы не формировать изображение каждый раз.  Это значительно убыстрит работу,  но ценой дополнительного расхода ОЗУ,  Но т.к. сейчас уже обычное явление  на компьютерах 16 гигов ОЗУ, а если будет даже очень много кнопок,  вряд ли дополнительный расход памяти превысит  1-2 Мб,  тем более,  если одинаковые кнопки будут пользоваться одними массивами. Так что не думаю ,  что это проблема. Главное скорость. 

Ясно. Я когда поставил вопрос о кнопке, хотел выяснить можно ли с помощью канваса сделать такое:


Отжата:

Нажата:

В данном примере, каждая сторона рамки состоит из нескольких линий. Всего 4 линии градиента у каждой стороны рамки. Каждая линия имеет свой оттенок, который зависит от состояния кнопки и заданной формы рамки. Если в CCanvas есть возможность задавать цвет конкретным линиям градиента рамки, то сделать вышеприведенный пример можно легко. Именно это хотел узнать.

 
Реter Konow:

Ясно. Я когда поставил вопрос о кнопке, хотел выяснить можно ли с помощью канваса сделать такое:


Отжата:

Нажата:

В данном примере, каждая сторона рамки состоит из нескольких линий. Всего 4 линии градиента у каждой стороны рамки. Каждая линия имеет свой оттенок, который зависит от состояния кнопки и заданной формы рамки. Если в CCanvas есть возможность задавать цвет конкретным линиям градиента рамки, то сделать вышеприведенный пример можно легко. Именно это хотел узнать.

Я что-то тебя не понял,  Пётр. Ты говоришь о мясе,  а я о скелете .  Были бы кости,  мясо можно нарастить. Разве в моем примере нет состояний Нажата,  Отжата? Ты хоть внутрь класса GButton заглядывал? Пётр, мой совет : бросай все и срочно изучай ООП,  классы это и есть ООП. Просто ты в своём проекте уперся  в потолок, который называется разросшийся код.  Он легко преодолевается с помощью ООП. 
 И с  помощью канваса можно сделать всё,  хоть Windows написать внутри окна МТ5, в режиме полной визуальной эмуляции конечно :), ведь доступа к железу нет  

 
Nikolai Semko:
Я что-то тебя не понял,  Пётр. Ты говоришь о мясе,  а я о скелете .  Были бы кости,  мясо можно нарастить. Разве в моем примере нет состояний Нажата,  Отжата? Ты хоть внутрь класса GButton заглядывал? Пётр, мой совет : бросай все и срочно изучай ООП,  классы это и есть ООП. Просто ты в своём проекте уперся  в потолок, который называется разросшийся код,  он легко преодолевается с помощью ООП. 
 И с  помощью канваса можно сделать всё,  хоть Windows написать внутри окна МТ5.  

))) Ну так а для чего я эту тему завел? ) Буду сейчас ООП изучать. 

В твоем примере есть кнопки, события нажатия и состояния этих кнопок. Все ок. Но Николай, я так и не понял того, о чем спрашивал, - есть ли в классе CCcanvas  возможность задавать конкретный цвет линиям градиента рамки? Смотря на твой пример, можно подумать что есть... Если так, то можешь ли ты нарисовать что то похожее на мой пример? Меня интересует легкость и возможности рисования как такового с помощью функционала этого класса, а ты говоришь о скорости и усовершенствованиях функционала класса. Это немного другая тема.

 
Реter Konow:

))) Ну так а для чего я эту тему завел? ) Буду сейчас ООП изучать. 

ООП лучше начать изучать с чего-то попроще а не с Canvas. 
 
Vasiliy Sokolov:
ООП лучше начать изучать с чего-то попроще а не с Canvas. 
Вы правы. Наверное мне лучше начать с учебника. Правда, ООП штука сложная. Запутанно все кажется...
 
Nikolai Semko:
  Ты хоть внутрь класса GButton заглядывал?


Я заглянул внутрь класса. Выглядит круто, но у меня нет понимания всего механизма класса CCanvas. Потому, ответа на свой вопрос там не увидел.
Причина обращения: