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

 
Igor Volodin:


Para mí, es más fácil crear un equipo de desarrollo de productos, cuyos miembros, en un grado acordado, recibirán un beneficio de las ventas del producto (quizá alguien sea el ideólogo del proyecto, alguien financie una parte, alguien sea el programador).

Y ya que todo el mundo está motivado económicamente, para implementar las bibliotecas necesarias para la interfaz como parte del proyecto también.

de acuerdo, pero la biblioteca en sí misma debería ser de código abierto )
 
o_O:
Igor Volodin:


Para mí, es más fácil crear un equipo de desarrollo de productos, cuyos miembros, en un grado acordado, recibirán un beneficio de las ventas del producto (quizá alguien sea el ideólogo del proyecto, alguien financie una parte, alguien sea el programador).

Y como todos están motivados económicamente - para implementar dentro del proyecto y las bibliotecas necesarias para la interfaz.

Estoy de acuerdo, pero la biblioteca en sí debería ser de código abierto crowdsourced).
Leí el hilo y no entendí para qué es necesario - para dibujar el botón en Canvas desde cero. ¿Puede explicarse sin emociones?
 
Alexey Volchanskiy:
He leído el hilo y sigo sin entender por qué es necesario dibujar un botón en Canvas desde cero. ¿Puede explicarse sin emociones?
Yo elijo entre ObjectCreate y ResourceCreate.
porque los desarrolladores de MT no son omnipotentes y es mucho tiempo molestarlos con peticiones insignificantes
 

Por qué puede ser útil:

1. la interfaz del mapa de bits es rápida. Tan rápido que es casi indistinguible del del sistema. Por ejemplo, he implementado elementos semitransparentes con gradientes eincluso cuando se mueven se renderizan suavemente sin retraso visible, teniendo en cuenta la mezcla de colores y el cálculo del canal alfa en otros objetos con gradientes semitransparentes.

2. la interfaz es escalable. Puedes hacer la aplicación más compleja y no se ralentizará debido a la eliminación y creación de un gran número de objetos gráficos. Los costes de redibujado son mínimos, sólo se trata de sustituir una imagen en una milésima de segundo.

3. se pueden crear controles ya hechos y otros nuevos, ya que se puede proporcionar su propio grupo de eventos, por ejemplo:

OnMouseDown - pulsó el LKM

OnMouseUp - pulsar el LKM

OnMouseHoverOn - pasar el cursor del ratón por encima de un objeto

OnMouseHoverOut - alejar el cursor del ratón del objeto

OnMouseClick - pulsar y hacer clic dentro de los límites del objeto

OnMouseDblClick - doble clic del ratón dentro de los límites del objeto

OnDragStart - evento que ocurre una vez al inicio del movimiento con el botón izquierdo del ratón pulsado

OnDragMove - evento generado durante el movimiento con el botón izquierdo del ratón

OnDragEnd - evento generado después de moverse con LKM

OnPut - el objeto se convierte en otro objeto

OnGet - el objeto es volcado a otro objeto

OnFocus - El objeto se ha enfocado

OnBlur - el objeto pierde el foco

OnResize - El objeto ha cambiado de tamaño

OnParentResize - El objeto padre ha cambiado de tamaño

OnKeyPress - una tecla pulsada

OnChange - El valor de un campo ha cambiado

etc.

 
Igor Volodin:

Por qué puede ser útil:

1. la interfaz del mapa de bits es rápida. Tan rápido que es prácticamente indistinguible de la interfaz del sistema. Por ejemplo, he implementado elementos semitransparentes con gradientes eincluso cuando se mueven, se renderizan suavemente sin ningún retraso visible, teniendo en cuenta la mezcla de colores y el cálculo del canal alfa en otros objetos con gradientes semitransparentes.

2. la interfaz es escalable. Puedes hacer la aplicación más compleja y no se ralentizará debido a la eliminación y creación de un gran número de objetos gráficos. Los costes de redibujado son mínimos, sólo se trata de sustituir una imagen en una milésima de segundo.

3. se pueden crear controles ya hechos y otros nuevos, ya que se puede proporcionar su propio grupo de eventos, por ejemplo:

OnMouseDown - pulsó el LKM

OnMouseUp - pulsar el LKM

OnMouseHoverOn - pasar el cursor del ratón por encima de un objeto

OnMouseHoverOut - alejar el cursor del ratón del objeto

OnMouseClick - pulsar y hacer clic dentro de los límites del objeto

OnMouseDblClick - doble clic del ratón dentro de los límites del objeto

OnDragStart - evento que ocurre una vez al inicio del movimiento con el botón izquierdo del ratón pulsado

OnDragMove - evento generado durante el movimiento con el botón izquierdo del ratón

OnDragEnd - evento generado después de moverse con LKM

OnPut - el objeto se convierte en otro objeto

OnGet - el objeto es volcado a otro objeto

OnFocus - El objeto se ha enfocado

OnBlur - el objeto pierde el foco

OnResize - El objeto ha cambiado de tamaño

OnParentResize - El objeto padre ha cambiado de tamaño

OnKeyPress - una tecla pulsada

OnChange - El valor de un campo ha cambiado

etc.

Exhaustivo, ¡gracias!

 
Leer el hilo, interesante. Es una pena que no hubiera tanto jaleo con las interfaces hace unos 3 años.

No veo ningún sentido en publicar mi código, ya que hay una alta probabilidad de que la iniciativa se extinga debido a la pereza y las dificultades de comunicación entre los participantes (y ya se observan) mi código será arrastrado al sótano para su revisión y yo (y la comunidad) no se beneficiará de ella en absoluto.

Pero para participar en el proyecto que podría, a partir de la discusión de las características necesarias y la fundición de detalles específicos de la aplicación, ya que hay un beneficio en tal, llamémoslo un marco.

El beneficio es simple, expresado por Alex en los primeros posts. La comunidad puede influir en los desarrolladores del terminal para que introduzcan modificaciones en la plataforma MQL.

Mis esperanzas de mejora (directamente relacionadas con las interfaces de programación) son las siguientes:

  1. La aplicación MQL - como un tipo de programa separado que no cancela a los demás (no tiene onTick y no tiene la posibilidad de referirse al símbolo por defecto - es una reliquia del pasado, pero tiene la posibilidad de obtener el entorno comercial de cualquier símbolo y operar, porque todo es multidivisa), la aplicación no debe iniciarse en el gráfico de un símbolo particular, sino en su propia ventana. Si arrastra un programa de este tipo a un gráfico, se abrirá una nueva ventana. Y arrastrar y soltar no es necesario - 2 clic en el navegador - también abre una nueva ventana. Esto es similar a la petición de algunas personas de proporcionar la API al terminal para el desarrollo en otro idioma. Desarrollando el tema - se puede asumir que tal programa, especialmente compilado, puede ser ejecutado sin un terminal (y por razones de seguridad, permitir esta compilación sólo a través del Mercado). Puede parecer descabellado, pero ¿y si?
  2. Compatibilidad con fuentes vectoriales de terceros presentadas como un archivo separado y la posibilidad de compilarlas como un recurso (indicado en la documentación, pero no implementado)
  3. Captura de eventos de desplazamiento del ratón
  4. Bloqueo del menú del botón derecho. El botón derecho se maneja ahora, pero es inútil.
  5. Manejando el portapapeles del sistema, para crear sus propios controles de edición de texto (incluyendo el editor multilínea), la barra espaciadora y el enter ya pueden ser bloqueados - bien.
 

@Igor Volodin, @Combinator, @Anatoli Kazharski

Empezaré con el tema del dolor).
El tema que más me preocupa es algún tipo de universalidad/abstracción para almacenar los parámetros de renderizado.

----

Según entendemos, todos los controles utilizan por igual la fuente, el color de fondo y el color del texto, etc.
Cuando todos estos parámetros son iguales para todos los controles, la interfaz tiene un aspecto común con un único concepto.

Pero, ¿cómo almacenarlos? porque los controles no siempre utilizan todos los parámetros.
+ El sistema se complica por el hecho de que los elementos tienen diferentes estados que deben utilizar los colores de la fuente y del fondo de manera diferente. Se trata de Activo, Desactivar, Sobre, o Seleccionar, etc.
+ hay grupos de controladores - relieve (como Button) y campos de entrada (como Edit, List), y cuando es el fondo para renderizarlos

----

En la idea actual de trabajo tengo un elemento de atributo mínimo de la clase GAttribBase, que contiene 5 parámetros básicos (fuente/tamaño, color de fondo/borde, tamaño del borde)

Estos elementos de base se utilizan para formar una matriz para los estados de la clase GAttributribut(Activo/Desactivado/Superado/Seleccionado, etc.).

Y luego se rellena GAttribut para los diferentes tipos de elementos - Relieve, Editable, etc.


Así, rellenamos los parámetros de renderizado una vez (los almacenamos en xml), se pueden editar para crear diferentes diseños y los usamos globalmente sin definirlos para cada controlador.

Por supuesto, si algún controlador necesita tener sus propios parámetros de renderizado definidos - simplemente cree su propio objeto GAttributribut en el control y especifique los colores deseados.

----

Este modelo funciona, el diseño unificado se consigue en poco tiempo, todos los mandos toman los colores de la matriz común.

Pero, en mi opinión, no es universal. El usuario no entiende qué parámetros de la base GAttribBase se utilizan para la representación de tal o cual control.
Para que el codificador sepa exactamente qué color debe cambiar tendría que buscar en la función de renderizado del control, lo que es realmente molesto.

-----

De todos modos, alguna idea para que el codificador se libere de la gestión del color (para usar colores predefinidos directamente y no molestarse con ellos al principio).

