Где почитать про EVENT MAP HANDING?

 

Стандартный обработчик события не обрабатывает как надо элемент ComboBox, обрабатывается только по клику, а как обработать правильно изменение значения не знаю.. Где можно прочитать разжеванную справку по вот этому безобразию? Что куда пихать :) или как правильно обрабатывать комбо бокс... %) буду благодарен за помощь. Это список макросов, которые не очень понятно куда пихать..

//+------------------------------------------------------------------+
//| Macro of event handling map                                      |
//+------------------------------------------------------------------+
#define INTERNAL_EVENT                           (-1)
//--- beginning of map
#define EVENT_MAP_BEGIN(class_name)              bool class_name::OnEvent(const int id,const long& lparam,const double& dparam,const string& sparam) {
//--- end of map
#define EVENT_MAP_END(parent_class_name)         return(parent_class_name::OnEvent(id,lparam,dparam,sparam)); }
//--- event handling by numeric ID
#define ON_EVENT(event,control,handler)          if(id==(event+CHARTEVENT_CUSTOM) && lparam==control.Id()) { handler(); return(true); }
//--- event handling by numeric ID by pointer of control
#define ON_EVENT_PTR(event,control,handler)      if(control!=NULL && id==(event+CHARTEVENT_CUSTOM) && lparam==control.Id()) { handler(); return(true); }
//--- event handling without ID analysis
#define ON_NO_ID_EVENT(event,handler)            if(id==(event+CHARTEVENT_CUSTOM)) { return(handler()); }
//--- event handling by row ID
#define ON_NAMED_EVENT(event,control,handler)    if(id==(event+CHARTEVENT_CUSTOM) && sparam==control.Name()) { handler(); return(true); }
//--- handling of indexed event
#define ON_INDEXED_EVENT(event,controls,handler) { int total=ArraySize(controls); for(int i=0;i<total;i++) if(id==(event+CHARTEVENT_CUSTOM) && lparam==controls[i].Id()) return(handler(i)); }
//--- handling of external event
#define ON_EXTERNAL_EVENT(event,handler)         if(id==(event+CHARTEVENT_CUSTOM)) { handler(lparam,dparam,sparam); return(true); }
//--- handling the rest of unhandled events
#define ON_OTHER_EVENTS(handler)                 if(handler(id,lparam,dparam,sparam)) return(true);
//+------------------------------------------------------------------+
//| Events                                                           |
//+------------------------------------------------------------------+
#define ON_CLICK                (0)   // clicking on control event
#define ON_DBL_CLICK            (1)   // double clicking on control event
#define ON_SHOW                 (2)   // showing control event
#define ON_HIDE                 (3)   // hiding control event
#define ON_CHANGE               (4)   // changing control event
#define ON_START_EDIT           (5)   // start of editing event
#define ON_END_EDIT             (6)   // end of editing event
#define ON_SCROLL_INC           (7)   // increment of scrollbar event
#define ON_SCROLL_DEC           (8)   // decrement of scrollbar event
#define ON_MOUSE_FOCUS_SET      (9)   // the "mouse cursor entered the control" event
#define ON_MOUSE_FOCUS_KILL     (10)  // the "mouse cursor exited the control" event
#define ON_DRAG_START           (11)  // the "control dragging start" event
#define ON_DRAG_PROCESS         (12)  // the "control is being dragged" event
#define ON_DRAG_END             (13)  // the "control dragging end" event
#define ON_BRING_TO_TOP         (14)  // the "mouse events priority increase" event
#define ON_APP_CLOSE            (100) // "closing the application" event
//+------------------------------------------------------------------+

 

А я делаю как-то так, до этого присвоил комбобоксу айди "1". После изменения значения комбо бокса на другое, при клике на панели, значение сбрасывается обратно на старое.. Т.е. не фиксируется выбранное значение как надо.

IntegralComboBox.Create(0,"IntegralComboBox",0,5,55,100,80);
   IntegralComboBox.Id(1);
   IntegralComboBox.ListViewItems(27);
   IntegralComboBox.AddItem("EUR/USD",0);
   IntegralComboBox.AddItem("USD/JPY",1);
   IntegralComboBox.AddItem("GBP/USD",2);
   IntegralComboBox.AddItem("EUR/GBP",3);
   IntegralComboBox.AddItem("CAD/CHF",4);
   IntegralComboBox.AddItem("CAD/JPY",5);
   IntegralComboBox.AddItem("CHF/JPY",6);
   IntegralComboBox.AddItem("EUR/AUD",7);
   IntegralComboBox.AddItem("USD/CHF",8);
   IntegralComboBox.AddItem("EUR/JPY",9);
   IntegralComboBox.AddItem("EUR/CHF",10);
   IntegralComboBox.AddItem("USD/CAD",11);
   IntegralComboBox.AddItem("AUD/USD",12);
   IntegralComboBox.AddItem("GBP/JPY",13);
   IntegralComboBox.AddItem("AUD/CAD",14);
   IntegralComboBox.AddItem("AUD/CHF",15);
   IntegralComboBox.AddItem("AUD/JPY",16);
   IntegralComboBox.AddItem("AUD/NZD",17);
   IntegralComboBox.AddItem("EUR/CAD",18);
   IntegralComboBox.AddItem("EUR/NOK",19);
   IntegralComboBox.AddItem("EUR/NZD",20);
   IntegralComboBox.AddItem("GBP/CAD",21);
   IntegralComboBox.AddItem("GBP/CHF",22);
   IntegralComboBox.AddItem("NZD/JPY",23);
   IntegralComboBox.AddItem("NZD/USD",24);
   IntegralComboBox.AddItem("USD/NOK",25);
   IntegralComboBox.AddItem("USD/SEK",26);
   IntegralComboBox.SelectByText("EUR/USD");
   m_panel.Add(IntegralComboBox);

 

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Move the panel with the mouse
  
     m_panel.OnEvent(id,lparam,dparam,sparam);
    
  
   if(id == 1)
    {
     ComboBox.OnEvent(id,lparam,dparam,sparam);
     Print(IntegralComboBox.Value());
    }
 

ComboBox заранее заполняется данными. Следовательно обрабатывается событие ON_CHANGE. 

А какой "правильности" Вы говорите? Что имеется в виду?

 
Karputov Vladimir:

ComboBox заранее заполняется данными. Следовательно обрабатывается событие ON_CHANGE. 

А какой "правильности" Вы говорите? Что имеется в виду?

я пока слабо ориентируюсь в событиях, поэтому мне сложно правильно сформулировать вопрос :) Как бы написать правильно.. наверно, лучше сделать готовый пример как я делаю и показать что это не работает
 

Вот панель (эксперт) с одним ComboBox и обработка событий:

//+------------------------------------------------------------------+
//|                                             ControlsComboBox.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property description "Панель индикации и диалогов управления. Демонстрация работы класса CComboBox"
#include <Controls\Dialog.mqh>
#include <Controls\ComboBox.mqh>
//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+
//--- indents and gaps
#define INDENT_LEFT                         (11)      // indent from left (with allowance for border width)
#define INDENT_TOP                          (11)      // indent from top (with allowance for border width)
#define INDENT_RIGHT                        (11)      // indent from right (with allowance for border width)
#define INDENT_BOTTOM                       (11)      // indent from bottom (with allowance for border width)
#define CONTROLS_GAP_X                      (5)       // gap by X coordinate
#define CONTROLS_GAP_Y                      (5)       // gap by Y coordinate
//--- for buttons
#define BUTTON_WIDTH                        (100)     // size by X coordinate
#define BUTTON_HEIGHT                       (20)      // size by Y coordinate
//--- for the indication area
#define EDIT_HEIGHT                         (20)      // size by Y coordinate
//--- for group controls
#define GROUP_WIDTH                         (150)     // size by X coordinate
#define LIST_HEIGHT                         (179)     // size by Y coordinate
#define RADIO_HEIGHT                        (56)      // size by Y coordinate
#define CHECK_HEIGHT                        (93)      // size by Y coordinate
//+------------------------------------------------------------------+
//| Class CControlsDialog                                            |
//| Usage: main dialog of the Controls application                   |
//+------------------------------------------------------------------+
class CControlsDialog : public CAppDialog
  {
private:
   CComboBox         m_combo_box;;                    // CComboBox объект

public:
                     CControlsDialog(void);
                    ~CControlsDialog(void);
   //--- create
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   //--- chart event handler
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);

protected:
   //--- create dependent controls
   bool              CreateComboBox(void);
   //--- handlers of the dependent controls events
   void              OnChangeComboBox(void);
  };
//+------------------------------------------------------------------+
//| Event Handling                                                   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CControlsDialog)
ON_EVENT(ON_CHANGE,m_combo_box,OnChangeComboBox)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CControlsDialog::CControlsDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CControlsDialog::~CControlsDialog(void)
  {
  }
//+------------------------------------------------------------------+
//| Create                                                           |
//+------------------------------------------------------------------+
bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
  {
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- create dependent controls
   if(!CreateComboBox())
      return(false);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| Create the "ComboBox" element                                    |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateComboBox(void)
  {
//--- coordinates
   int x1=INDENT_LEFT;
   int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y)+
          (BUTTON_HEIGHT+CONTROLS_GAP_Y)+
          (EDIT_HEIGHT+CONTROLS_GAP_Y);
   int x2=x1+GROUP_WIDTH;
   int y2=y1+EDIT_HEIGHT;
//--- create
   if(!m_combo_box.Create(m_chart_id,m_name+"ComboBox",m_subwin,x1,y1,x2,y2))
      return(false);
   if(!Add(m_combo_box))
      return(false);
//--- fill out with strings
   for(int i=0;i<16;i++)
      if(!m_combo_box.ItemAdd("Item "+IntegerToString(i)))
         return(false);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnChangeComboBox(void)
  {
   Comment(__FUNCTION__+" \""+m_combo_box.Select()+"\"");
  }
//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
CControlsDialog ExtDialog;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create application dialog
   if(!ExtDialog.Create(0,"Controls",0,40,40,380,344))
      return(INIT_FAILED);
//--- run application
   ExtDialog.Run();
//--- succeed
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- очистим комментарии
   Comment("");
//--- destroy dialog
   ExtDialog.Destroy(reason);
  }
//+------------------------------------------------------------------+
//| Expert chart event function                                      |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+

 

Реакция на событие выводится в комментарии на графике.

Файлы:
 

О, спасибо большое :) Вот пример как я делал. Значения в комбобоксе меняютя, но если мы кликнем в пустое место панели, то они сбрасываются на ноль, почему так происходит?

//+------------------------------------------------------------------+
//|                                                     ComboBox.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#include <Controls\Defines.mqh>
#include <Controls\Dialog.mqh>
#include <Controls\Panel.mqh>
#include <Controls\ComboBox.mqh>

int      panelXX     =  20;
int      panelYY     =  20;
int      panelWidth  =  435;
int      panelHeight =  366;

CAppDialog m_panel;
CComboBox myComboBox;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   CreateComboBox();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

void CreateComboBox()
{
 m_panel.Create(0,"myPanel",0,panelXX,panelYY,panelWidth,panelHeight);
 m_panel.Run();
 
   myComboBox.Create(0,"IntegralComboBox",0,5,55,100,80);
   myComboBox.ListViewItems(27);
   myComboBox.Id(1);
   myComboBox.AddItem("EUR/USD",0);
   myComboBox.AddItem("USD/JPY",1);
   myComboBox.AddItem("GBP/USD",2);
   myComboBox.AddItem("EUR/GBP",3);
   myComboBox.AddItem("CAD/CHF",4);
   myComboBox.AddItem("CAD/JPY",5);
   myComboBox.AddItem("CHF/JPY",6);
   myComboBox.AddItem("EUR/AUD",7);
   myComboBox.AddItem("USD/CHF",8);
   myComboBox.AddItem("EUR/JPY",9);
   myComboBox.AddItem("EUR/CHF",10);
   myComboBox.AddItem("USD/CAD",11);
   myComboBox.AddItem("AUD/USD",12);
   myComboBox.AddItem("GBP/JPY",13);
   myComboBox.AddItem("AUD/CAD",14);
   myComboBox.AddItem("AUD/CHF",15);
   myComboBox.AddItem("AUD/JPY",16);
   myComboBox.AddItem("AUD/NZD",17);
   myComboBox.AddItem("EUR/CAD",18);
   myComboBox.AddItem("EUR/NOK",19);
   myComboBox.AddItem("EUR/NZD",20);
   myComboBox.AddItem("GBP/CAD",21);
   myComboBox.AddItem("GBP/CHF",22);
   myComboBox.AddItem("NZD/JPY",23);
   myComboBox.AddItem("NZD/USD",24);
   myComboBox.AddItem("USD/NOK",25);
   myComboBox.AddItem("USD/SEK",26);
   myComboBox.SelectByText("EUR/USD");
   m_panel.Add(myComboBox);    
}

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
     m_panel.OnEvent(id,lparam,dparam,sparam);
    
    if(id ==1)
     {
     myComboBox.OnEvent(id,lparam,dparam,sparam);
     }
     
  }
  
 
Пожалуйста возьмите, за основу, мой пример и вносите свой функционал.
 
Karputov Vladimir:
Пожалуйста возьмите, за основу, мой пример и вносите свой функционал.
Да, спасибо, хороший пример.
Причина обращения: