Realización de un proyecto crowdsourced en Canvas - página 23

 
Реter Konow:

))) Entonces, ¿por qué empecé este tema? ) Ahora voy a estudiar OOP.


Esa es la ventaja de su camino: de la práctica a la teoría. Yo también lo he hecho así. Mi instinto se resistió al paradigma OOP durante mucho tiempo, porque empecé a programar cuando no existía en la naturaleza. Pero ahora entiendo que es el invento más valioso de la programación. Y a veces me parece que si no se hubiera inventado aún la AOP, la habría inventado yo mismo :))
A ti, Peter, te gustará y estarás encantado cuando te des cuenta de la maravilla de la POO y de las oportunidades que abre. Se lo aseguro :)). Y no hay nada complicado y enredado en la POO, especialmente para ti con tu experiencia en programación. Y me parece que, en su caso, la documentación de Metakvot puede incluso ser suficiente para llegar al fondo del asunto. Hay mucha literatura por ahí.
Etiqueta Konow:

Pero Nikolay, todavía no entiendo lo que estaba preguntando - ¿hay una posibilidad de establecer un color específico para las líneas de degradado del marco en la clase CCcanvas? Viendo su ejemplo, uno podría pensar que hay... Si es así, ¿puede dibujar algo similar a mi ejemplo?

VALE, VALE. Aunque no es un tema de este hilo, pero intentaré aclarar cosas que parecen obvias para los programadores con conocimientos, pero que no lo son para los programadores que se encuentran con Canvas por primera vez.
Entonces, ¿qué es el lienzo? Traducido del inglés es un lienzo. Se trata simplemente de cualquier área de la pantalla dentro de una ventana a la que se adjunta. Sus principales características son su tamaño (anchura y altura). Y de hecho, es un array unidimensional de puntos de tipo uint (4 bytes) con tamaño Width*Height. En la implementación de la clase CCanvas este array se llama m_pixels, y por defecto es privado (lo que significa que es accesible sólo dentro de la clase), pero yo personalmente siempre lo hago público (accesible no sólo dentro de la clase, sino también en las aplicaciones de usuario), porque quiero operar con el array de datos directamente. Cada punto de este lienzo puede tomar cualquier valor de tipo de color (también 4 bytes como uint, un byte reservado), lo que significa un punto de cualquier color RGB. Cada color (rojo, verde o azul) corresponde a un byte (256 valores), por lo que hay 256*256*256=16.777.216 colores RGB en total.

Para poner un punto rojo en las coordenadas X,Y, donde X puede tomar valores de 0 a (Ancho-1) e Y de 0 a (Alto-1) sólo hay que asignar un valor rojo a una celda del array m_pixels numerada (Y*Ancho+X) :

m_pixels[Y*Width+X]=clrRed;

o lo que es lo mismo:

m_pixels[Y*Width+X] = 0x0000FF; // 0x00FF00 зеленый, - 0xFF0000 - синий, 0x00FFFF - желтый и т.д.

¡¡¡Eso es todo!!!
Ahora ni siquiera se pueden utilizar las funciones integradas de la clase CCanvas (lo que, por supuesto, es una tontería, porque hay un montón de cosas útiles allí) . Si puedes poner un punto en la pantalla en cualquier lugar y en cualquier color, Dios lo que quieras y dibújalo: botones, gráficos, crea tu propio GDI, etc.

Y si alguien piensa que Kanvas es lento, se equivoca. Kanvas es increíblemente rápido y es un mérito del equipo de desarrollo. He probado la velocidad de dibujo de kanvas muchas veces usando bibliotecas Dll escritas en C++ también. Ahora, tras las actualizaciones del último año, el lienzo en MT5 es casi tan rápido como si lo hubieras escrito en Visual Studio en C++. Sólo es un 10-15% más lento. Y no olvides que Windows está escrito en C++ y que todo es Canvas. ¡¡¡Esta es la belleza y la promesa de MT5 con su MQL5!!! Ni Java ni C# podrán presumir de tal velocidad, como algunos han escrito en este hilo.

No en vano, los desarrolladores han introducido recientemente una nueva propiedad CHART_SHOW para desactivar la representación de gráficos.
Te lo demostraré con un ejemplo de guión:

//+------------------------------------------------------------------+
//|                                                  CleanScreen.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

// Внимание !!! В классе CCanvas массив m_pixels должен быть определен как public
#include <Canvas\Canvas.mqh>

