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

 
Nikolai Semko:
Casi he terminado el ejemplo de la clase GButton, pero tengo que salir corriendo. Lo terminaré mañana y lo presentaré.
Genial. Muy interesante. )
 
Реter Konow:
Genial. Muy interesante. )


Esto es lo que obtienes.


El botón puede aparecer en el fondo o en el primer plano, con o sin función de enganche.

En el archivo de ejemplo CanvasButton.mq5 es posible arrastrar el botón con el ratón. Para ello, basta con pulsar Ctrl para mover el botón azul, y Shift para mover el botón rojo.

Debido a que la clase GButton es descendiente de la clase CCanvas, el ejemplo demuestra la capacidad de utilizar funciones de la clase CCanvas en el ejemplo CircleWu (Esto se implementa en OnInit). Así, es posible escribir texto en el botón utilizando funciones de la clase CCanvas.

Esta clase, por supuesto, no pretende ser limpia. Los gráficos no brillan con perfección y el 3D es muy convencional; las sombras no están implementadas, la velocidad de ejecución no está optimizada. Y lo más probable es que haya muchas asperezas y falta de controles diversos. Así que no juzgues con severidad.

Si se dedica un poco más de tiempo, por supuesto que se puede hacer:


Sólo intentaba... se podría decir - marcar la dirección.


El archivo Canvas.mqh difiere del original sólo en que la matriz m_pixels se define como pública.

Archivos adjuntos:
GButton.mqh  20 kb
Canvas.mqh  152 kb
 
Nikolai Semko:


Esto es lo que tenemos.


El botón puede aparecer en el fondo o en el primer plano y puede ser pulsado o no.

En el archivo de ejemplo CanvasButton.mq5 es posible arrastrar el botón con el ratón. Para ello, basta con pulsar Ctrl para mover el botón azul, y Shift para mover el botón rojo.

Debido a que la clase GButton es descendiente de la clase CCanvas, el ejemplo demuestra la capacidad de utilizar funciones de la clase CCanvas en el ejemplo CircleWu (Esto se implementa en OnInit). Así, es posible escribir texto en el botón utilizando funciones de la clase CCanvas.

Esta clase, por supuesto, no pretende ser limpia. Los gráficos no brillan con perfección y el 3D es muy convencional; las sombras no están implementadas, la velocidad de ejecución no está optimizada. Y lo más probable es que haya muchas asperezas y falta de controles diversos. Así que no juzgue con demasiada dureza.

Si dedicas un poco más de tiempo, por supuesto, puedes hacerlo:


Sólo intentaba... se podría decir - marcar la dirección.


El archivo Canvas.mqh difiere del original sólo en que la matriz m_pixels se define como pública.

Nikolay, en mi opinión, salió bastante bien. Hemos empezado bien y podemos ir más allá. Yo llamaría a este tipo de botón una llave. Si usted tiene 4 líneas de marco claro: - arriba, luz izquierda y derecha, la parte inferior - oscuro para el estado presionado y viceversa, será aún mejor (sólo tiene que añadir un fondo claro, de lo contrario las líneas oscuras en un gráfico de fondo negro no será visible). Y luego puedes establecer el texto y la imagen.

De todos modos, buen intento. )

 
Реter Konow:

. Si divides las 4 líneas claras del marco a lo largo de los bordes: - arriba, izquierda clara y derecha, abajo oscura para el estado pulsado y viceversa para el estado presionado, será aún mejor (sólo tienes que añadir un fondo claro, de lo contrario las líneas oscuras no serán visibles contra los gráficos negros).

Sí, está claro que puedes dibujar como quieras. En este caso, no me propuse lograr una obra maestra. Pero lo primero que me gustaría mejorar, es generar todos los arrays de la imagen del botón (dos arrays en este caso) y luego copiarlos sólo a través de ArrayCopy, para no tener que crear una imagen cada vez. Esto reducirá en gran medida el trabajo, pero a costa de un consumo adicional de memoria RAM, pero debido a que ahora es común en los equipos de 16 GB de RAM, y si hay incluso una gran cantidad de botones, el consumo de memoria adicional es poco probable que exceda de 1-2 MB, especialmente si los mismos botones utilizarán las mismas matrices. Así que no creo que sea un problema. Lo principal es la velocidad.
 
