Discusión sobre el artículo "DoEasy. Elementos de control (Parte 19): Scrolling de pestañas en el elemento TabControl, eventos de objetos WinForms"
Al mover el ratón y desplazar la rueda por encima del panel, a veces se desplaza el propio gráfico.
¿Cómo obtener inequívocamente el elemento creado? Si ya hemos tenido elementos de tipo GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL anteriormente, entonces usar el índice 0 será incorrecto.
pnl.CreateNewElement(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,InpTabControlX,InpTabControlY,pnl.Width()-30,pnl.Height()-40,clrNONE,255,true,false); CTabControl *tc=pnl.GetElementByType(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,0);
A continuación... Obtenemos el id de la cabecera de la pestaña de interés:
int my_id=-1; ... CTabHeader *th=tc.GetElementByType(GRAPH_ELEMENT_TYPE_WF_TAB_HEADER,4); my_id=th.ID();
Capturamos el evento de cambio de la pestaña activa, más concretamente, el evento de pulsar sobre la cabecera. Al hacer clic en la pestaña activa, el evento se sigue generando.
if((id-CHARTEVENT_CUSTOM==WF_CONTROL_EVENT_TAB_SELECT)&&(lparam==my_id)) { Print(sparam); }
Ahora, ¿cómo obtener el objeto del campo activo? Es un CTabField, ¿verdad?
¿Cómo averiguar el objeto padre?
Ahora, ¿cómo obtener el objeto del campo activo? Es un CTabField, ¿verdad?
¿Cómo averiguar el objeto padre?
1. Elíndice 0 se utiliza para el primer objeto creado adjunto al elemento. El índice 1 es para el segundo, el índice 2 es para el tercero, y así sucesivamente.
2. Puede recuperar un campo de la cabecera recuperada por el índice que le interese:
//--- Crear elemento de control TabControl pnl.CreateNewElement(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,InpTabControlX,InpTabControlY,pnl.Width()-30,pnl.Height()-40,clrNONE,255,true,false); CTabControl *tc=pnl.GetElementByType(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,0); if(tc!=NULL) { CTabHeader *th=tc.GetTabHeader(index); CTabField *tf=th.GetFieldObj(); }
2.1 Puede recuperar el campo tab del objeto TabControl por el índice de interés:
//--- Crear elemento de control TabControl pnl.CreateNewElement(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,InpTabControlX,InpTabControlY,pnl.Width()-30,pnl.Height()-40,clrNONE,255,true,false); CTabControl *tc=pnl.GetElementByType(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,0); if(tc!=NULL) { CTabField *tf=tc.GetTabField(index); }
3. No entiendo bien la pregunta. Si necesitas averiguar a qué objeto está ligado el actual, debería funcionar así:
pnl=engine.CreateWFPanel("WinForms Panel"+(string)i,(i==0 ? 50 : 70),(i==0 ? 50 : 70),410,200,array_clr,200,true,true,false,-1,FRAME_STYLE_BEVEL,true,false); if(pnl!=NULL) { pnl.Hide(); Print(DFUN,"Descripción del panel: ",pnl.Description(),", Tipo y nombre: ",pnl.TypeElementDescription()," ",pnl.Name()); //--- Poner el relleno a 4 pnl.SetPaddingAll(3); //--- Establece las banderas de desplazamiento, auto redimensionado y modo de auto redimensionado de los parámetros de entrada pnl.SetMovable(InpMovable); pnl.SetAutoSize(InpAutoSize,false); pnl.SetAutoSizeMode((ENUM_CANV_ELEMENT_AUTO_SIZE_MODE)InpAutoSizeMode,false); //--- Crear elemento de control TabControl pnl.CreateNewElement(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,InpTabControlX,InpTabControlY,pnl.Width()-30,pnl.Height()-40,clrNONE,255,true,false); CTabControl *tc=pnl.GetElementByType(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,0); if(tc!=NULL) { CTabField *tf=tc.GetTabField(index); // Obtener campo de pestaña del elemento TabControl tc CWinFormBase *base=tf.GetBase(); // Averiguar el objeto base para el campo de pestaña - debe ser TabControl tc CWinFormBase *main=tf.GetMain(); // Averigua el objeto principal para el campo pestaña - debe ser CPanel pnl }
Si no devuelve los objetos especificados en los comentarios de esta manera, entonces es un error y necesita ser refinado
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Artículo publicado DoEasy. Elementos de control (Parte 19): Scrolling de pestañas en el elemento TabControl, eventos de objetos WinForms:
En este artículo, crearemos la funcionalidad necesaria para el scrolling de los encabezados de las pestañas en TabControl usando los botones de control de scrolling. La funcionalidad servirá para organizar los encabezados de las pestañas en una sola línea a cualquier lado del control.
Vamos a compilar el asesor y ejecutarlo en el gráfico:
Como podemos ver, todo lo que queríamos hacer hoy está funcionando según lo previsto.
Eso sí, hay dos pequeñas faltas: si pasamos el cursor por encima de una zona del encabezado de una pestaña que esté oculta, el encabezado reaccionará cambiando de color como si estuviera visible en ese lugar. Esta es la razón por la que la zona activa del elemento no cambia de tamaño cuando se redimensiona la zona visible. Para corregirlo, deberemos calcular la zona activa y redimensionarla para que coincida con la zona visible.
La segunda falta es que si desplazamos el encabezado seleccionado fuera del contenedor y desplazamos el panel, se mostrarán los dos píxeles del encabezado oculto. Esto tiene que ver con la especificación del tamaño de la pestaña para calcular la zona de visibilidad, ya que el encabezado seleccionado aumentará de tamaño en dos píxeles a cada lado. Para solucionarlo, dentro del objeto de encabezado de la pestaña, deberemos averiguar cómo obtener el tamaño del encabezado adyacente que se utiliza para calcular el tamaño de la zona de visibilidad.
Llegaremos a esto artículos posteriores, junto con el desarrollo del nuevo objeto WinForms.
Autor: Artyom Trishkin