Discussão do artigo "DoEasy. Controles (Parte 19): Rolagem de guias no elemento TabControl, eventos de objetos WinForms"

 

Novo artigo DoEasy. Controles (Parte 19): Rolagem de guias no elemento TabControl, eventos de objetos WinForms foi publicado:

Neste artigo, veremos como podemos criar uma funcionalidade para a rolagem dos cabeçalhos das guias no controle TabControl por meio de botões de rolagem. Essa funcionalidade organizará os cabeçalhos das guias em uma única linha em ambos os lados do controle.

Compilamos o Expert Advisor e o iniciamos no gráfico:


Como podemos ver, tudo o que queríamos fazer hoje funciona como planejado.

Autor: Artyom Trishkin

 
Uau. Isso é muito útil. Há muito potencial de uso.
Terei que dar uma olhada nos outros artigos da série.
Agradecimentos ao autor
 

Ao mover o mouse e rolar a roda acima do painel, o próprio gráfico às vezes pode rolar.

Como obter o elemento criado de forma inequívoca? Se já tivermos elementos do tipo GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL antes, o uso do índice 0 será incorreto.

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);

Em seguida... Obtivemos o ID do cabeçalho da guia de interesse:

int my_id=-1;
...
CTabHeader *th=tc.GetElementByType(GRAPH_ELEMENT_TYPE_WF_TAB_HEADER,4);
my_id=th.ID();

Capture o evento de alteração da guia ativa, mais precisamente, o evento de clicar no cabeçalho. Ao clicar na guia ativa, o evento ainda é gerado.

if((id-CHARTEVENT_CUSTOM==WF_CONTROL_EVENT_TAB_SELECT)&&(lparam==my_id))
     {
      Print(sparam);
     }

Agora, como obter o objeto do campo ativo? Ele é um CTabField, certo?

Como descobrir o objeto pai?

 
Aliaksandr Hryshyn guia ativa, o evento ainda é gerado.

Agora, como obter o objeto do campo ativo? Ele é um CTabField, certo?

Como descobrir o objeto pai?

1. O índice 0 é usado para o primeiro objeto anexado criado para o elemento. O índice 1 é para o segundo, o índice 2 é para o terceiro e assim por diante.

2. Você pode recuperar um campo do cabeçalho recuperado pelo índice de interesse:

         //--- Criar elemento de controle 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 Você pode recuperar o campo de tabulação do objeto TabControl no índice de interesse:

         //--- Criar elemento de controle 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. Não entendi bem a pergunta. Se você precisar descobrir a qual objeto o atual está vinculado, deve funcionar assim:

      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,"Descrição do painel: ",pnl.Description(),", Tipo e nome: ",pnl.TypeElementDescription()," ",pnl.Name());
         //--- Definir o preenchimento como 4
         pnl.SetPaddingAll(3);
         //--- Defina os sinalizadores para deslocamento, redimensionamento automático e modo de redimensionamento automático a partir dos parâmetros de entrada
         pnl.SetMovable(InpMovable);
         pnl.SetAutoSize(InpAutoSize,false);
         pnl.SetAutoSizeMode((ENUM_CANV_ELEMENT_AUTO_SIZE_MODE)InpAutoSizeMode,false);
   
         //--- Criar elemento de controle 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);  // Obter campo de registro do elemento TabControl tc
            CWinFormBase *base=tf.GetBase();       // Descubra o objeto base para o campo da guia - deve ser TabControl tc
            CWinFormBase *main=tf.GetMain();       // Descubra o objeto principal para o campo da guia - deve ser o CPanel pnl
           }

Se ele não retornar os objetos especificados nos comentários dessa forma, então é um bug e precisa ser refinado