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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
vebster005
457
vebster005  

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

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

//--- Меню справа
   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();}//Если меню есть на чарте то удаляем
     }
//--- Меню справа

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

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

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

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

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

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

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

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

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

Nikita Chernyshov
1690
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,"  ","Нажата кнопка");                                                     // Принтую в журнал, считаю клики
     } 

}
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий