Библиотеки: Easy Canvas - страница 4

 
Супер. Удобно и понятно.
 

Предлагаю добавить статус кнопок мыши. На скорость не повлияет, но бывает полезным )


struct Window
  {
   long              ChartId;     // current window identifier
   uint              Color;       // window background color
   int               Width;       // window width
   int               Height;      // window height
   int               height[];    // sub_windows height
   int               Left_bar;    // number of the leftmost bar in the window
   double            Right_bar;   // number of the rightmost bar in the window
   double            Total_bars;  // the maximum number of bars in the window
   int               BarsInWind;  // number of visible bars in the window
   double            Y_min;       // The minimum value of the price in the window
   double            Y_max;       // The maximum value of the price in the window
   double            dy_pix;      // price change for one pixel
   int               dx_pix;      // changing the number of bars per pixel
   int               MouseX;      // coordinate X of the current position of the mouse pointer
   int               MouseY;      // coordinate Y of the current position of the mouse pointer
   int               MouseStatus; // mouse buttons status
   double            MouseBar;    // the current bar position of the mouse pointer 
   double            MousePrice;  // the current price of the mouse pointer
   datetime          MouseTime;   // the current time of the mouse pointer
   int               MouseSubWin; // number of the subwindow in which the mouse pointer is located
   int               WindowsTotal;// total subwindows, including the main window
   int               SubWin;      // current subwindow
   datetime          time[];      // array of opening time of all visible bars in the window
  };


void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseStatus=(int)sparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/(double)W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }
 
Oleksii Chepurnyi:

Предлагаю добавить статус кнопок мыши. На скорость не повлияет, но бывает полезным )

Не могу согласиться, т.к. не вижу в этом особого смысла.

Дело в том, что статус кнопок мыши и клавиш - это событийная модель, которую нужно обрабатывать только там, где наступление этого события отлавливается, а именно в OnChartEvent.
Вы же не будете огранизовывать бесконечный цикл опроса наступления какого-то события вне обработчика событий. Поэтому какой смысл выносить этот статус за пределы OnChartEvent, когда всю обработку этих нажаний нужно делать в OnChartEvent, статус которых находится в lparam и sparam.

Ну разве только с целью ввести новую структуру индификаторов событий мыши для улучшения читаемости кода.

 
Nikolai Semko:

Не могу согласиться, т.к. не вижу в этом особого смысла.

Дело в том, что статус кнопок мыши и клавиш - это событийная модель, которую нужно обрабатывать только там, где наступление этого события отлавливается, а именно в OnChartEvent.
Вы же не будете огранизовывать бесконечный цикл опроса наступления какого-то события вне обработчика событий. Поэтому какой смысл выносить этот статус за пределы OnChartEvent, когда всю обработку этих нажаний нужно делать в OnChartEvent, статус которых находится в lparam и sparam.

Ну разве только с целью ввести новую структуру индификаторов событий мыши для улучшения читаемости кода.

А зачем тогда координаты мышки хранить? ) Тоже событийное )

Про цикл не понял...

В частности статус понадобился чтобы не рисовать часть объекта при перетаскивании мышкой.

 
Oleksii Chepurnyi:

А зачем тогда координаты мышки хранить? ) Тоже событийное )

С координатами мышки совсем другое дело. Текущие координаты мышки не являются событийной информацией. Событием является их изменение.

Могут понадобиться моменты, когда коодинаты мышки нужны вне OnChartEvent. Например вот здесь.

Oleksii Chepurnyi:

Про цикл не понял...

В частности статус понадобился чтобы не рисовать часть объекта при перетаскивании мышкой.

Ну у Вас же при перетаскивании мышкой команда на перерисовку части объекта вызывается из OnChartEvent в тот момент, когда меняется координата мышки и пока нашата ЛКМ, а в OnChartEvent имеется этот статус, зачем его внедрять в структуру Window?

Если бы Вы тоже самое делали не из OnChartEvent, и при этом в экземляре W структуры Window были бы пердлагаемые Вами MouseStatus, то Вам бы пришлось организовывать бесконечный цикл опроса этого парамента (MouseStatus) для ловли момента отпускания ЛКМ, что подвесило бы CPU.

Этот цикл не нужен только в OnChartEvent.

Я просто хочу сказать что использовать статус кнопок можно и нужно только из OnChartEvent, в котором он и так имеется.

Если я не прав, то приведите конкретный пример, в котором этот статус был бы востребован не из OnChartEvent.


 
Nikolai Semko:

Если я не прав, то приведите конкретный пример, в котором этот статус был бы востребован не из OnChartEvent.

Я ж выше написал пример, все прекрасно работает )

В OnChartEvent при движении мыши меняем параметры и даем команду на перерисовку холста. Без параметра в структуре пришлось бы передавать sparam в объект, оттуда в другой, а там в метод Draw()

 
Nikolai Semko:

С координатами мышки совсем другое дело. Текущие координаты мышки не являются событийной информацией. Событием является их изменение.

Могут понадобиться моменты, когда коодинаты мышки нужны вне OnChartEvent. Например вот здесь.

Ну у Вас же при перетаскивании мышкой команда на перерисовку части объекта вызывается из OnChartEvent в тот момент, когда меняется координата мышки и пока нашата ЛКМ, а в OnChartEvent имеется этот статус, зачем его внедрять в структуру Window?

Если бы Вы тоже самое делали не из OnChartEvent, и при этом в экземляре W структуры Window были бы пердлагаемые Вами MouseStatus, то Вам бы пришлось организовывать бесконечный цикл опроса этого парамента (MouseStatus) для ловли момента отпускания ЛКМ, что подвесило бы CPU.

Этот цикл не нужен только в OnChartEvent.

Я просто хочу сказать что использовать статус кнопок можно и нужно только из OnChartEvent, в котором он и так имеется.

Если я не прав, то приведите конкретный пример, в котором этот статус был бы востребован не из OnChartEvent.


Очень странные рассуждения. Логики никакой.

И координаты мыши и нажатые клавиши - есть внешнее состояние. Оно передается через параметры в обработчик, где если уж и кладется во внутренние переменные объекта (что безусловно полезно), то должно там быть целиком, а не частями. Библиотека - это по определению нечто, что делается не под свои хотелки, а в обобщенном виде, с учетом потенциальных потребностей других. Наперед знать все потребности нельзя, поэтому нужно просто не делать искусственных ограничений, как это.

 
Oleksii Chepurnyi:

Я ж выше написал пример, все прекрасно работает )

В OnChartEvent при движении мыши меняем параметры и даем команду на перерисовку холста. Без параметра в структуре пришлось бы передавать sparam в объект, оттуда в другой, а там в метод Draw()

это-же классика жанра - во всех оконных библиотеках, состояния кнопок мыши передаются в единой структуре с координатами курсора.

потому что они все вместе описывают одну сущность и по отдельности быть вообще не могут.

 
Ок. Уговорили. 
 

обновил до версии 1.29

новое:

1. добавил для простоты написания кода и улучшения читаемости следующие дефайны:

#define _Comment Canvas.Comm
#define _X Canvas.X
#define _Y Canvas.Y
#define _TimePos Canvas.TimePos
#define _Bar Canvas.Bar
#define _Price Canvas.Price
#define _CommXY(x,y,str) Canvas.TextPosition(x,y);\
Canvas.Comm(str);
#define _Font Canvas.CurentFont
#define _PixelSet Canvas.PixelSet
#define _MouseX W.MouseX
#define _MouseY W.MouseY
#define _MouseBar W.MouseBar
#define _Width W.Width
#define _Height W.Height
#define _Left_bar W.Left_bar
#define _Right_bar W.Right_bar
#define _BarsInWind W.BarsInWind

2. добавлен в структуру Window по просьбам трудящихся параметр MouseStatus, который может принимать 4 значения:

  • NO_PRESSED (0)
  • LEFT_BUTTON_PRESSED (1)
  • RIGHT_BUTTON_PRESSED (2)
  • LEFT_AND_RIGHT_BUTTONS_PRESSED (3)