Discusión sobre el artículo "Interfaces gráficas I: Formulario para controles (Capítulo 2)"

 

Artículo publicado Interfaces gráficas I: Formulario para controles (Capítulo 2):

Este artículo es la continuación de la primera parte de la serie sobre las interfaces gráficas. El artículo Interfaces gráficas I: Preparación de la estructura de la librería (Capítulo 1) cuenta con más detalles para qué sirve esta librería. Al final de cada capítulo se puede encontrar la lista completa de los enlaces a los artículos de la primera parte, así como descargar la versión completa de la librería en la fase actual del desarrollo del proyecto. Es necesario colocar los ficheros en los mismos directorios, tal como están ubicados en el archivo.

En el capítulo anterior hemos hablado la estructura de la librería para la creación de las interfaces gráficas. Hemos creado (1) las clases para los objetos primitivos, (2) la clase base para todos los controles, (3) las clases principales para almacenar los punteros a los controles y manejar estos controles en el manejador común de eventos.

En este artículo vamos a crear el primero y el más importante elemento de las interfaces gráficas: formulario para los controles. A este formulario se le puede adjuntar múltiples controles de diferentes tipos en cualquier orden y secuencia. El formulario será movible, y todos los controles adjuntos a él van a desplazarse de la misma manera.

¿De qué partes se compone la ventana que vamos a crear?

  1. Fondo. Todos los controles van a colocarse en esta área.
  2. Encabezado. Esta parte sirve para mover la ventana, además de contener elementos de la interfaz que se listan más abajo.
  3. Icono. Atributo adicional para la identificación visual.
  4. Título. Nombre de la ventana.
  5. Botón “Ayudas emergentes”. Si está apretado, está habilitado el modo de visualización de ayudas emergentes para los controles en los que están presentes.
  6. Botón para minimizar/maximizar la ventana.
  7. Botón para cerrar la ventana.

Fig. 1. Partes del formulario para los controles

Fig. 1. Partes del formulario para los controles

Autor: Anatoli Kazharski

 
Saludos Anatoly, no vi ningún método para guardar, cargar parámetros de formularios (posición, estado...) en la clase base. ¿Planeas añadir tales métodos en el futuro, teniendo en cuenta el tipo de formularios?
 
Ruslan Khasanov:
Saludos Anatoly, no vi ningún método para guardar, cargar parámetros de formularios (posición, estado...) en la clase base. ¿Planeas añadir tales métodos en el futuro, teniendo en cuenta el tipo de formularios?

Tal artículo está previsto. Pero en mi versión, los parámetros a guardar y cargar serán determinados por el desarrollador de la aplicación MQL.

 

Buenas tardes. Anatoly, por supuesto quiero expresar mi más profundo respeto por tu labor y el trabajo que has realizado. Pero tengo una pregunta mientras pruebo la biblioteca en el ejemplo de un Asesor Experto. ¿Por qué el color de la ventana es negro, mientras que todos los colores de los elementos que componen la ventana están configurados como LightGray por defecto? ¿No hay una superposición de colores en alguna parte, que da lugar a una ventana negra? Adjunto una captura de pantalla:


 
Pavel Trofimov:

Buenas tardes. Anatoly, por supuesto quiero expresar mi más profundo respeto por tu labor y el trabajo que has realizado. Pero tengo una pregunta mientras pruebo la biblioteca en el ejemplo de un Asesor Experto. ¿Por qué el color de la ventana es negro, mientras que todos los colores de los elementos que componen la ventana están configurados como LightGray por defecto? ¿No hay una superposición de colores en alguna parte, lo que resulta en una ventana negra? He adjuntado una captura de pantalla:

Puedes ver los colores por defecto del formulario en el constructor de la clase CWindow (fichero Window.mqh).

Si necesitas cambiar los colores del formulario, utiliza los métodos correspondientes de la clase CWindow. Las propiedades del formulario se establecen antes de su creación.

Este ejemplo fue mostrado en el artículo:

