CHARTEVENT_OBJECT_CLICK и CHARTEVENT_CLICK срабатывают одновременно - страница 3

 
Maxim Kuznetsov:
В общем, самое простое это давать физическим событиям  последовательно id и onchartevent сделать хотя бы bool обрабработано/нет. Но это ломать архитектуру и совместимость. 

Ломать архитектуру чего и совместимость с чем? Можете объяснить?

 
Igor Makanu:

Красивый вариант.

 

+


 
Iurii Tokman:

+


Досмотрел до конца. Не понял, в чем прикол? Обычная такая себе торговая панель.

 
Ihor Herasko:

Досмотрел до конца. Не понял, в чем прикол? Обычная такая себе торговая панель.

работает благодаря подсказкам форумчан

ни каких приколов там нет

теперь экран весь в отпечатках )))

 

Размялся перед сном. Основано на допущении, что CHARTEVENT_OBJECT_CLICK всегда первым приходит.

class CClickControl{
   class _CClickControl{
      _CClickControl* cPrev;
      _CClickControl* cNext;
      CClickControl* main;
      long x;
      double y;
   public:
      _CClickControl(const long &_x,const double &_y,_CClickControl* _prev,CClickControl* _main):cNext(NULL),cPrev(_prev),main(_main),x(_x),y(_y){}
     ~_CClickControl() {delete cNext;}
      void Push(const long &_x,const double &_y) {if (!cNext) cNext=new _CClickControl(_x,_y,&this,main); else cNext.Push(_x,_y);}
      bool Check(const long &_x,const double &_y){
         if(_x!=x||_y!=y) return !cNext||cNext.Check(_x,_y);
         if (cPrev!=NULL) cPrev.Next(cNext);
         else main.Next(cNext);
         if (cNext!=NULL){
            cNext.Prev(cPrev);
            cNext=NULL;}
         delete &this;
         return false;}
      void Prev(_CClickControl* _prev) {cPrev=_prev;}
      void Next(_CClickControl* _next) {cNext=_next;}
   };
   _CClickControl* cNext;
   CClickControl():cNext(NULL){}
public:
  ~CClickControl() {delete cNext;}
   static CClickControl* Ptr(){
      static CClickControl obj;
      return &obj;}
   void Push(const long &_x,const double &_y) {if (!cNext) cNext=new _CClickControl(_x,_y,NULL,&this); else cNext.Push(_x,_y);}
   bool Check(const long &_x,const double &_y) {return !cNext||cNext.Check(_x,_y);}
   void Next(_CClickControl* _next) {cNext=_next;}
};

#define PUSH(x,y) CClickControl::Ptr().Push(x,y)
#define CHECK(x,y) CClickControl::Ptr().Check(x,y)

void OnChartEvent(const int id,         // идентификатор события
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam) // параметр события типа string
{
   switch(id){
      case CHARTEVENT_OBJECT_CLICK:
         PUSH(lparam,dparam);
         Print("Object click");
         break;
      case CHARTEVENT_CLICK:
         if (CHECK(lparam,dparam)) Print("Chart click");
         break;}}