Nikolai Semko:
Sí, está claro que puedes dibujar como quieras. En este caso, no me puse como objetivo conseguir una obra maestra. Pero lo primero que me gustaría mejorar, es generar todos los arrays de la imagen del botón (dos arrays en este caso) y luego copiarlos sólo a través de ArrayCopy, para no tener que crear una imagen cada vez. Esto reducirá en gran medida el trabajo, pero a costa de un consumo adicional de memoria RAM, pero debido a que ahora es común en los equipos de 16 GB de RAM, y si hay incluso una gran cantidad de botones, el consumo de memoria adicional es poco probable que exceda de 1-2 MB, especialmente si los mismos botones utilizarán las mismas matrices. Así que no creo que sea un problema. Lo principal es la velocidad.

Ya veo, cuando planteé la pregunta sobre el botón, quería saber si era posible hacerlo con un lienzo:


Presionado:

Presionado:

En este ejemplo, cada lado del marco está formado por varias líneas. Hay un total de 4 líneas de gradiente en cada lado del marco. Cada línea tiene un tono diferente que depende del estado del botón y de la forma dada del marco. Si CCanvas tiene la capacidad de establecer el color a líneas de gradiente específicas del marco, entonces hacer el ejemplo anterior es fácil. Eso es exactamente lo que quería averiguar.

 
Реter Konow:

Ya veo. Cuando planteé la pregunta sobre el botón, quería saber si era posible hacerlo con un lienzo:


Presionado:

Presionado:

En este ejemplo, cada lado del marco está formado por varias líneas. Hay un total de 4 líneas de gradiente en cada lado del marco. Cada línea tiene un tono diferente, que depende del estado del botón y de la forma dada del marco. Si CCanvas tiene la capacidad de establecer el color a líneas de gradiente específicas del marco, entonces hacer el ejemplo anterior es fácil. Eso es exactamente lo que quería averiguar.

No te entiendo, Peter. Tú hablas de la carne y yo del esqueleto. Si tienes huesos, puedes cultivar carne. ¿Mi ejemplo no tiene los estados Pressed, Pressed? ¿Has mirado siquiera dentro de la clase GButton? Pedro, mi consejo: deja todo y estudia urgentemente la OOP. Acabas de tocar un techo en tu proyecto, lo que se llama código hinchado. Se supera fácilmente con la POO.
Y con CCanvas puedes hacer todo, incluso escribir en Windows dentro de la ventana de MT5, en modo de emulación visual completa, por supuesto :), porque no hay acceso al hardware

 
Nikolai Semko:
No te entiendo, Peter. Tú hablas de carne y yo de esqueleto. Si tienes huesos, puedes añadir carne. ¿Mi ejemplo no tiene los estados Pressed, Pressed? ¿Has mirado siquiera dentro de la clase GButton? Pedro, mi consejo: deja todo y estudia urgentemente la OOP. Es que en tu proyecto has tocado un techo, que se llama código hinchado, es fácilmente superable con la ayuda de la POO.
Y con Canvas se puede hacer de todo, incluso se pueden escribir ventanas dentro de la ventana de MT5.

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

Tu ejemplo tiene botones, eventos de clic y estados de esos botones. Todo está bien. Pero Nikolai, sigo sin entender 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, puede pensar que hay... Si es así, ¿puede dibujar algo similar a mi ejemplo? Estoy interesado en la facilidad y las posibilidades de dibujar como tal utilizando la funcionalidad de esta clase, y tú estás hablando de la velocidad y las mejoras de la funcionalidad de la clase. Ese es un tema ligeramente diferente.

 
Реter Konow:

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

Es mejor empezar a aprender OOP con algo más fácil, no con Canvas.
 
Vasiliy Sokolov:
Es mejor empezar a aprender OOP con algo más simple que Canvas.
Tienes razón. Tal vez sea mejor empezar con un libro de texto. Realmente, la OOP es una cosa complicada. Es confuso...
 
Nikolai Semko:
¿Has mirado siquiera dentro de la clase GButton?


He mirado dentro de la clase. Se ve bien, pero no entiendo todo el mecanismo de la clase CCanvas. Por eso no vi la respuesta a mi pregunta allí.