Скриншот всего терминала - страница 5

 
Renat Akhtyamov:

если сравнивать две гармошки

Вы тестировали мой код? Или код из хелпа? Или вы просто имеете в виду, что у вас нет настроения?

 

Попробуйте скрипт с DLL.

//+------------------------------------------------------------------+
//|                                           Copyright 2020, ZhSerg |
//|                                               https://zhserg.ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, ZhSerg"
#property link      "https://zhserg.ru/"
#property strict
#property show_inputs

input string fileName ="C:\\ScreenMT4.bmp";  //Имя файла

#include <WinUser32.mqh>

#import "ScreenShot.dll"
   void ScreenShotWin(int HandleMT, string fileBmp);
#import  

void OnStart(){
   long chart_id=ChartID(); 
   int handleChart=(int)ChartGetInteger(chart_id,CHART_WINDOW_HANDLE);
   int handle=GetParent(handleChart);
   handle=GetParent(handle);
   int handleMT=GetParent(handle);
   ScreenShotWin(handleMT, fileName);   
}
Файлы:
ScreenShot.zip  52 kb
 
Evgeny Potapov:

Вы тестировали мой код? Или код из хелпа? Или вы просто имеете в виду, что у вас нет настроения?

Настроение здесь не причём. Внимательно прочитайте то что Вам пытались обьяснить
 
Sergey Zhilinskiy:

Попробуйте скрипт с DLL.

Спасибо за DLL! Отлично работает!

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

Поэтому я решил с помощью вашего DLL в начале создать правильный скриншот в BMP, потом наложить его на график, потом сделать скриншот с уменьшением в высоты на 1/3.

И потом, выведя уменьшенные скриншоты все вместе на экран, сделать уже окончательный скриншот всей группы.

Получилось все: и совмещение по времени, и вертикальная линия, кроме одного: изменилось поведение функции: ChartScreenShot().

Теперь она стала не сжимать график, а отрезать от него треть в отличие от кода предложенного Андреем.

Картинку и код эксперта прикладываю.

Может быть есть какой-то секрет управления поведением этой функции, который я не знаю?

#property strict
#include <WinUser32.mqh>
#include <Canvas\iCanvas.mqh> 
#import "ScreenShot.dll"
   void ScreenShotWin(int HandleMT, string fileBmp);
#import  
#include <stdlib.mqh> 
#include <GlobalVars.mqh>
input uchar tr=200; // Transparency
input int Delay=1500; // Delay

int wait=0;
string fileName[3], fName;
string   GlobalCounterName = "MainCounter";

int OnInit()  {
   int chartShift;
   datetime lineTime = iTime(NULL, PERIOD_M15, 500);
   int lineBarOffset = 300; 
   double val;
   if(!GlobalVariableCheck(GlobalCounterName)) GlobalVars::RecordVar(GlobalCounterName, 1);
   int mainCounter = GlobalVars::ReadVar(GlobalCounterName, val);
   int value = (int)NormalizeDouble(val, 0);
   GlobalVars::RecordVar(GlobalCounterName, value+1);
   for(int i=0; i<3; i++) fileName[i]="screen_"+string(i)+".bmp";
   switch (value) {
      case 1: 
         ChartSetSymbolPeriod(0,NULL,PERIOD_M1);
         Sleep(Delay);
         break;
      case 2: 
         ObjectDelete(0, "Line");
         chartShift = iBarShift(NULL, PERIOD_M1, lineTime)-lineBarOffset;
         ChartNavigate(0,CHART_END, -chartShift);
         ObjectCreate(0, "Line", OBJ_VLINE, 0, lineTime, 0);
         Sleep(Delay);
         fName = StringConcatenate(TerminalInfoString(TERMINAL_DATA_PATH), "\\MQL4\\Files\\", fileName[0]); 
         MyChartShot(ChartID(), fName);
         
         ObjectDelete(fileName[0]);
         ObjectCreate(0, fileName[0], OBJ_BITMAP_LABEL, 0, 0, 0);
         ObjectSetString(0, fileName[0], OBJPROP_BMPFILE, 0, "\\Files\\"+fileName[0]);
         Print(" lineTime=", lineTime, " l=", __LINE__);
         ChartScreenShot(0,fileName[0],W.Width, W.Height/3); //
         ObjectDelete(fileName[0]);
         Sleep(Delay);
         ChartSetSymbolPeriod(0,NULL,PERIOD_M5);
         break;
      case 3: 
         ObjectDelete(0, "Line");
         chartShift = iBarShift(NULL, PERIOD_M5, lineTime)-lineBarOffset;
         ChartNavigate(0,CHART_END, -chartShift);
         ObjectCreate(0, "Line", OBJ_VLINE, 0, lineTime, 0);
         Sleep(Delay);
         fName = StringConcatenate(TerminalInfoString(TERMINAL_DATA_PATH), "\\MQL4\\Files\\", fileName[1]); 
         MyChartShot(ChartID(), fName);
         
         ObjectDelete(fileName[1]);
         ObjectCreate(0, fileName[1], OBJ_BITMAP_LABEL, 0, 0, 0);
         ObjectSetString(0, fileName[1], OBJPROP_BMPFILE, 0, "\\Files\\"+fileName[1]);
         ChartScreenShot(0,fileName[1],W.Width, W.Height/3); //
         ObjectDelete(fileName[1]);
         Sleep(Delay);
         ChartSetSymbolPeriod(0,NULL,PERIOD_M15);
         break;
      case 4: 
         ObjectDelete(0, "Line");
         ObjectCreate(0, "Line", OBJ_VLINE, 0, lineTime, 0);
         chartShift = iBarShift(NULL, PERIOD_M15, lineTime)-lineBarOffset;
         ChartNavigate(0,CHART_END, -chartShift);
         Sleep(Delay);
         fName = StringConcatenate(TerminalInfoString(TERMINAL_DATA_PATH), "\\MQL4\\Files\\", fileName[2]); 
         MyChartShot(ChartID(), fName);
         
         ObjectDelete(fileName[2]);
         ObjectCreate(0, fileName[2], OBJ_BITMAP_LABEL, 0, 0, 0);
         ObjectSetString(0, fileName[2], OBJPROP_BMPFILE, 0, "\\Files\\"+fileName[2]);
         ChartScreenShot(0,fileName[2],W.Width, W.Height/3); //
         ObjectDelete(fileName[2]);
         ObjectDelete(0, "Line");
         Canvas.Erase();
         Sleep(Delay);
         GlobalVars::RecordVar(GlobalCounterName, 1);
         wait = 1;
         EventSetMillisecondTimer(100);
         break;
      default: 
         Print(" value=", value);
         break;
   }
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnTick()  {
}
//+------------------------------------------------------------------+
/**/
void OnTimer()  {
   MergeFiles();
   EventKillTimer();
   ExpertRemove();
}
//+------------------------------------------------------------------+
void MergeFiles()  {
   // Canvas.Erase();
   Print(__LINE__);
   while(wait!=0)
     {
      int file_handle=FileOpen(fileName[wait-1],FILE_READ|FILE_BIN);
      if(file_handle==-1)        {
         Print("File = ", fileName[wait-1], " not opened ", ErrorDescription(GetLastError()));
         return;
     }
      int h=W.Height/3;
      int w=W.Width;
      uchar f[];
      uint size=FileReadArray(file_handle,f);
      if(size!=(h*w*4+54)) {// на всякий случай проверяем правильность размера файла. 54 байта - это шапка bmp файла, дальше массив пикелей 
         Print("Wrong file size = ", size,  " file = ", fileName[wait-1]);
         return;
      }
      ArrayCopy(f,f,0,54);
      //ArrayResize(bmp,w*h));
      union UCI
        {
         uchar h[4];
         uint  u;
        };
      UCI z;
      for(int x=0; x<w; x++)
         for(int y=0; y<h; y++)
           {
            int adr=(((h-1)-y)*w+x)*4;
            z.h[0]=f[adr];   //синий
            z.h[1]=f[adr+1]; //зеленый
            z.h[2]=f[adr+2]; //красный
            z.h[3]=tr ;      //прозрачность от 0 до 255
            Canvas.m_pixels[w*(y+(wait-1)*h)+x]=z.u;
           }

      FileClose(file_handle);
      // FileDelete(fileName[wait-1]);
      if(wait==3)
         wait=0;
      else
         wait++;
     }
   Canvas.Update();
   int error = GetLastError();
   if(error > 0) Print(ErrorDescription(error), " (", error, ") l=", __LINE__);
   ChartScreenShot(0,WindowExpertName()+".png",W.Width+49,W.Height+24);
}
//+------------------------------------------------------------------+
void MyChartShot(long chart_id, string absFileName) {
   int handleChart=(int)ChartGetInteger(chart_id,CHART_WINDOW_HANDLE);
   ScreenShotWin(handleChart, absFileName);   
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)  {
}
//+------------------------------------------------------------------+
Файлы:
GoDateEA.mq4  12 kb
GoDateEA.png  55 kb