Смена OBJ_BITMAP_LABEL при смене фона терминала

 
Добрый день, такая ситуация, есть меню созданное на OBJ_BITMAP_LABEL (в картинках), создал точно такие же картинки только с другим фоном, и появилась необходимость замены этих картинок при смене фона на черный цвет, так вот, прошу вас подскажите как это реализовать или может у кого то уже есть готовый подобный пример. Уже неделю не могу найти решение. Помогите пожалуйста кто может. Спасибо всем кто потратил на меня время и прочитал это.
 

Нужно отслеживать изменения свойств графика в OnChartEvent():

color g_clrOldColor;

int OnInit()
{
   g_clrOldColor = color(ChartGetInteger(0, CHART_COLOR_BACKGROUND));
   return(INIT_SUCCEEDED);
}

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
   if (id == CHARTEVENT_CHART_CHANGE)
   {
      color clrNewColor = color(ChartGetInteger(0, CHART_COLOR_BACKGROUND));
      if (clrNewColor != g_clrOldColor)
      {
         Print("Цвет фона изменился на ", ColorToString(clrNewColor));
         g_clrOldColor = clrNewColor;
      }
   }
}
 
Ihor Herasko:

Нужно отслеживать изменения свойств графика в OnChartEvent():

Спасибо большое за ответ!!! Вы единственный кто чем то помог, но я может ли быть ошибка тут? я поставил ваш код ошибок нету, но ... даже принт не выводится когда я меняю цвет фона графика

 
Ihor Herasko:

Нужно отслеживать изменения свойств графика в OnChartEvent():

и ответьте пожалуйста если у меня OBJ_BITMAP_LABEL создаётся в calculator таким образом:

if(ObjectFind(Chart_ID,"Menu")!=0)
ButtonPicture(Chart_ID,"Menu",0,253 + X,8,"::kartinka1.bmp","::kartinka1.bmp",77,16,0,0,false,CORNER_LEFT_UPPER,ANCHOR_CENTER,clrBlack,STYLE_SOLID,1,false,false,true,1);

Как заставить чтобы в коде который сверху поменялась картинка на kartinka2
Простите если я немного глупо объясняю, как правильно применить ваш код?
Спасибо

 
ares96:

Спасибо большое за ответ!!! Вы единственный кто чем то помог, но я может ли быть ошибка тут? я поставил ваш код ошибок нету, но ... даже принт не выводится когда я меняю цвет фона графика

Нужно смотреть, как применяли. Может Вы этот код в скрипт поставили? Тогда точно работать не будет.

 
ares96:

и ответьте пожалуйста если у меня OBJ_BITMAP_LABEL создаётся в calculator таким образом:

Что такое calculator?

 
Ihor Herasko:

Что такое calculator?

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

.....
тут у меня создание кнопки
  }

А дальше управление в OnChartEvent
 
ares96:

Если я правильно понял задачу (рисунок на кнопке должен зависеть только от цвета фона), то в OnCalculate() не нужно отображать объект. Создаете его в OnInit(), а потом обновляете в OnChartEvent().

 
Ihor Herasko:

Если я правильно понял задачу (рисунок на кнопке должен зависеть только от цвета фона), то в OnCalculate() не нужно отображать объект. Создаете его в OnInit(), а потом обновляете в OnChartEvent().

Спасибо вам большое что отвечаете, пишите... Спасибо) больше не кто в подобных постах не отвечал

Подскажите пожалуйста как обновлять в OnChartEvent().  ???

Сделал как вы "сказали"  создание кнопки в OnInit() таким образом:

if(ObjectFind(Chart_ID,"Menu")!=0)
ButtonPicture(Chart_ID,"Menu",0,253 + X,8,"::kartinka1.bmp","::kartinka1.bmp",77,16,0,0,false,CORNER_LEFT_UPPER,ANCHOR_CENTER,clrBlack,STYLE_SOLID,1,false,false,true,1);

Теперь как её обновить ??? пожалуйста ответьте

 

Пытаюсь так сделать:

   if (id == CHARTEVENT_CHART_CHANGE)
   {
      color clrNewColor = color(ChartGetInteger(0, CHART_COLOR_BACKGROUND));
      if (clrNewColor != g_clrOldColor)
      {
      
           
            ObjectSetString(ChartID(),"Menu",OBJPROP_BMPFILE,0,"::kartinka2.bmp");
            ObjectSetString(ChartID(),"Menu",OBJPROP_BMPFILE,1,"::kartinka2.bmp");
      
         Print("Цвет фона изменился на ", ColorToString(clrNewColor));
         g_clrOldColor = clrNewColor;
      }
   }    

но меняю фон и ничего не происходит, пожалуйста помогите

P.S иии как я понял ваш код работает так:
Меняем фон графика и меняется картинка, но могли бы вы его чутка подправить и сделать так, что если поменяли фон на черный тогда  kartinka1 , в остальных во всех случаях  kartinka2
 

Вот чего я смог добиться(с помощью вашей помощи разумеется, спасибо вам большое)

Меняется при смене фона, но 1 нажатие левой кнопкой мыши на экран и тут же возвращается первая картинка иже только меняю фон и картинка сменится и обратно тут же
или же если просто меняю ТФ

2) пожалуйста измените чутка код и сделайте чтобы была возможность смены картинки только в 2-х случаях
    2.1) Любой цвет фона кроме черного - Картинка 1
    2.2) Только черный - Картинка 2

   if (id == CHARTEVENT_CHART_CHANGE)
   {
      color clrNewColor = color(ChartGetInteger(0, CHART_COLOR_BACKGROUND));
      if (clrNewColor != g_clrOldColor)
      {
      
           
            ObjectSetString(ChartID(),"Menu",OBJPROP_BMPFILE,0,"::kartinka2.bmp");
            ObjectSetString(ChartID(),"Menu",OBJPROP_BMPFILE,1,"::kartinka2.bmp");
      
         Print("Цвет фона изменился на ", ColorToString(clrNewColor));
         g_clrOldColor = clrNewColor;
      }
      else
      {           
            ObjectSetString(ChartID(),"Menu",OBJPROP_BMPFILE,0,"::kartinka1.bmp");
            ObjectSetString(ChartID(),"Menu",OBJPROP_BMPFILE,1,"::kartinka1.bmp");
         g_clrOldColor = clrNewColor;
      }
   }