Por otro lado, si quiere volver a colorear algunos de los controles de la pantalla, no tiene que investigar qué GAttribBase se utiliza y en qué caso.

 
o_O:

@Igor Volodin, @Combinator, @Anatoli Kazharski

En general, ¿qué ideas tienes para que el codificador no tenga que trabajar con los colores, por un lado (para que utilice los colores establecidos directamente y no se moleste con ellos al principio)?

Y por otro lado, si quieren volver a colorear algunos de los controles de la pantalla, pueden hacerlo sin tener que entrar en el laberinto de funciones de dibujo y buscar qué GAttribBase se utiliza y en qué caso.

Bien, temas.

Por ejemplo, el objeto principal de nuestra aplicación, llamémoslo App, está asociado al objeto ConcreteTheme.

Qué es un objeto temático:
colores (fondo, primer plano, desactivado, activo, etc.), tamaños de base, tamaños de letra para casos estándar: titlesize, commonsize, etc. sprites para: paneles, botones, casillas de verificación, etc.

Un nuevo tema es una nueva clase/estructura con valores modificados. Pero es mejor que los temas puedan ser heredados anulando sólo ciertos parámetros.


El resto - la jerarquía de controles en la que cada controlador utiliza uno de los valores necesarios del objeto-tema por defecto. Si necesita anular esto, llamamos a un método para trabajar con esa propiedad, especificando el nuevo valor.

Por ejemplo, SetBgColor(XRGB(255,0,128));

CView - una clase básica que proporciona una interacción básica basada en eventos
- CRect - coordenadas
- Cpanel tiene un bgcolor
- CButton tiene un objeto de estado, cada estado tiene bg
- CText tiene un color de texto y propiedades de fuente
- Círculo CC

Y así sucesivamente.

Si quieres usar xml para describir los elementos,

entonces para cada clase control o primitiva necesitamos crear una clase generadora llamémosla "build-container" que mapeará los atributos (bgcolor="(255,0,128)" a los métodos correspondientes ( SetBgColor(attrValue) ) de la clase. Tales contenedores de construcción serán analizados por el analizador XML, la salida será un objeto inicializado con los valores necesarios, o con los predeterminados si no se especificaron valores.

 

Aquí el tema es el mismo que el mío - un conjunto de GAttributors para diferentes tipos de controles y sus estados.

pero ya sugieres el primer paso en el camino hacia la transparencia para el codificador - añadir funciones a un control específico para cambiar sus propiedades de representación (SetBgColor etc.)

Básicamente estoy de acuerdo, quedará claro qué colores tiene y qué se puede cambiar.


entonces, ¿el tema implica la redundancia de los parámetros no utilizados?

Digamos que en mi GAttribBase básico para algún control (por ejemplo, botón) utilizamos sólo el color de fondo y el tamaño, y otros parámetros - grosor del borde, etc. no se utilizan en este control.

Es decir, ¿tiene un elemento base para todos los controles? ¿dónde se almacena la información "para todos los casos", o todos los controles tienen sólo sus parámetros sin la sobrecarga de universalidad?

 
o_O:

...

En general, ¿cuáles son algunas ideas para que el codificador no tenga que manejar los colores (para que utilice los colores por defecto y no se moleste con ellos al principio)?

Y por otro lado - para que si quiere volver a colorear algún controlador en la pantalla, no tenga que bucear en el desierto de las funciones de renderizado y averiguar qué GAttribBase se utiliza y en qué caso.

Establezca los valores por defecto para cada elemento. Si el usuario necesita cambiar algo, para cada propiedad del elemento debe haber un método para establecer el nuevo valor. Así es como lo tengo hecho ahora.

Todavía no tengo esto:

Si necesita cambiar las propiedades de todos los elementos en "dos cuentas", entonces sólo tiene que crear métodos separados (para las propiedades comunes relacionadas con el diseño y aplicables a todos los elementos) en esa clase donde todos los elementos de la interfaz son accesibles.

En principio, ya puedo ver cómo se podría implementar en mi esquema. Por ejemplo, a través de eventos. Pero luego en el manejador de eventos de cada elemento hay que manejar este evento (el código está hinchado). Segunda opción, crear un método público especial en una clase que maneje los eventos comunes de la GUI, o incluso superior, donde se almacenen todos los punteros a los elementos de la GUI. Ambas son clases base de la clase MQL-aplicación personalizada, y el usuario tendrá acceso directo a ellas. Puede ser algo así como los métodos ObjectSet sobrecargados en MQL (por ejemplo,ElementSet), donde se debe especificar (1) propiedad y valor o (2) propiedad, modificador y valor.

Pero todo esto es mi razonamiento con respecto a mi esquema. No descarto que todavía cambie mucho cuando empiece la transición. Así que todo lo que escribí anteriormente puede no ser relevante para el tema que se está discutiendo aquí. )

Razón de la queja: