Случайно наткнулся на эту тему, так как хотел реализовать без AppDialog
Реализовал. Механизм такой,
1.Создал класс копию CComboBox -> CMyComboBox
class CMyComboBox: public CWndContainer
2. в этом классе добавил генерацию Id для главного CWndContainer и на основе его id раздал всем элементам свои id увеличивал просто на +1
bool CMyComboBox::Create(constlong chart,conststring name,constint subwin,constint x1,constint y1,constint x2,constint 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 classif(!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);
//--- succeededreturn(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(constint id,constlong &lparam,constdouble &dparam,conststring &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);
}
Ну а дальше вставка в код как раньше как отдельный элемент. Все работает замечательно, хоть и с такими костылями.
Спасибо, что навели на мысли из-за чего все это не работало, ну а дальше покопавшись во всем этом уже придумал как реализовать.
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//чтобы все работало надо чтобы элемент тоже получал все эти сообщения для обработкиvirtualvoidOnChartEvent(constint id,// идентификатор событияconstlong& lparam, // параметр события типа longconstdouble& dparam, // параметр события типа doubleconststring& sparam // параметр события типа string
)
{
m_select.OnEvent(id,lparam,dparam,sparam);
}
Случайно наткнулся на эту тему, так как хотел реализовать без AppDialog
Реализовал. Механизм такой,
1.Создал класс копию CComboBox -> CMyComboBox
2. в этом классе добавил генерацию Id для главного CWndContainer и на основе его id раздал всем элементам свои id увеличивал просто на +1
3. дальше нужно переработать обработку сообщений, подкорректировал макрос так чтобы он не выходил по return так как нам надо , чтобы дальше сообщения обработал родитель. Пока этого я не сделал у меня было како то зависание с сообщениями ( не хотело реагировать .
Ну а дальше вставка в код как раньше как отдельный элемент. Все работает замечательно, хоть и с такими костылями.
Спасибо, что навели на мысли из-за чего все это не работало, ну а дальше покопавшись во всем этом уже придумал как реализовать.