Discussão do artigo "Como adicionar rapidamente paneis de controle a indicadores e conselheiros (EA)" - página 2

 
Maxim Dmitrievsky:

Bem, foi isso que fiz, mas nada funciona. O painel continua branco como antes.

O compilador diz Macro redifinition, ou seja, como overdivided....

Siga meu primeiro conselho: substitua as cores no arquivo original e recompile o EA.

Para lembrar como redefini as cores em meu painel, preciso pesquisar, mas não tenho tempo agora.

 

Para a História:

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Por que o painel se afasta ao atualizar as configurações do Expert Advisor?

Andrey Khatimlianskii, 2016.03.10 13:17

Mais ou menos assim:

// ANTES de conectar o Dialog.mqh!
#include <Controls\Defines.mqh>

//--- Esqueça as cores antigas
#undef   CONTROLS_DIALOG_COLOR_BORDER_LIGHT
#undef   CONTROLS_DIALOG_COLOR_BORDER_DARK
#undef   CONTROLS_DIALOG_COLOR_BG
#undef   CONTROLS_DIALOG_COLOR_CAPTION_TEXT
#undef   CONTROLS_DIALOG_COLOR_CLIENT_BG
#undef   CONTROLS_DIALOG_COLOR_CLIENT_BORDER

//--- Definir novas cores
#define  CONTROLS_DIALOG_COLOR_BORDER_LIGHT  clrWhite            // Cor da borda da caixa de diálogo (externa)
#define  CONTROLS_DIALOG_COLOR_BORDER_DARK   C'0xB6,0xB6,0xB6'   // Cor da borda da caixa de diálogo (interna)
#define  CONTROLS_DIALOG_COLOR_BG            clrLightGreen       // Plano de fundo da caixa de diálogo (sob a legenda e ao redor da área do cliente)
#define  CONTROLS_DIALOG_COLOR_CAPTION_TEXT  C'0x28,0x29,0x3B'   // Cor do texto da legenda da caixa de diálogo
#define  CONTROLS_DIALOG_COLOR_CLIENT_BG     clrAliceBlue        // Cor de fundo da área do cliente
#define  CONTROLS_DIALOG_COLOR_CLIENT_BORDER C'0xC8,0xC8,0xC8'   // Cor da área do cliente

// Agora conecte
#include <Controls\Dialog.mqh>

 

Você pode me dar um exemplo simples de como o CWndContainer deve ser distorcido para exibir pelo menos algum quadrado na tela de bate-papo usando .Show()?

Tentei de tudo, por exemplo, desta forma, mas não há erro, nem imagem, nem sinal de que .Show() esteja funcionando

#include <Controls\WndContainer.mqh>

class MyWndContainer : public CWndContainer  {
   public:
      MyWndContainer(string name);
};

//+------------------------------------------------------------------+
//| Construtor|
//+------------------------------------------------------------------+
MyWndContainer::MyWndContainer(string name) {
   m_chart_id = ChartID();
   m_subwin = 0;
   m_name = name;
                   m_id = 0;
                   m_align_top = 5;
                   m_align_right = 5;
                   m_align_left = 5;
                   m_align_bottom = 5;
                   m_mouse_x = 100;
                   m_mouse_y = 100;
                   m_align_flags = ALIGN_CENTER;
                   m_prop_flags = PROGRAM_EXPERT;
                   m_mouse_flags = MOUSE_EMPTY;
} 
 
Evgeny Potapov:

Você pode me dar um exemplo simples de como o CWndContainer deve ser distorcido para exibir pelo menos algum quadrado na tela de bate-papo usando .Show()?

Tentei de tudo, por exemplo, desta forma, mas não há erro, nem imagem, nem sinal de que .Show() esteja funcionando.

Por que CWndContainer? O que você deve obter no final?
 

Não entendo a lógica aqui:

//+------------------------------------------------------------------+
//| Torna o grupo de controles visível
//+------------------------------------------------------------------+
bool CWndContainer::Show(void)
  {
//--- loop por elementos do grupo
   int total=m_controls.Total();
   for(int i=0;i<total;i++)
     {
      CWnd *control=Control(i);
      //--- verificação do ponteiro
      if(control==NULL)
         continue;
      control.Show();
     }
//--- chamada do método da classe principal
   return(CWnd::Show());
  }

E se eu tiver um objeto Button e ele não tiver um método .Show()?

Ele não pode estar contido em um contêiner?

 
Karputov Vladimir:
Por que CWndContainer? O que devemos obter no final?
Um painel com botões de compra e venda e mais algumas notificações sobre o estado do Expert Advisor. Mas ele deve ser arrastado na tela com o mouse, mas o botão não é arrastado.
 
Evgeny Potapov:
Um painel com botões de compra e venda e mais algumas notificações sobre o estado do Expert Advisor. Mas ele deve ser arrastado na tela com o mouse, mas o botão não é arrastado.
Depois de criar um objeto (botão, lista, campo de texto etc.), esse objeto deve ser adicionado ao painel (método Add). Então, ao arrastar o painel, todos os objetos serão movidos junto com o painel.
 
Karputov Vladimir:
Depois de criar um objeto (botão, lista, campo de texto, etc.), esse objeto deve ser adicionado ao painel (método Add). Em seguida, ao arrastar o painel, todos os objetos serão movidos junto com o painel.

Assim?

#include <Controls\Button.mqh>
#include <MyControls\MyWndContainer.mqh>

CButton *MyButton;
CWndContainer  *MyContainer;
//+------------------------------------------------------------------+
//| Função de inicialização de especialista|
//+------------------------------------------------------------------+
int OnInit()  {
   MyButton = new CButton;
   if(CheckPointer(MyButton) == POINTER_INVALID) return(INIT_FAILED);
   MyButton.Create(ChartID(),WindowExpertName()+"_button",0,50,100,150,250);

   MyContainer = new MyWndContainer("MyContainer");
   if(CheckPointer(MyContainer) == POINTER_INVALID) return(INIT_FAILED);
   MyContainer.Add(MyButton);
   MyContainer.Show();
   MyContainer.Enable();

   
   return(INIT_SUCCEEDED);
}
 
Karputov Vladimir:
Depois de criar um objeto (botão, lista, campo de texto, etc.), esse objeto deve ser adicionado ao painel (método Add). Então, ao arrastar o painel, todos os objetos serão movidos junto com o painel.

Ou isso não é "adicionar ao painel"?

Então um contêiner não é um painel?

 
Evgeny Potapov:

Ou não se trata de "adicionar a um painel"?

Então um contêiner não é um painel?

Usando o arquivo PanelDialog2.mqh do artigo como exemplo:

//+------------------------------------------------------------------+
//|PanelDialog2.mqh
//| Copyright 2015, MetaQuotes Software Corp.
//| http://www.mql5.com
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\CheckGroup.mqh>
#include <Controls\Label.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Button.mqh>
//+------------------------------------------------------------------+
//| define|
//+------------------------------------------------------------------+
//--- recuos e intervalos
#define  INDENT_LEFT                         (11)      // recuo da esquerda (com tolerância para a largura da borda)
#define  INDENT_TOP                          (11)      // recuo a partir do topo (com tolerância para a largura da borda)
#define  INDENT_RIGHT                        (11)      // recuo da direita (com tolerância para a largura da borda)
#define  INDENT_BOTTOM     

Esse arquivo cria os elementos para um painel de diálogo. O símbolo do painel é a classe CDialog.

Classe CDialog

A classe CDialog é uma classe do controle combo Dialog.

Descrição

A classe CDialog foi projetada para combinar visualmente um grupo de elementos heterogêneos relacionados funcionalmente.