//+------------------------------------------------------------------+
//|| Crea un formulario para los | controles
//+------------------------------------------------------------------+
bool CProgram::CreateWindow(const string caption_text)
  {
//--- Añade el puntero de la ventana al array de ventanas
   CWndContainer::AddWindow(m_window);
//--- Propiedades
   m_window.XSize(200);
   m_window.YSize(200);
   m_window.WindowBgColor(clrWhiteSmoke);
   m_window.WindowBorderColor(clrLightSteelBlue);
   m_window.CaptionBgColor(clrLightSteelBlue);
   m_window.CaptionBgColorHover(C'200,210,225');
//--- Creación del formulario
   if(!m_window.CreateWindow(m_chart_id,m_subwin,caption_text,1,1))
      return(false);
//---
   return(true);
  }

//---

Resultado:

 
Gracias por la aclaración.
 

No pude encontrar un método que cambiara el color del texto del encabezado, así que decidí añadir en window.mqh:

//--- Propiedades de la cabecera
   string            m_caption_text;
   int               m_caption_height;
   color             m_caption_text_color;
   color             m_caption_bg_color;
   color             m_caption_bg_color_off;
   color             m_caption_bg_color_hover;
   color             m_caption_color_bg_array[];

Y métodos:

void              CaptionTextColor(const color text_color)                { m_caption_text_color=text_color;        }
color             CaptionTextColor(void)                            const { return(m_caption_text_color);           }

Bueno y este método cambia en consecuencia:

//+------------------------------------------------------------------+
//|| Crea una etiqueta de texto de cabecera|
//+------------------------------------------------------------------+
bool CWindow::CreateLabel(void)
  {
   string name=CElementBase::ProgramName()+"_window_label_"+(string)CElementBase::Id();
//--- Coordenadas del objeto
   int x=CElementBase::X()+m_label_x_gap;
   int y=CElementBase::Y()+m_label_y_gap;
//--- Establecer la etiqueta de texto
   if(!m_label.Create(m_chart_id,name,m_subwin,x,y))
      return(false);
//--- Establecer propiedades
   m_label.Description(m_caption_text);
   m_label.Font(CElementBase::Font());
   m_label.FontSize(CElementBase::FontSize());
   m_label.Color(m_caption_text_color);
   m_label.Corner(m_corner);
   m_label.Selectable(false);
   m_label.Z_Order(m_button_zorder);
   m_label.Tooltip("\n");
//--- Guarda las coordenadas
   m_label.X(x);
   m_label.Y(y);
//--- Indents from the end point
   m_label.XGap(x-m_x);
   m_label.YGap(y-m_y);
//--- Guardar dimensiones
   m_label.XSize(m_label.X_Size());
   m_label.YSize(m_label.Y_Size());
//--- Guardar el puntero del objeto
   CElementBase::AddToArray(m_label);
   return(true);
  }
 
Alexander Fedosov:

No pude encontrar un método que cambiara el color del texto del encabezado, así que decidí añadirlo en window.mqh:

Bien. También añadiré esta característica en uno de los próximos artículos.

La última versión de la librería puede descargarse en este artículo: GUIs X: New features for a drawn table (build 9).

Una nueva versión(build 10) podría ser lanzada la próxima semana.

 

Hola Sr. Anatoli, sus artículos son muy agradables y la codificación son impresionantes.

Necesito una ayuda para construir mi panel en el gráfico. ¿Puede usted por favor me ayude?

Gracias.

 

HI. Me gustaría preguntar cómo puedo solucionar todos estos errores. Gracias

'Window.mqh'    Window.mqh      1       1
'Element.mqh'   Element.mqh     1       1
'Objects.mqh'   Objects.mqh     1       1
'Enums.mqh'     Enums.mqh       1       1
'Defines.mqh'   Defines.mqh     1       1
'ChartObjectsBmpControls.mqh'   ChartObjectsBmpControls.mqh     1       1
'ChartObject.mqh'       ChartObject.mqh 1       1
'Object.mqh'    Object.mqh      1       1
'StdLibErr.mqh' StdLibErr.mqh   1       1
'ChartObjectsTxtControls.mqh'   ChartObjectsTxtControls.mqh     1       1
'Colors.mqh'    Colors.mqh      1       1
undefined class 'CBmpLabel' cannot be used      Window.mqh      25      15
   see declaration of class 'CBmpLabel' Objects.mqh     20      7
undefined class 'CLabel' cannot be used Window.mqh      26      12
   see declaration of class 'CLabel'    Objects.mqh     19      7
undefined class 'CBmpLabel' cannot be used      Window.mqh      27      15
   see declaration of class 'CBmpLabel' Objects.mqh     20      7
undefined class 'CBmpLabel' cannot be used      Window.mqh      28      15
   see declaration of class 'CBmpLabel' Objects.mqh     20      7
undefined class 'CBmpLabel' cannot be used      Window.mqh      29      15
   see declaration of class 'CBmpLabel' Objects.mqh     20      7
undefined class 'CBmpLabel' cannot be used      Window.mqh      30      15
   see declaration of class 'CBmpLabel' Objects.mqh     20      7
'ENUM_WINDOW_TYPE' - unexpected token, probably type is missing?        Window.mqh      36      5
'm_window_type' - semicolon expected    Window.mqh      36      22
'ENUM_WINDOW_TYPE' - unexpected token, probably type is missing?        Window.mqh      99      5
'WindowType' - semicolon expected       Window.mqh      99      23
'void' - name expected  Window.mqh      102     5
'}' - expressions are not allowed on a global scope     Window.mqh      104     5
'const' modifier not allowed for nonmember functions    Window.mqh      118     28
'const' modifier not allowed for nonmember functions    Window.mqh      126     30
'const' modifier not allowed for nonmember functions    Window.mqh      132     29
'const' modifier not allowed for nonmember functions    Window.mqh      138     32
'const' modifier not allowed for nonmember functions    Window.mqh      144     37
'public' - unexpected token, probably type is missing?  Window.mqh      168     3
'long' - unexpected token, probably type is missing?    Window.mqh      170     46
'double' - unexpected token, probably type is missing?  Window.mqh      170     66
'string' - unexpected token, probably type is missing?  Window.mqh      170     88
'virtual' - unexpected token    Window.mqh      172     5
'virtual' - unexpected token    Window.mqh      174     5
'virtual' - unexpected token    Window.mqh      176     5
'virtual' - unexpected token    Window.mqh      177     5
'virtual' - unexpected token    Window.mqh      178     5
'virtual' - unexpected token    Window.mqh      179     5
'virtual' - unexpected token    Window.mqh      181     5
'virtual' - unexpected token    Window.mqh      182     5
'}' - expressions are not allowed on a global scope     Window.mqh      183     1
'RollUpSubwindowMode' - member function not defined     Window.mqh      222     15
'ChangeSubwindowHeight' - member function not defined   Window.mqh      235     15
'Hide' - member function not defined    Window.mqh      294     15
'DefaultIcon' - member function not defined     Window.mqh      362     17
'advisor.bmp' as resource "::Images\EasyAndFastGUI\Icons\bmp16\advisor.bmp"     advisor.bmp     1       1
'indicator.bmp' as resource "::Images\EasyAndFastGUI\Icons\bmp16\indicator.bmp" indicator.bmp   1       1
'script.bmp' as resource "::Images\EasyAndFastGUI\Icons\bmp16\script.bmp"       script.bmp      1       1
'm_window_type' - struct member undefined       Window.mqh      193     5
'm_chart' - undeclared identifier       Window.mqh      210     5
'SetWindowProperties' - undeclared identifier   Window.mqh      212     5
')' - expression expected       Window.mqh      212     25
'm_window_type' - undeclared identifier Window.mqh      286     8
'W_DIALOG' - undeclared identifier      Window.mqh      286     25
'.' - struct or class type expected     Window.mqh      396     15
'Create' - undeclared identifier        Window.mqh      396     16
'Create' - some operator expected       Window.mqh      396     16
'(' - unbalanced left parenthesis       Window.mqh      396     7
',' - unexpected token  Window.mqh      396     33
'name' - some operator expected Window.mqh      396     35
expression has no effect        Window.mqh      396     23
',' - unexpected token  Window.mqh      396     49
expression has no effect        Window.mqh      396     41
',' - unexpected token  Window.mqh      396     52
expression has no effect        Window.mqh      396     51
')' - unexpected token  Window.mqh      396     55
expression has no effect        Window.mqh      396     54
')' - unexpected token  Window.mqh      396     56
'.' - struct or class type expected     Window.mqh      402     11
'BmpFileOn' - undeclared identifier     Window.mqh      402     12
'BmpFileOn' - some operator expected    Window.mqh      402     12
')' - unexpected token  Window.mqh      402     40
expression has no effect        Window.mqh      402     27
'.' - struct or class type expected     Window.mqh      403     11
'BmpFileOff' - undeclared identifier    Window.mqh      403     12
'BmpFileOff' - some operator expected   Window.mqh      403     12
')' - unexpected token  Window.mqh      403     41
expression has no effect        Window.mqh      403     28
'.' - struct or class type expected     Window.mqh      404     11
'Corner' - undeclared identifier        Window.mqh      404     12
'Corner' - some operator expected       Window.mqh      404     12
')' - unexpected token  Window.mqh      404     27
expression has no effect        Window.mqh      404     19
'.' - struct or class type expected     Window.mqh      405     11
'Selectable' - undeclared identifier    Window.mqh      405     12
'Selectable' - some operator expected   Window.mqh      405     12
')' - unexpected token  Window.mqh      405     28
expression has no effect        Window.mqh      405     23
'.' - struct or class type expected     Window.mqh      406     11
'Z_Order' - undeclared identifier       Window.mqh      406     12
'Z_Order' - some operator expected      Window.mqh      406     12
')' - unexpected token  Window.mqh      406     35
expression has no effect        Window.mqh      406     20
'.' - struct or class type expected     Window.mqh      407     11
'Tooltip' - undeclared identifier       Window.mqh      407     12
'Tooltip' - some operator expected      Window.mqh      407     12
')' - unexpected token  Window.mqh      407     24
expression has no effect        Window.mqh      407     21
'.' - struct or class type expected     Window.mqh      409     11
'X' - some operator expected    Window.mqh      409     12
'.' - struct or class type expected     Window.mqh      410     11
'Y' - some operator expected    Window.mqh      410     12
'.' - struct or class type expected     Window.mqh      412     11
'XGap' - some operator expected Window.mqh      412     12
'.' - struct or class type expected     Window.mqh      413     11
'YGap' - some operator expected Window.mqh      413     12
'.' - struct or class type expected     Window.mqh      415     11
'.' - struct or class type expected     Window.mqh      415     24
'X_Size' - undeclared identifier        Window.mqh      415     25
'X_Size' - some operator expected       Window.mqh      415     25
'(' - unexpected token  Window.mqh      415     31
'XSize' - some operator expected        Window.mqh      415     12
'.' - struct or class type expected     Window.mqh      416     11
'.' - struct or class type expected     Window.mqh      416     24
'Y_Size' - undeclared identifier        Window.mqh      416     25
'Y_Size' - some operator expected       Window.mqh      416     25
'(' - unexpected token  Window.mqh      416     31
'YSize' - some operator expected        Window.mqh      416     12
'm_icon' - parameter conversion not allowed     Window.mqh      418     26
   void CElement::AddToArray(CChartObject&)     Element.mqh     195     10
'm_icon_file' - undeclared identifier   Window.mqh      109     9
'm_tooltips_button' - undeclared identifier     Window.mqh      112     9
'm_right_limit' - undeclared identifier Window.mqh      115     9
'm_is_minimized' - undeclared identifier        Window.mqh      119     16
expression not boolean  Window.mqh      119     16
'm_is_minimized' - undeclared identifier        Window.mqh      122     9
100 errors, 11 warnings         101     12