void OnStart()
  {
   ChartSetInteger(0,CHART_SHOW,false); // очищаем экран от всего
   int Width =(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);  // получаем Ширину экрана
   int Height=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // получаем Высоту экрана

   CCanvas C;   // создаем объект Canvas
   if(!C.CreateBitmapLabel(0,0,"CleanScreen",0,0,Width,Height,COLOR_FORMAT_XRGB_NOALPHA)) // Создаем холст на весь экран
      Print("Error creating canvas: ",GetLastError());

// Теперь что-нибудь нарисуем на этом чистом экране
// например красную точку в центре экрана
   int X=Width/2;
   int Y=Height/2;
   C.m_pixels[Y*Width+X]=0xFF0000; // красный
                                   // или нарисуем окружность в центре с радиусом 100 по точкам фиолетового цвета
   int r=100;
   int q=(int)ceil(r*M_SQRT1_2);
   int r2=r*r;
   for(int x=0; x<=q; x++)
     {
      int y=(int)round(sqrt(r2-x*x));
      C.m_pixels[(Y+y)*Width+X+x]=0xFF00FF;
      C.m_pixels[(Y+y)*Width+X-x]=0xFF00FF;
      C.m_pixels[(Y-y)*Width+X+x]=0xFF00FF;
      C.m_pixels[(Y-y)*Width+X-x]=0xFF00FF;
      C.m_pixels[(Y+x)*Width+X+y]=0xFF00FF;
      C.m_pixels[(Y+x)*Width+X-y]=0xFF00FF;
      C.m_pixels[(Y-x)*Width+X+y]=0xFF00FF;
      C.m_pixels[(Y-x)*Width+X-y]=0xFF00FF;
     }
// конечно же можно окружность построить проще :) - через встроенную функцию класса CCanvas:
   C.Circle(X,Y,r+20,0xFFFF00); // желтого цвета
   C.Update(); // Теперь выводим это на экран
  }

Funcionamiento de este script:


La pantalla se borra, pero el acceso a las cotizaciones permanece y podemos usar este lienzo en blanco para hacer nuestra propia interfaz de gráfico, como esta con un gradiente:


Regex Konow:

Pero Nikolai, todavía no he entendido lo que preguntaba: ¿hay una opción en la clase CCcanvas para establecer un color específico a las líneas de degradado del marco? Viendo su ejemplo, uno podría pensar que hay... Si es así, ¿puede dibujar algo similar a mi ejemplo?

El color se define dentro de la clase GButton, e incluso hay dos funciones para mezclar los dos colores y crear una matriz de colores para pasar de un color a otro, es decir, sólo para el gradiente. Sólo es cuestión de definir el concepto de gradiente. A mi entender, un degradado (o relleno de degradado) es un flujo suave de un color a otro. En tu ejemplo no hay degradado, sólo 4 colores. En mi ejemplo, dentro de la clase GButton, se forman 4 colores adicionales con diferente brillo del color y se forma un array de colores para el relleno del gradiente. Esto se hace precisamente para facilitar la vida al usuario final de la clase. ¿Por qué debería molestarse en la formación de estos colores?
Dibuja algo similar a tu ejemplo - es tu tarea, Peter :)) Vamos, empezar a entender las clases, de ahí la OOP.
Buena suerte.
 
Nikolai Semko:

Buena suerte.

Bien, Nikolai. Gracias y buena suerte para ti también.
 
Nikolai Semko:

Nikolai, quise responder a tu post informativo de ayer, pero no pude ordenar mis pensamientos. Ahora he reunido mis pensamientos y me he dado cuenta de que tengo que escribir desde el corazón, no desde la mente, porque si no, no explicaré nada. Por supuesto, sería off-topic y los moderadores probablemente lo borrarían, pero aun así...

Lo que escribes sobre OOP es inspirador. Ya he empezado a estudiarlo con la seria intención de dominarlo. Sin embargo, en el proceso de aprendizaje, me bombardearon constantemente con preguntas de la categoría "¿por qué tomar el camino largo cuando hay un atajo?" Constantemente veía formas fáciles, concisas y claras de resolver los problemas, y era como si me dijeran: "¡No! En POO esto no es una solución. Hay que hacerlo de una manera formal, formal y noble". En respuesta me pregunté: "¿Pero cómo puede ser? No necesito esas entidades. ¿Por qué debería añadirlos al código? Son superfluos. Quiero comprimir el código". Y yo dije: "No, no es profesional. Eso es un mal código".

Estuve discutiendo mucho sobre el tema de la OOP tratando de averiguar cuáles eran sus ventajas para mí. Pensé: "Si resuelvo las tareas perfectamente bien y con facilidad sin POO, ¿por qué debería utilizarla? ¿Por qué debería complicar las cosas adicionalmente simples y claras para mí? ¿Cómo, dónde y por qué debo poner en mi código algo que no necesito?". Entonces decidí que no necesito OOP porque lo hago todo yo mismo y soy muy bueno en ello. Cuando lo haces todo tú mismo y no esperas enchufar nada y además buscas y encuentras las soluciones más eficaces, entonces surge una pregunta natural: "¿Por qué otra cosa? Parece que la POO le da comodidad y orden a un programa. Sí, así es. Pero yo tengo mi propia orden. Mi propia estructura. Mis propias entidades. Mis propias reglas. Entonces, ¿por qué debería rechazarlo?

Al igual que nuestros cuerpos rechazan el tejido ajeno, yo no podría "fusionarme" con el producto del pensamiento ajeno. En todas partes y en todo me sentí rechazado. Para mí, la OLP fue una orden creada por el pensamiento de otra persona y no pasó mi prueba de eficacia. Esta prueba fue el factor decisivo para mí. Me di cuenta de que si utilizo la POO seré un programador más débil que si sigo mi propio camino y resuelvo todos los problemas yo mismo. Mi "fuerza de programación" es que escribo en un lenguaje que entiendo en ruso, utilizo una memoria global compartida para los objetos gráficos, a la que llamo "kernel", y creo mecanismos grandes y complejos que funcionan con este kernel. Este es mi enfoque.

No programaré OOP hasta que alguien me derrote con este enfoque. Hasta que haga lo mismo que yo, pero más eficazmente.

He preguntado sobre los kanvas porque quería entender por qué mi mecanismo resulta ser más eficaz de hecho. No en las teorías, ni en la belleza del código, sino en la práctica.

En fin, gracias Nikolay por inspirarme y guiarme. ))

 
Реter Konow:

...

No programaré OOP hasta que alguien me gane con este enfoque.

...


Ese alguien es probablemente uno de esos molinos de viento contra los que luchas tan frenéticamente en tu imaginación. )
 
Anatoli Kazharski:

Este alguien debe ser uno de esos molinos de viento contra los que luchas tan frenéticamente en tu imaginación. )
¡Ahí lo tienes! Vienen los trolls...))
 
Реter Konow:
¡Ahí lo tienes! Vienen los trolls...))
Cálmate Peter. Sólo son molinos. Se limitan a estar ahí, a realizar una función determinada y no intentan ganarte. Aunque quién sabe cómo se visualiza en su fértil imaginación. Por lo que parece, tiene un aspecto muy espectacular. )
 
Реter Konow:

No soy en absoluto un fan de la POO, pero hay que conocerla y saber usarla con claridad si te consideras un programador, al menos por autoformación.

Pero utilizarlo o no para resolver sus tareas de aplicación depende de usted.

 
Anatoli Kazharski:
Cálmate Peter. Sólo son molinos. Sólo están parados, cumpliendo una función determinada y no tratando de vencerte. Aunque quién sabe cómo se está visualizando en su fértil imaginación. Por lo que parece, tiene un aspecto muy espectacular. )

Anatoly, molinos o no, me gusta luchar y ganar. Especialmente en lo que soy bueno. Me gusta la competición en vivo, los duelos y demás... Todo forma parte de la evolución y la selección natural. Así que está bien... Siempre que las reglas sean justas.

Colaborar con personas afines, participar en proyectos comunes, trabajar en equipo, también es genial. Y la imaginación, por supuesto, no debe sustituir a la realidad. Si eso es lo que quieres decir, estoy de acuerdo.

 
Комбинатор:

... Pero hay que conocerlo y saber utilizarlo con claridad si te consideras un programador, al menos por autoformación.

Pero depende de ti utilizarlo o no para tus propias aplicaciones.

No se puede estar en desacuerdo con esto.
 
Реter Konow:

No programaré OOP hasta que alguien me derrote con este enfoque. Hasta que hagan con ella lo mismo que yo, pero aún más eficientemente.

He preguntado sobre los kanvas porque quería entender por qué mi mecanismo resulta ser más eficaz de hecho. No en las teorías ni en la belleza del código, sino en la práctica.

En cualquier caso, gracias Nikolay por inspirarme y guiarme. ))

Si dos programadores con igual experiencia e inteligencia compiten en la creación degrandes proyectos similares. Pero el primero sólo utiliza funciones, mientras que el segundo utiliza funciones y clases. El segundo ganará definitivamente. Pero, repito, si se trata de un proyecto voluminoso, esto último lo hará más rápido porque habrá menos errores y más orden. Y el producto de la segunda será más legible, fácil de mantener y de actualizar y complementar. Esto ni siquiera es mi imho, es sólo una declaración de hechos. Es más fácil cavar un agujero con una pala que con una paleta. Si implementaras tu mecanismo no sólo en las funciones sino también en las clases, sería más eficiente. Esa es mi opinión.

Y, Peter, he echado un vistazo rápido a tu código y me he dado cuenta de que estás utilizando canvas al máximo (aunque no la clase CCanvas, pero a quién le importa). ¿Por qué todas estas preguntas sobre el lienzo y por qué estoy tratando de explicar todas estas cosas aquí? :)).