На разных мониторах по разному работает? Помогите с кодом

 

Добрый день, подскажите пожалуйста как быть

В общем создается меню по нажатию клавиши и убирается меню если мышку вынесли(сдвинули) за само появившиеся меню
вот так:

//--- Меню справа
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);//Устанавливаем отслеживание координат мышки на чарте для меню справа
   X1MR=990; Y1MR=0; X2MR=1026; Y2MR=16;
//--- Меню справа


//--- Меню справа
//Если мышку кликнули в нужном месте
    if(id==CHARTEVENT_OBJECT_CLICK && lparam>=X1MR && lparam<=X2MR && dparam>=0 && dparam<=Y2MR)
     {
      if(!ShowMenuRight){CreateMenuRM();}//Если меню нет на чарте то создаём его
     }
//Если мышка вне границ реагирования то проверяем
   if(id==CHARTEVENT_MOUSE_MOVE && (lparam<X1MR-137 || lparam>X2MR+130 || dparam<Y1MR || dparam>Y2MR))
     {
      if(ShowMenuRight){DeleteMenuRM();}//Если меню есть на чарте то удаляем
     }
//--- Меню справа

Проблема заключается в том что это меню я расположил справа от терминала и у меня оно прекрасно работает, но не работает у других(а точнее работает криво т.к координаты там совсем другие) [простите за тавтологию]. Я так понимаю что мониторы у всех разные следовательно расстояние до правого края терминала у всех тоже разное. Вопрос: Как мне реализовать открытие и удаление меню таким образом чтобы сохранилась правая сторона и работало у всех.
Пожалуйста ответьте кто понял. Спасибо
 

Узнавайте ширину и высоту окна

Width=(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);   // получаем Ширину окна
Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // получаем Высоту окна

Располагайте объекты меню исходя из полученных данных. Допустим, столько-то отнимает от высоты, а столько-то от ширины. Получается определенная зона. Координаты и размеры этой зоны будут известны. Как только мышку убирают за пределы этой зоны, то скрывайте меню.

Можно работать только с шириной.
 
Nikita Chernyshov:

Узнавайте ширину и высоту окна

Располагайте объекты меню исходя из полученных данных. Допустим, столько-то отнимает от высоты, а столько-то от ширины. Получается определенная зона. Координаты и размеры этой зоны будут известны. Как только мышку убирают за пределы этой зоны, то скрывайте меню.

Можно работать только с шириной.

Спасибо. Всё ни как не могу уловить клик мыши, уже по всякому пробовал. Если не сложно могли бы вы на любом примере показать объект и что бы клик приходился на этот объект, пусть даже по клику ничего не произойдёт.

 
vebster005:

Спасибо. Всё ни как не могу уловить клик мыши, уже по всякому пробовал. Если не сложно могли бы вы на любом примере показать объект и что бы клик приходился на этот объект, пусть даже по клику ничего не произойдёт.

В этом случае нужно обрабатывать не нажатие на объект, а нажатие той зоны, которую занимает объект.

int Width  = 0;
int Height = 0;
int Count  = 0; // Для счетчика нажатий
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  
  Width=(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);   // получаем Ширину окна
  Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // получаем Высоту окна;
  
  ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);

  ObjectCreate(0,"sell",OBJ_BUTTON,0,0,0);
//--- установим координаты объекта 
   ObjectSetInteger(0,"sell",OBJPROP_XDISTANCE,Width-200);   // Динамичное расположение. Зависит от ширины окна
   ObjectSetInteger(0,"sell",OBJPROP_YDISTANCE,Height-200);  // Динамичное расположение. Зависит от высоты окна
   ObjectSetInteger(0,"sell",OBJPROP_CORNER,CORNER_LEFT_UPPER); 
//--- установим размеры объекта 
   ObjectSetInteger(0,"sell",OBJPROP_XSIZE,50);              // Заранее знаю размер объекта
   ObjectSetInteger(0,"sell",OBJPROP_YSIZE,50);              // 
