Нужен пример использования ComboBox - страница 2

 

Случайно наткнулся на эту тему, так как хотел реализовать без AppDialog

Реализовал. Механизм такой,

1.Создал класс копию CComboBox -> CMyComboBox

class CMyComboBox: public CWndContainer

2. в этом классе добавил генерацию Id для главного CWndContainer и на основе его id раздал всем элементам свои id увеличивал просто на +1

bool CMyComboBox::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
{
//--- check height
   m_chart_id=chart;
   m_name=name;
   m_subwin=subwin;

   if(y2-y1<CONTROLS_COMBO_MIN_HEIGHT)
      return(false);
//--- call method of the parent class
   if(!CWndContainer::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);

   m_id=GetTickCount(); //создаем Id главного экземпляра

   if(!CreateEdit())
      return(false);
   if(!CreateButton())
      return(false);
   if(!CreateList())
      return(false);

//создаем ID для элементов
   long iid=m_id;
   m_edit.Id(++iid);
   m_drop.Id(++iid);
   m_list.Id(++iid);

//--- succeeded
   return(true);
}

3. дальше нужно переработать обработку сообщений, подкорректировал макрос так чтобы он не выходил по return так как нам надо , чтобы дальше сообщения обработал родитель. Пока этого я не сделал у меня было како то зависание с сообщениями ( не хотело реагировать .

//для своих элементов
#define SN_ON_LIST(handler)          if(id==CHARTEVENT_MOUSE_MOVE) { handler(lparam,dparam); }
#define SN_ON_EVENT(event,control,handler)          if(id==(event+CHARTEVENT_CUSTOM) && lparam==control.Id()) { handler(); }


bool      CMyComboBox::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
  
   SN_ON_EVENT(ON_CLICK,m_edit,OnClickEdit)
   SN_ON_EVENT(ON_CLICK,m_drop,OnClickButton)
   SN_ON_EVENT(ON_CHANGE,m_list,OnChangeList)
   SN_ON_LIST(OnChange); //мое решение, чтобы при перемещении мышки сразу выбиралось строчка как это в обычных списках, но и без этого будет все работать уже.
   CheckListHide(id,(int)lparam,(int)dparam);
   return CWndContainer::OnEvent(id,lparam,dparam,sparam);
}

Ну а дальше вставка в код как раньше как отдельный элемент. Все работает замечательно, хоть и с такими костылями.

мт4


Спасибо, что навели на мысли из-за чего все это не работало, ну а дальше покопавшись во всем этом уже придумал как реализовать.

int x=xPos;
      int y=yPos;

      m_select.SetSize(200);
      m_select.Create(0,"m_select",0,x,y);


      m_select.AddItem("Stop trade",TRADEMODE_OFF);
      m_select.AddItem("Long and Short",TRADEMODE_ALL);
      m_select.AddItem("Long only",TRADEMODE_LONG);
      m_select.AddItem("Short only",TRADEMODE_SHORT);
            
      m_select.ListViewItems(4);
      
      m_select.SelectByValue(TRADEMODE_ALL);
      
      m_select.FontSize(10);
      
      
      ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//это в моих уже классах главных вызывает обработчик OnChartEvent
//чтобы все работало надо чтобы элемент тоже получал все эти сообщения для обработки

virtual void OnChartEvent(const int id,// идентификатор события
                             const long& lparam,   // параметр события типа long
                             const double& dparam, // параметр события типа double
                             const string& sparam  // параметр события типа string
                            )
   {
         m_select.OnEvent(id,lparam,dparam,sparam);
   }