//--- Colunas for(uint c=l; c<m_visible_columns_total; c++) { //--- Obter a posição atual do controle deslizante da barra de rolagem vertical v=m_scrollv.CurrentPos()+t; //--- Linhas for(uint r=t; r<m_visible_rows_total; r++) { //--- Dados da tabela de deslocamento if(v>=t && v<m_rows_total && h>=l && h<m_columns_total) { //--- Ajuste para a linha destacada colorback_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v]; colortext_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v]; //--- Ajustar (1) valores, (2) cor de fundo, (3) cor do texto e (4) alinhamento do texto nas células SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]); v++; } } //--- h++; }
Com base nesta biblioteca de Anatoli Kazharski , tentando soldar uma coruja e queria organizar um registro nos estados de arquivo de caixas de seleção e valores de campos de entrada! Mas, para não registrar sempre TODOS os valores, não consigo entender como determinar o elemento que foi clicado! No aplicativo do usuário, há um manipulador de eventos, e o parâmetro lparam é responsável apenas pelo índice do elemento, mas não consigo entender como encontrar o elemento por esse índice para depois trabalhar com ele!
Com base nessa biblioteca de Anatoli Kazharski , estou tentando soldar uma coruja e queria organizar um registro no arquivo dos estados das caixas de seleção e dos valores dos campos de entrada! Mas, para não registrar sempre TODOS os valores, não consigo entender como determinar o elemento que foi clicado! No aplicativo do usuário, há um manipulador de eventos, e o parâmetro lparam é responsável apenas pelo índice do elemento, mas não consigo entender como encontrar o elemento por esse índice para depois trabalhar com ele!
Desde já, obrigado!
O clique nas caixas de seleção pode ser rastreado pelo evento com o identificador ON_CLICK_LABEL.
Em lparam vem o valor do identificador do elemento.
Exemplo:
//+------------------------------------------------------------------+ //| Manipulador de eventos| //+------------------------------------------------------------------+ void CProgram::OnEvent(constint id,constlong &lparam,constdouble &dparam,conststring &sparam) { //--- Evento de clique no rótulo de texto if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL) { //--- Se você clicou na primeira caixa de seleção if(lparam==m_checkbox1.Id()) { //--- } } }
Respondido já depois de eu ter deixado esta postagem! Obrigado! E eu tenho que passar por todas as caixas de seleção e campos de entrada? E, por exemplo, se houver um "monte" deles? Não há uma matriz que armazene todos os índices dos itens? Então, por meio desse índice, obter os valores necessários (por exemplo, caixa de seleção clicada ou não clicada, valor no campo de entrada)!
O que é um exemplo se houver um "monte" deles? Não há uma matriz que armazene todos os índices dos elementos? Então, por esse índice, obtenha os valores necessários (por exemplo, caixa de seleção clicada ou não clicada, valor no campo de entrada)!
Observe o conteúdo da classe CWndContainer. Todos eles estão armazenados na estrutura WindowElements. Eles podem ser acessados a partir da classe do usuário.
//--- Estrutura de matrizes de elementos struct WindowElements { //--- Matriz total de todos os objetos CChartObject *m_objects[]; //--- Matriz total de todos os elementos CElementBase *m_elements[];
//--- Matrizes pessoais de elementos: // Matriz de menus de contexto CContextMenu *m_context_menus[]; //--- Matriz de menus principais CMenuBar *m_menu_bars[]; //--- Dicas de ferramentas CTooltip *m_tooltips[]; //--- Matriz de listas suspensas de diferentes tipos CElementBase *m_drop_lists[]; //--- Matriz de barras de rolagem CElementBase *m_scrolls[]; //--- Matriz de tabelas de rótulos de texto CElementBase *m_labels_tables[]; //--- Matriz de tabelas dos campos de entrada CElementBase *m_tables[]; //--- Matriz de tabelas desenhadas CElementBase *m_canvas_tables[]; //--- Matriz de guias CTabs *m_tabs[]; //--- Matriz de guias com imagens CIconTabs *m_icon_tabs[]; //--- Matriz de calendários CCalendar *m_calendars[]; //--- Matriz de calendários suspensos CDropCalendar *m_drop_calendars[]; //--- Listas de árvores CTreeView *m_treeview_lists[]; //--- Navegadores de arquivos CFileNavigator *m_file_navigators[]; //--- Gráficos padrão (objetos gráficos) CStandardChart *m_sub_charts[]; //--- Controles deslizantes de imagem CPicturesSlider *m_pictures_slider[]; //--- Tempo CTimeEdit *m_time_edits[]; //--- Campos com várias linhas CTextBox *m_text_boxes[]; }; //--- Matriz de matrizes de elementos para cada janela WindowElements m_wnd[];
Novamente me deparei com implementações de manipuladores de eventos que não entendo! Ao criar um aplicativo personalizado, ele deve conectar a GUI por meio de uma classe:
//--- Conexão da classe do painel de comércio #include "Menu.mqh" CProgram program;
mas então como capturar o pressionamento de botões, como obter os estados das caixas de seleção e os valores dos campos de entrada, se eles estiverem na zona privada da classe CProgram? Devo mover o que preciso para a zona pública ou estou entendendo algo errado?
//+------------------------------------------------------------------+ //| Manipulador de eventos| //+------------------------------------------------------------------+ void CProgram::OnEvent(constint id,constlong &lparam,constdouble &dparam,conststring &sparam) { //--- Evento de clique no rótulo de texto if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL) {
}
}
//---
Todos os artigos têm arquivos de exemplo de aplicativos MQL que mostram como lidar com eventos de controle.
No manipulador CProgram está claro, mas esse manipulador é para a interface, certo? Você não deve inserir soluções comerciais nele! Entendo muito pouco sobre OOP, a maior parte do meu conhecimento vem de seus artigos, portanto, posso ser estúpido! :)
Então, por exemplo, como implementar no Expert Advisor a abertura de uma ordem, cuja quantidade é definida no campo de entrada? Preciso obter o valor desse campo no próprio EA!
Bem, Tol, obrigado pela dica:
for(uint c=l; c<m_visible_columns_total; c++)
{
//--- Obter a posição atual do controle deslizante da barra de rolagem vertical
v=m_scrollv.CurrentPos()+t;
//--- Linhas
for(uint r=t; r<m_visible_rows_total; r++)
{
//--- Dados da tabela de deslocamento
if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
{
//--- Ajuste para a linha destacada
color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];
//--- Ajustar (1) valores, (2) cor de fundo, (3) cor do texto e (4) alinhamento do texto nas células
SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
v++;
}
}
//---
h++;
}
Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação
Biblioteca EasyAndFastGUI
Viktor Glovluk, 2017.01.26 10:42 AM.
Caros membros do fórum, por favor, ajudem!
Com base nesta biblioteca de Anatoli Kazharski , tentando soldar uma coruja e queria organizar um registro nos estados de arquivo de caixas de seleção e valores de campos de entrada! Mas, para não registrar sempre TODOS os valores, não consigo entender como determinar o elemento que foi clicado! No aplicativo do usuário, há um manipulador de eventos, e o parâmetro lparam é responsável apenas pelo índice do elemento, mas não consigo entender como encontrar o elemento por esse índice para depois trabalhar com ele!
Desde já, obrigado!
Viktor Glovluk, 2017.01.26 10:42
Caros membros do fórum, por favor, me ajudem!
Com base nessa biblioteca de Anatoli Kazharski , estou tentando soldar uma coruja e queria organizar um registro no arquivo dos estados das caixas de seleção e dos valores dos campos de entrada! Mas, para não registrar sempre TODOS os valores, não consigo entender como determinar o elemento que foi clicado! No aplicativo do usuário, há um manipulador de eventos, e o parâmetro lparam é responsável apenas pelo índice do elemento, mas não consigo entender como encontrar o elemento por esse índice para depois trabalhar com ele!
Desde já, obrigado!
O clique nas caixas de seleção pode ser rastreado pelo evento com o identificador ON_CLICK_LABEL.
Em lparam vem o valor do identificador do elemento.
Exemplo:
//| Manipulador de eventos|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
//--- Evento de clique no rótulo de texto
if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
{
//--- Se você clicou na primeira caixa de seleção
if(lparam==m_checkbox1.Id())
{
//---
}
}
}
Essa é realmente a única maneira?
//--- Se você clicou na primeira caixa de seleção
if(lparam==m_checkbox1.Id())
Respondido já depois de eu ter deixado esta postagem! Obrigado! E eu tenho que passar por todas as caixas de seleção e campos de entrada? E, por exemplo, se houver um "monte" deles? Não há uma matriz que armazene todos os índices dos itens? Então, por meio desse índice, obter os valores necessários (por exemplo, caixa de seleção clicada ou não clicada, valor no campo de entrada)!Essa é a única maneira?
...
O que é um exemplo se houver um "monte" deles? Não há uma matriz que armazene todos os índices dos elementos? Então, por esse índice, obtenha os valores necessários (por exemplo, caixa de seleção clicada ou não clicada, valor no campo de entrada)!
Observe o conteúdo da classe CWndContainer. Todos eles estão armazenados na estrutura WindowElements. Eles podem ser acessados a partir da classe do usuário.
struct WindowElements
{
//--- Matriz total de todos os objetos
CChartObject *m_objects[];
//--- Matriz total de todos os elementos
CElementBase *m_elements[];
//--- Matrizes pessoais de elementos:
// Matriz de menus de contexto
CContextMenu *m_context_menus[];
//--- Matriz de menus principais
CMenuBar *m_menu_bars[];
//--- Dicas de ferramentas
CTooltip *m_tooltips[];
//--- Matriz de listas suspensas de diferentes tipos
CElementBase *m_drop_lists[];
//--- Matriz de barras de rolagem
CElementBase *m_scrolls[];
//--- Matriz de tabelas de rótulos de texto
CElementBase *m_labels_tables[];
//--- Matriz de tabelas dos campos de entrada
CElementBase *m_tables[];
//--- Matriz de tabelas desenhadas
CElementBase *m_canvas_tables[];
//--- Matriz de guias
CTabs *m_tabs[];
//--- Matriz de guias com imagens
CIconTabs *m_icon_tabs[];
//--- Matriz de calendários
CCalendar *m_calendars[];
//--- Matriz de calendários suspensos
CDropCalendar *m_drop_calendars[];
//--- Listas de árvores
CTreeView *m_treeview_lists[];
//--- Navegadores de arquivos
CFileNavigator *m_file_navigators[];
//--- Gráficos padrão (objetos gráficos)
CStandardChart *m_sub_charts[];
//--- Controles deslizantes de imagem
CPicturesSlider *m_pictures_slider[];
//--- Tempo
CTimeEdit *m_time_edits[];
//--- Campos com várias linhas
CTextBox *m_text_boxes[];
};
//--- Matriz de matrizes de elementos para cada janela
WindowElements m_wnd[];
Quanto mais longe, melhor! :)
Novamente me deparei com implementações de manipuladores de eventos que não entendo! Ao criar um aplicativo personalizado, ele deve conectar a GUI por meio de uma classe:
#include "Menu.mqh"
CProgram program;
mas então como capturar o pressionamento de botões, como obter os estados das caixas de seleção e os valores dos campos de entrada, se eles estiverem na zona privada da classe CProgram? Devo mover o que preciso para a zona pública ou estou entendendo algo errado?
...
mas depois como capturar o pressionamento de botões, como obter os estados das caixas de seleção e os valores dos campos de entrada, ...
No manipulador do CProgram.
//+------------------------------------------------------------------+
//| Manipulador de eventos|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
//--- Evento de clique no rótulo de texto
if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
{
}
}
//---
Todos os artigos têm arquivos de exemplo de aplicativos MQL que mostram como lidar com eventos de controles.
No manipulador do CProgram.
//+------------------------------------------------------------------+
//| Manipulador de eventos|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
//--- Evento de clique no rótulo de texto
if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
{
}
}
//---
Todos os artigos têm arquivos de exemplo de aplicativos MQL que mostram como lidar com eventos de controle.
No manipulador CProgram está claro, mas esse manipulador é para a interface, certo? Você não deve inserir soluções comerciais nele! Entendo muito pouco sobre OOP, a maior parte do meu conhecimento vem de seus artigos, portanto, posso ser estúpido! :)
Então, por exemplo, como implementar no Expert Advisor a abertura de uma ordem, cuja quantidade é definida no campo de entrada? Preciso obter o valor desse campo no próprio EA!
No manipulador CProgram, isso está claro, mas esse manipulador é para a interface, certo? Você não deveria estar inserindo soluções comerciais nele!
Por que não? Sim, você pode. É uma classe de seu aplicativo MQL (indicador ou Expert Advisor). Tudo é igual.
Você pode obter o valor do campo de entrada da seguinte forma: