Tipos de Eventos de Gráficos
Existem 11 tipos de eventos que podem ser processados usando a função pré-definida OnChartEvent(). Para eventos customizados 65535 identificadores são fornecidos na faixa de CHARTEVENT_CUSTOM a CHARTEVENT_CUSTOM_LAST inclusive. Para gerar um evento customizado, a função EventChartCustom() deve ser usada.
ENUM_CHART_EVENT
|
|
|
CHARTEVENT_KEYUP
|
Soltar tecla
|
CHARTEVENT_KEYDOWN
|
Teclada
|
CHARTEVENT_MOUSE_MOVE
|
Movimento de mouse, cliques de mouse (se CHART_EVENT_MOUSE_MOVE=true é definido para o gráfico)
|
CHARTEVENT_MOUSE_WHEEL
|
Pressionada o rodada a roda do mouse (se definida a propriedade para o gráfico CHART_EVENT_MOUSE_WHEEL=true)
|
CHARTEVENT_OBJECT_CREATE
|
Objeto gráfico criado (se CHART_EVENT_OBJECT_CREATE=true é definido para o gráfico)
|
CHARTEVENT_OBJECT_CHANGE
|
Propriedade do objeto gráfico alterada via janela de diálogo de propriedades
|
CHARTEVENT_OBJECT_DELETE
|
Objeto gráficoexcluído (se CHART_EVENT_OBJECT_DELETE=true é definido para o gráfico)
|
CHARTEVENT_CLICK
|
Dar um clique em um gráfico
|
CHARTEVENT_OBJECT_CLICK
|
Dar um clique em um objeto gráfico
|
CHARTEVENT_OBJECT_DRAG
|
Arrastar e soltar um objeto gráfico
|
CHARTEVENT_OBJECT_ENDEDIT
|
Fim de edição de texto no objeto gráfico Edit
|
CHARTEVENT_CHART_CHANGE
|
Alteração do tamanho do gráfico ou modificação das propriedades do gráfico através da janela de Propriedades
|
CHARTEVENT_CUSTOM
|
O número inicial de um evento de uma faixa de eventos customizados
|
CHARTEVENT_CUSTOM_LAST
|
O número final de um evento de uma faixa de eventos customizados
|
Evento CHARTEVENT_KEYUP
O evento CHARTEVENT_KEYUP ocorre quando o usuário solta uma tecla do teclado, se a janela do gráfico estiver com o foco de entrada. Esse evento complementa o existente CHARTEVENT_KEYDOWN, que é gerado quando a tecla é pressionada. O uso de ambos os eventos permite determinar com precisão o momento de pressionar e soltar as teclas, o que é útil ao criar interfaces de usuário e ferramentas com controle interativo.
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
if(id == CHARTEVENT_KEYUP)
{
int key = (int)lparam;
::Print("Key released: ", TranslateKey(key));
}
}
|
O valor de lparam contém o código da tecla (KeyCode), de forma análoga ao evento CHARTEVENT_KEYDOWN. Para obter a representação textual da tecla, pode-se usar a função TranslateKey().
Tratamento de teclas mortas (Dead Keys)
É suportado o tratamento das chamadas "teclas mortas" (dead keys).Essas são teclas que não inserem um caractere imediatamente, mas modificam o próximo caractere digitado. Por exemplo, no layout grego, a tecla ; é usada para adicionar acento às vogais (ά, έ, ύ etc.).
Agora, essas teclas podem ser rastreadas usando a função TranslateKey() nos manipuladores CHARTEVENT_KEYDOWN e CHARTEVENT_KEYUP. Isso permite detectar corretamente a pressão e liberação de combinações de teclas compostas em layouts de teclado multilíngues.
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
if(id == CHARTEVENT_KEYDOWN)
{
int key = (int)lparam;
string text = TranslateKey(key);
::Print("Pressed: ", text);
}
if(id == CHARTEVENT_KEYUP)
{
int key = (int)lparam;
string text = TranslateKey(key);
::Print("Released: ", text);
}
}
|
O tratamento de teclas mortas é útil na implementação de campos de texto personalizados, sistemas de atalhos e interfaces que respondem a layouts de teclado internacionais.
Parâmetros de entrada da função OnChartEvent
Para cada tipo de evento, os parâmetros de entrada da função OnChartEvent() têm valores definidos que são requeridos para o processamento deste evento. Os eventos e valores passados através destes parâmetros são listados na tabela abaixo.
Evento
|
Valor do parâmetro id
|
Valor do parâmetro lparam
|
Valor do parâmetro dparam
|
Valor do parâmetro sparam
|
Evento de liberação da tecla
|
CHARTEVENT_KEYUP
|
Código da tecla liberada
|
Número de repetições do evento sempre 1
|
Valor em string da máscara de bits que descreve o estado das teclas modificadoras. Consulte WM_KEYUP message
|
Evento de pressionar tecla
|
CHARTEVENT_KEYDOWN
|
Código da tecla pressionada
|
Número de repetições do evento ao segurar a tecla
|
Valor em string da máscara de bits que descreve o estado das teclas modificadoras. Consulte WM_KEYDOWN message
|
Eventos de mouse(se CHART_EVENT_MOUSE_MOVE=true é definido para o gráfico)
|
CHARTEVENT_MOUSE_MOVE
|
a coordenada X
|
a coordenada Y
|
O valor de string de uma máscara de bites descrevendo o estado de botões de mouse
|
Evento da roda do mouse (se, para o gráfico, definida a propriedade CHART_EVENT_MOUSE_WHEEL=true)
|
CHARTEVENT_MOUSE_WHEEL
|
Sinalizadores de estados de teclas e botões do mouse, coordenadas X e Y do mouse. A descrição é feita no exemplo abaixo
|
Valor Delta de rolagem de roda de mouse
|
|
Evento de criação de objeto gráfico(se CHART_EVENT_OBJECT_CREATE=true é definido para o gráfico)
|
CHARTEVENT_OBJECT_CREATE
|
|
|
Nome do objeto gráfico criado
|
Evento de mudança de uma propriedade de objeto via janela de diálogo de propriedades
|
CHARTEVENT_OBJECT_CHANGE
|
|
|
Nome do objeto gráfico modificado
|
Evento de exclusão de objeto gráfico (se CHART_EVENT_OBJECT_DELETE=true está definido para o gráfico)
|
CHARTEVENT_OBJECT_DELETE
|
|
|
Nome do objeto gráfico excluído
|
Evento de um click de mouse no gráfico
|
CHARTEVENT_CLICK
|
a coordenada X
|
a coordenada Y
|
|
Evento de um click de mouse num objeto gráfico pertencente ao gráfico
|
CHARTEVENT_OBJECT_CLICK
|
a coordenada X
|
a coordenada Y
|
Nome do objeto gráfico, na qual o evento ocorreu
|
Evento de um objeto gráfico arrastado usando o mouse
|
CHARTEVENT_OBJECT_DRAG
|
|
|
Nome do objeto gráfico movido
|
Evento da edição de texto finalizada na caixa de entrada do objeto gráfico LabelEdit
|
CHARTEVENT_OBJECT_ENDEDIT
|
|
|
Nome do objeto gráfico LabelEdit, cuja edição de texto foi concluída
|
Evento de alteração do tamanho do gráfico ou modificação das propriedades do gráfico através da janela de Propriedades
|
CHARTEVENT_CHART_CHANGE
|
|
|
|
ID do evento de usuário sob N número
|
CHARTEVENT_CUSTOM+N
|
Valor definido pela função EventChartCustom()
|
Valor definido pela função EventChartCustom()
|
Valor definido pela função EventChartCustom()
|
Exemplo:
#define KEY_NUMPAD_5 12
#define KEY_LEFT 37
#define KEY_UP 38
#define KEY_RIGHT 39
#define KEY_DOWN 40
#define KEY_NUMLOCK_DOWN 98
#define KEY_NUMLOCK_LEFT 100
#define KEY_NUMLOCK_5 101
#define KEY_NUMLOCK_RIGHT 102
#define KEY_NUMLOCK_UP 104
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Print("O expert com nome ",MQL5InfoString(MQL5_PROGRAM_NAME)," está executando");
//--- Ativar eventos de criação de objetos
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- Ativar eventos de exclusão de objetos
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- A atualização forçada das propriedades do gráfico garante a prontidão para o processamento de eventos
ChartRedraw();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Funções ChartEvent |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, // Identificador de evento
const long& lparam, // Parâmetro de evento de tipo long
const double& dparam, // Parâmetro de evento de tipo double
const string& sparam // Parâmetro de evento de tipo string
)
{
//--- o botão esquerdo do mouse foi pressionado no gráfico
if(id==CHARTEVENT_CLICK)
{
Print("As coordenadas do clique do mouse sobre o gráfico são: x = ",lparam," y = ",dparam);
}
//--- o mouse foi clicado sobre o objeto gráfico
if(id==CHARTEVENT_OBJECT_CLICK)
{
Print("O mouse foi clicado sobre o objeto com o nome '"+sparam+"'");
}
//--- a tecla foi pressionada
if(id==CHARTEVENT_KEYDOWN)
{
switch(lparam)
{
case KEY_NUMLOCK_LEFT: Print("O KEY_NUMLOCK_LEFT foi pressionado"); break;
case KEY_LEFT: Print("O KEY_LEFT foi pressionado"); break;
case KEY_NUMLOCK_UP: Print("O KEY_NUMLOCK_UP foi pressionado"); break;
case KEY_UP: Print("O KEY_UP foi pressionado"); break;
case KEY_NUMLOCK_RIGHT: Print("O KEY_NUMLOCK_RIGHT foi pressionado"); break;
case KEY_RIGHT: Print("O KEY_RIGHT foi pressionado"); break;
case KEY_NUMLOCK_DOWN: Print("O KEY_NUMLOCK_DOWN foi pressionado"); break;
case KEY_DOWN: Print("O KEY_DOWN foi pressionado"); break;
case KEY_NUMPAD_5: Print("O KEY_NUMPAD_5 foi pressionado"); break;
case KEY_NUMLOCK_5: Print("O KEY_NUMLOCK_5 foi pressionado"); break;
default: Print("Algumas teclas não listadas foram pressionadas");
}
ChartRedraw();
}
//--- o objeto foi excluído
if(id==CHARTEVENT_OBJECT_DELETE)
{
Print("O objeto com o nome ",sparam," foi excluído");
}
//--- o objeto foi criado
if(id==CHARTEVENT_OBJECT_CREATE)
{
Print("O objeto com o nome ",sparam," foi criado");
}
//--- o objeto foi movido ou suas coordenadas de ponto de ancoragem foram alteradas
if(id==CHARTEVENT_OBJECT_DRAG)
{
Print("O ponto de ancoragem das coordenadas do objeto com o nome ",sparam," foi alterado");
}
//--- o texto na Edição do objeto foi alterado
if(id==CHARTEVENT_OBJECT_ENDEDIT)
{
Print("O texto no campo da Edição do objeto com o nome ",sparam," foi alterado");
}
}
|
Para o evento CHARTEVENT_MOUSE_MOVE, o parâmetro string sparam Contém informações sobre o estado do teclado e botões do mouse:
|
|
|
1
|
Estado do botão esquerdo do mouse
|
2
|
Estado do botão direito do mouse
|
3
|
Estado do botão SHIFT
|
4
|
Estado do botão CTRL
|
5
|
Estado do botão do meio do mouse
|
6
|
Estado do primeiro botão extra do mouse
|
7
|
Estado do segundo botão extra do mouse
|
Exemplo:
//+------------------------------------------------------------------+
//| Função de inicialização do Expert |
//+------------------------------------------------------------------+
void OnInit()
{
//--- habilitar mensagens do CHART_EVENT_MOUSE_MOVE
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
// --- desativar o menu de contexto do gráfico (à direita)
ChartSetInteger(0,CHART_CONTEXT_MENU,0);
// --- desativar a cruz (pelo botão do meio)
ChartSetInteger(0,CHART_CROSSHAIR_TOOL,0);
//--- a atualização forçada das propriedades do gráfico garante a prontidão para o processamento de eventos
ChartRedraw();
}
//+------------------------------------------------------------------+
//| MouseState |
//+------------------------------------------------------------------+
string MouseState(uint state)
{
string res;
res+="\nML: " +(((state& 1)== 1)?"DN":"UP"); // mouse esquerdo
res+="\nMR: " +(((state& 2)== 2)?"DN":"UP"); // mouse direito
res+="\nMM: " +(((state&16)==16)?"DN":"UP"); // mouse do meio
res+="\nMX: " +(((state&32)==32)?"DN":"UP"); // mouse primeiro X key
res+="\nMY: " +(((state&64)==64)?"DN":"UP"); // mouse segundo X key
res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP"); // shift key
res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP"); // control key
return(res);
}
//+------------------------------------------------------------------+
//| Funções ChartEvent |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(id==CHARTEVENT_MOUSE_MOVE)
Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
}
|
Para o evento CHARTEVENT_MOUSE_WHEEL, os parâmetros lparam e dparam contêm informações sobre o estado da tecla Ctrl, Shift, dos botões do mouse, coordenadas da cursor e dimensão da rolagem da roda do mouse. Para entender melhor o funcionamento deste Expert Advisor no gráfico, role a roda do mouse pressionando os diversos botões e teclas descritos no código.
Exemplo de processamento de evento CHARTEVENT_MOUSE_WHEEL:
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
init OnInit()
{
//--- ativação da mensagem de rolagem de roda do mouse
ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- a atualização forçada das propriedades do gráfico garante a prontidão para o processamento de eventos
ChartRedraw();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(id==CHARTEVENT_MOUSE_WHEEL)
{
//--- analisemos o estado dos botões e da roda do mouse para este evento
int flg_keys = (int)(lparam>>32); // sinalizador de estado de teclas Ctrl, Shift e de botões do mouse
int x_cursor = (int)(short)lparam; // coordenada X, em que acontece o evento da roda do mouse
int y_cursor = (int)(short)(lparam>>16); // coordenada Y, em que acontece o evento de roda do mouse
int delta = (int)dparam; // valor total de rolagem da roda, é ativado ao alcançar +120 ou -120
//--- processamos o sinalizador
string str_keys="";
if((flg_keys&0x0001)!=0) str_keys+="LMOUSE ";
if((flg_keys&0x0002)!=0) str_keys+="RMOUSE ";
if((flg_keys&0x0004)!=0) str_keys+="SHIFT ";
if((flg_keys&0x0008)!=0) str_keys+="CTRL ";
if((flg_keys&0x0010)!=0) str_keys+="MMOUSE ";
if((flg_keys&0x0020)!=0) str_keys+="X1MOUSE ";
if((flg_keys&0x0040)!=0) str_keys+="X2MOUSE ";
if(str_keys!="")
str_keys=", keys='"+StringSubstr(str_keys,0,StringLen(str_keys)-1) + "'";
PrintFormat("%s: X=%d, Y=%d, delta=%d%s",EnumToString(CHARTEVENT_MOUSE_WHEEL),x_cursor,y_cursor,delta,str_keys);
}
}
//+------------------------------------------------------------------+ /*
Exemplo de saída
CHARTEVENT_MOUSE_WHEEL: Ctrl pressed: X=193, Y=445, delta=-120
CHARTEVENT_MOUSE_WHEEL: Shift pressed: X=186, Y=446, delta=120
CHARTEVENT_MOUSE_WHEEL: X=178, Y=447, delta=-120
CHARTEVENT_MOUSE_WHEEL: X=231, Y=449, delta=120
CHARTEVENT_MOUSE_WHEEL: MiddleButton pressed: X=231, Y=449, delta=120
CHARTEVENT_MOUSE_WHEEL: LeftButton pressed: X=279, Y=320, delta=-120
CHARTEVENT_MOUSE_WHEEL: RightButton pressed: X=253, Y=330, delta=120 */
|
Veja Também
Funções de Manipulação de Evento, Trabalhando com eventos