//--- установим текст 
   ObjectSetString(0,"sell",OBJPROP_TEXT,"SELL"); 
//--- установим начлаьное положение кнопки 
   ObjectSetInteger(0,"sell",OBJPROP_STATE,false);
   
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,

                  const long &lparam,

                  const double &dparam,

                  const string &sparam)

{

  Width=(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);   // еще раз получаем Ширину окна. Вдруг его изменили. Поэтому также стоит перерисовать объект
  Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // еще раз получаем Высоту окна. Вдруг его изменили. Поэтому также стоит перерисовать объект
                                                            // В этом коде я не перерисовываю объект. А вам нужно. Изменяя размер окна - меняется зона для отслеживания клика

  if(id==CHARTEVENT_MOUSE_MOVE && sparam == 1 && lparam >= Width-200 && lparam < Width-200+50   // Узнаю, что клик мыши был как раз в зоне расположение
                                              && dparam > Height-200 && dparam < Height-200+50) // моего объекта с учетом размера графика и размера объекта
     {                                                                                            
         Count++;
         Print(Count,"  ","Нажата кнопка");                                                     // Принтую в журнал, считаю клики
     } 

}
 
Nikita Chernyshov:

В этом случае нужно обрабатывать не нажатие на объект, а нажатие той зоны, которую занимает объект.

большое спасибо что ответили мне. Ответьте пожалуйста, зачем нужен счетчик кликов? и как сделать так чтобы при изменения размера экрана терминала кнопка не уходила а была фиксирована на одном месте. иии Можно ли как то по другому это всё сделать? или это единственный выход?

 
vebster005:

большое спасибо что ответили мне. Ответьте пожалуйста, зачем нужен счетчик кликов? и как сделать так чтобы при изменения размера экрана терминала кнопка не уходила а была фиксирована на одном месте. иии Можно ли как то по другому это всё сделать? или это единственный выход?

Счетчиков кликов - просто фича. В данном случае не особо полезная, но если постоянно кликать по кнопке, то в журнале будет одна и та же запись "Нажата кнопка". Клик можно отличать только по времени лога, что не очень приятно для глаза. То ли дело, клик помечается цифрой и сразу все видно :)

Чтобы фиксировать объект в определенных координатах - используйте банальную арифметику. Вычисляйте, где должен находится объект. А уже потом получайте его зону.

Нет, это не единственный вариант. И даже не самый лучший, просто небольшой огрызок быстро набранного кода :) можно применить встроенные библиотеки для создания и работы с объектами. Нужно знать чуть-чуть ООП. Но это уже для самостоятельного изучения. Хороший пример можно найти здесь 

 
Nikita Chernyshov:

Счетчиков кликов - просто фича. В данном случае не особо полезная, но если постоянно кликать по кнопке, то в журнале будет одна и та же запись "Нажата кнопка". Клик можно отличать только по времени лога, что не очень приятно для глаза. То ли дело, клик помечается цифрой и сразу все видно :)

Чтобы фиксировать объект в определенных координатах - используйте банальную арифметику. Вычисляйте, где должен находится объект. А уже потом получайте его зону.

Нет, это не единственный вариант. И даже не самый лучший, просто небольшой огрызок быстро набранного кода :) можно применить встроенные библиотеки для создания и работы с объектами. Нужно знать чуть-чуть ООП. Но это уже для самостоятельного изучения. Хороший пример можно найти здесь 

Спасибо что ответили, могли бы вы кинут простой пример где вычисляется объект, чтобы можно было по подобию сделать. Потому что сколько я не пытался сделать у меня не получается

 
vebster005:

Спасибо что ответили, могли бы вы кинут простой пример где вычисляется объект, чтобы можно было по подобию сделать. Потому что сколько я не пытался сделать у меня не получается

и ответьте пожалуйста можно ли как то сделать отсчет с правого угла?

X1MR=990; Y1MR=0; X2MR=1026; Y2MR=16;

Иии, как еще можно реализовать не используя библиотеки?

Причина обращения: