SymbolsInformer/ConsoleDialog.mqh

394 lines
30 KiB
MQL5
Raw Permalink Normal View History

2025-06-01 14:18:42 +03:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| ConsoleDialog.mqh |
//| Copyright 2025, Yuriy Bykov |
//| https://www.mql5.com/ru/users/antekov |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, Yuriy Bykov"
#property link "https://www.mql5.com/ru/users/antekov"
#property version "1.00"
#include "Include/Adwizard/Utils/Macros.mqh"
#include <Canvas/Canvas.mqh>
#include <Controls/Dialog.mqh>
#define DIALOG_VERTICAL_MARGIN (17) // BABC? 25@E=53> :@0O 480;>3>2>3> >:=0 >B :@0O 3@0D8:0
//+------------------------------------------------------------------+
//| ;0AA 480;>3>2>3> >:=0 =0 25AL M:@0= |
//| 4;O 2K2>40 <=>3>AB@>G=>3> B5:AB0 |
//+------------------------------------------------------------------+
class CConsoleDialog : public CAppDialog {
protected:
CCanvas m_canvas; // 1J5:B E>;AB0 4;O 2K2>40 B5:AB0
string m_lines[]; // 0AA82 AB@>: B5:AB0
string m_text; // "5:AB 4;O 2K2>40 2 480;>3>2>< >:=5
int m_startRow; // 0G0;L=0O AB@>:0 2848<>3> B5:AB0
int m_startCol; // 0G0;L=K9 AB>;15F (A8<2>;) 2848<>3> B5:AB0
int m_totalRows; // 1I55 G8A;> AB@>: B5:AB0
int m_totalCols; // 1I55 G8A;> A8<2>;>2 2 A0<>9 4;8==>9 AB@>:5 B5:AB0
int m_visibleRows; // 0:A8<0;L=>5 :>;8G5AB2> 2848<KE AB@>:
int m_visibleCols; // 0:A8<0;L=>5 :>;8G5AB2> 2848<KE A8<2>;>2 2 AB@>:5
string m_fontName; // 0720=85 H@8DB0 4;O B5:AB0
int m_fontSize; // 07<5@ H@8DB0
uint m_fontColor; // &25B H@8DB0
int m_fontSymbolWidth; // (8@8=0 >4=>3> A8<2>;0 2 ?8:A5;OE
int m_fontSymbolHeight; // KA>B0 AB@>:8 B5:AB0 2 ?8:A5;OE
uint m_backgroundColor; // &25B D>=0
bool m_mouseWheel; // @54K4CI55 A>AB>O=85 >BA;56820=8O A>1KB89 ?@>:@CB:8 <KHLN
bool CreateCanvas(); // !>740=85 E>;AB0
void UpdateCanvas(); // K2>4 B5:AB0 =0 E>;AB5
void UpdateCanvasFont(); // 7<5=5=85 H@8DB0 E>;AB0
public:
CConsoleDialog(); // >=AB@C:B>@
~CConsoleDialog(void); // 5AB@C:B>@
// 5B>4K A>740=8O 480;>3>2>3> >:=0
bool Create(string name);
virtual bool Create(const long chart, const string name, const int subwin,
const int x1, const int y1, const int x2, const int y2);
// 1@01>B:0 A>1KB89
virtual void ChartEvent(const int id, const long &lparam,
const double &dparam, const string &sparam);
virtual void Minimize(); // 8=8<870F8O 480;>3>2>3> >:=0
virtual void Maximize(); // 0:A8<870F8O 480;>3>2>3> >:=0
virtual void Text(string text); // #AB0=>2:0 =>2>3> B5:AB0
virtual void FontName(string p_fontName); // #AB0=>2:0 =0720=8O H@8DB0
virtual bool FontSize(int p_fontSize); // #AB0=>2:0 @07<5@0 H@8DB0
virtual void FontColor(uint p_fontColor); // #AB0=>2:0 F25B0 H@8DB0
// #AB0=>2:0 F25B0 D>=0
virtual void BackgroundColor(uint p_backgroundColor);
};
//+------------------------------------------------------------------+
//| >=AB@C:B>@ |
//+------------------------------------------------------------------+
CConsoleDialog::CConsoleDialog() :
m_fontName("Consolas"),
m_fontSize(13),
m_fontColor(ColorToARGB(clrBlack, 240)),
m_backgroundColor(ColorToARGB(clrBlack, 0)) {
FontSize(m_fontSize);
}
//+------------------------------------------------------------------+
//| 5AB@C:B>@ |
//+------------------------------------------------------------------+
CConsoleDialog::~CConsoleDialog() {
// #40;O5< E>;AB
m_canvas.Destroy();
// >72@0I05< ?@56=NN =0AB@>9:C >1@01>B:8 A>1KB89 ?@>:@CB:8 <KHLN
ChartSetInteger(m_chart_id, CHART_EVENT_MOUSE_WHEEL, (long)m_mouseWheel);
}
//+------------------------------------------------------------------+
//| 5B>4 A>740=8O 480;>3>2>3> >:=0 B>;L:> ?> 8<5=8 |
//+------------------------------------------------------------------+
bool CConsoleDialog::Create(string name) {
// #AB0=02;8205< ?>;>65=85 C3;0 8 @07<5@K >:=0
int x1 = 0;
int y1 = DIALOG_VERTICAL_MARGIN;
int y2 = (int) ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, 0);
int x2 = (int) ChartGetInteger(0, CHART_WIDTH_IN_PIXELS, 0);
// K7K205< <5B>4 A>740=8O ?> 7040==K< @07<5@0<
return Create(0, name, 0, x1, y1, x2, y2);
}
//+------------------------------------------------------------------+
//| 5B>4 A>740=8O 480;>3>2>3> >:=0 |
//+------------------------------------------------------------------+
bool CConsoleDialog::Create(const long chart, const string name, const int subwin, const int x1, const int y1, const int x2, const int y2) {
// K7>2 @>48B5;LA:>3> <5B>40 A>740=8O 480;>30
if(!CAppDialog::Create(chart, name, subwin, x1, y1, x2, y2)) {
return false;
}
// #AB=>2:0 @07<5@>2 <8=8<878@>20==>3> >:=0 480;>30
m_min_rect.SetBound(0, DIALOG_VERTICAL_MARGIN,
250, DIALOG_VERTICAL_MARGIN + CONTROLS_DIALOG_MINIMIZE_HEIGHT);
// !>740=85 E>;AB0
if(!CreateCanvas()) {
return false;
}
// 0?><8=05< ?@56=NN =0AB@>9:C >1@01>B:8 A>1KB89 ?@>:@CB:8 <KHLN
m_mouseWheel = ChartGetInteger(0, CHART_EVENT_MOUSE_WHEEL);
// #AB0=02;8205< >BA;56820=85 A>1KB89 ?@>:@CB:8 <KHLN
ChartSetInteger(chart, CHART_EVENT_MOUSE_WHEEL, 1);
// #AB0=02;8205< =0G0;L=>5 ?>;>65=85 B5:AB0 2 >:=5
m_startRow = 0;
m_startCol = 0;
return true;
}
//+------------------------------------------------------------------+
//| 1@01>B:0 A>1KB89 |
//+------------------------------------------------------------------+
void CConsoleDialog::ChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) {
// 1@01>B:0 A>1KB8O ?@>:@CB:8 :>;QA8:0 <KH8
if(id == CHARTEVENT_MOUSE_WHEEL) {
// A;8 >:=> 480;>30 <8=8<878@>20=>, B> =5 >1@010BK205< MB> A>1KB85
if(m_minimized) {
return;
}
// 0718@05< A>AB>O=85 :=>?>: 8 :>;5A8:0 <KH:8 4;O MB>3> A>1KB8O
int flg_keys = (int)(lparam >> 32); // D;03 A>AB>O=89 :;028H Ctrl, Shift 8 :=>?>: <KH:8
int delta = (int)dparam; // AC<<0@=>5 7=0G5=85 ?@>:@CB:8 :>;5A8:0,
// A@010BK205B ?@8 4>AB865=88 +120 8;8 -120
// A;8 =060B0 :;028H0 SHIFT, B>
if((flg_keys & 0x0004) != 0) {
// A;8 :>;8G5AB2> A8<2>;>2 2 AB@>:5 1>;LH5 :>;8G5AB20 2848<KE
// A8<2>;>2 2 480;>35, B> 2K?>;=O5< 3>@87>=B0;L=>5 A<5I5=85
if(m_totalCols > m_visibleCols) {
// 0 >4=> A>1KB85 ?@>:@CB:8 1C45< A<5I0BLAO =0 2 A8<2>;0 (120 / 60 = 2)
delta /= 60;
// A;8 =>20O =0G0;L=0O ?>78F8O ?>?0405B 2 4>?CAB8<K9 480?07>=, B>
if(m_startCol - delta >= 0
&& m_startCol - delta <= m_totalCols - m_visibleCols + 2) {
// 0?><8=05< =>2CN =0G0;L=CN ?>78F8N
m_startCol -= delta;
// 1=>2;O5< E>;AB
UpdateCanvas();
}
}
} else if (flg_keys == 0) {
// =0G5 5A;8 :>;8G5AB2> AB@>: B5:AB0 1>;LH5 :>;8G5AB20 2848<KE
// AB@>: 2 480;>35, B> 2K?>;=O5< 25@B8:0;L=>5 A<5I5=85
if(m_totalRows > m_visibleRows) {
// 0 >4=> A>1KB85 ?@>:@CB:8 1C45< A<5I0BLAO =0 1 AB@>:C (120 / 120 = 1)
delta /= 120;
// A;8 =>20O =0G0;L=0O ?>78F8O ?>?0405B 2 4>?CAB8<K9 480?07>=, B>
if(m_startRow - delta >= 0
&& m_startRow - delta <= m_totalRows - m_visibleRows + 1) {
// 0?><8=05< =>2CN =0G0;L=CN ?>78F8N
m_startRow -= delta;
// 1=>2;O5< E>;AB
UpdateCanvas();
}
}
} else if((flg_keys & 0x0008) != 0) {
// =0G5 5A;8 =060B0 :;028H0 CTRL, B> ?@>1C5< CAB0=>28BL =>2K9 @07<5@ H@8DB0
if(FontSize(m_fontSize + delta / 120)) {
// 1=>2;O5< E>;AB
UpdateCanvas();
}
}
return;
}
// 1@01>B:0 A>1KB8O 87<5=5=8O 3@0D8:0
if(id == CHARTEVENT_CHART_CHANGE) {
// A;8 @07<5@K >B>1@0605<>9 >1;0AB8 87<5=8;8AL
if(m_chart.HeightInPixels(m_subwin) != Height() + DIALOG_VERTICAL_MARGIN
|| m_chart.WidthInPixels() != Width()) {
// #AB0=>28BL 4;O 480;>3>2>3> >:=0 =>2K5 @07<5@K
m_norm_rect.SetBound(0, DIALOG_VERTICAL_MARGIN, m_chart.WidthInPixels(), m_chart.HeightInPixels(m_subwin));
// A;8 >:=> 480;>30 =5 <8=8<878@>20=>, B>
if(!m_minimized) {
// 072>@0G825< 53> =0 ?>;=K9 M:@0= 3@0D8:0 A =>2K<8 @07<5@0<8
Maximize();
}
return;
}
}
// 1@01>B:0 >BA0;L=KE A>1KB89 2 2KH5AB>OI5< :;0AA5
CAppDialog::ChartEvent(id, lparam, dparam, sparam);
}
//+------------------------------------------------------------------+
//| 8=<870F8O 480;>3>2>3> >:=0 |
//+------------------------------------------------------------------+
void CConsoleDialog::Minimize() {
// #40;O5< E>;AB
m_canvas.Destroy();
// K7K205< @>48B5;LA:89 <5B>4 <8=8<870F88
CAppDialog::Minimize();
}
//+------------------------------------------------------------------+
//| 0:A8<870F8O 480;>3>2>3> >:=0 |
//+------------------------------------------------------------------+
void CConsoleDialog::Maximize() {
// K7K205< @>48B5;LA:89 <5B>4 <0:A8<870F88
CAppDialog::Maximize();
// !>740Q< E>;AB
CreateCanvas();
// K2>48< B5:AB =0 E>;AB5
UpdateCanvas();
}
//+------------------------------------------------------------------+
//| #AB0=>2:0 B5:AB0 |
//+------------------------------------------------------------------+
void CConsoleDialog::Text(string text) {
// A;8 B5:AB 87<5=O5BAO, B>
if(text != m_text) {
// 0?><=8< =>2K9 B5:B
m_text = text;
// 5;8< B5:AB =0 AB@>:8
StringSplit(m_text, '\n', m_lines);
// 0?><8=05< :>;8G5AB2> AB@>:
m_totalRows = ArraySize(m_lines);
// ?@545;O5< <0:A8<0;L=CN 4;8=C AB@>:
m_totalCols = 0;
FOREACH(m_lines) {
m_totalCols = MathMax(m_totalCols, StringLen(m_lines[i]));
}
// K2>48< B5:AB =0 E>;AB5
UpdateCanvas();
}
}
//+------------------------------------------------------------------+
//| #AB0=>2:0 =0720=8O H@8DB0 |
//+------------------------------------------------------------------+
void CConsoleDialog::FontName(string p_fontName) {
// 0?><8=05< =>2>5 8<O H@8DB0
m_fontName = p_fontName;
// 1=>2;O5< H@8DB E>;AB0
UpdateCanvasFont();
}
//+------------------------------------------------------------------+
//| #AB0=>2:0 @07<5@0 H@8DB0 |
//+------------------------------------------------------------------+
bool CConsoleDialog::FontSize(int p_fontSize) {
// A;8 @07<5@ =0E>48BAO 2 @07C<=KE ?@545;0E, B>
if (p_fontSize >= 8 && p_fontSize <= 72) {
// 0?><8=05< =>2K9 @07<5@ H@8DB0
m_fontSize = p_fontSize;
// !1@0AK205< =0G0;L=CN AB@>:C 8 AB>;15F
m_startRow = 0;
m_startCol = 0;
// 1=>2;O5< H@8DB E>;AB0
UpdateCanvasFont();
return true;
}
return false;
}
//+------------------------------------------------------------------+
//| #AB0=>2:0 F25B0 H@8DB0 |
//+------------------------------------------------------------------+
void CConsoleDialog::FontColor(uint p_fontColor) {
m_fontColor = p_fontColor;
}
//+------------------------------------------------------------------+
//| #AB0=>2:0 F25B0 D>=0 |
//+------------------------------------------------------------------+
void CConsoleDialog::BackgroundColor(uint p_backgroundColor) {
m_backgroundColor = p_backgroundColor;
}
//+------------------------------------------------------------------+
//| !>740=85 E>;AB0 |
//+------------------------------------------------------------------+
bool CConsoleDialog::CreateCanvas() {
// >;CG05< @07<5@K :;85=BA:>9 >1;0AB8 480;>3>2>3> >:=0
int height = ClientAreaHeight();
int width = ClientAreaWidth();
// A;8 @07<5@K =5=C;52K5
if(height > 0 && width > 0) {
// A;8 ?@8 A>740=88 E>;AB0 2>7=8:;0 >H81:0, B> 2KE>48<
if(!m_canvas.CreateBitmapLabel("display",
ClientAreaLeft(),
ClientAreaTop(),
ClientAreaWidth(),
ClientAreaHeight(),
COLOR_FORMAT_ARGB_NORMALIZE)) {
PrintFormat(__FUNCTION__" | ERROR: Creating canvas %d", GetLastError());
return false;
}
UpdateCanvasFont();
}
return true;
}
//+------------------------------------------------------------------+
//| K2>4 B5:AB0 =0 E>;AB5 |
//+------------------------------------------------------------------+
void CConsoleDialog::UpdateCanvas() {
// !B8@05< E>;AB F25B>< D>=0
m_canvas.Erase(m_backgroundColor);
// ;O :064>9 AB@>:8, ?>?040NI59 2 2848<K9 480?07>=
for (int i = m_startRow; i < MathMin(m_totalRows, m_startRow + m_visibleRows); i++) {
// 5@Q< >G5@54=CN AB@>:C B5:AB0
string line = m_lines[i];
// A;8 5Q =04> ?>:07K20BL =5 A ?5@2>3> A8<2>;0, B>
if (m_startCol > 0) {
// K@5705< =0G0;L=K5 A8<2>;K
line = StringSubstr(line, m_startCol);
}
// K2>48< AB@>:C =0 E>;AB
m_canvas.TextOut(5, 5 + (i - m_startRow) * m_fontSymbolHeight, line, m_fontColor, TA_LEFT | TA_TOP);
}
// K7K205< <5B>4 >B@8A>2:8 E>;AB0 =0 M:@0=5
m_canvas.Update(true);
}
//+------------------------------------------------------------------+
//| 7<5=5=85 H@8DB0 E>;AB0 |
//+------------------------------------------------------------------+
void CConsoleDialog::UpdateCanvasFont() {
// #AB0=>2:0 ?0@0<5B@>2 H@8DB0 4;O 2K2>40 B5:AB0 =0 E>;AB
m_canvas.FontSet(m_fontName, m_fontSize);
// #AB0=>2:0 =>2KE @07<5@>2 >4=>3> A8<2>;0
m_canvas.TextSize("M", m_fontSymbolWidth, m_fontSymbolHeight);
// ?@545;O5< :>;8G5AB2> 2848<KE AB@>: 8 A8<2>;>2 2 AB@>:5 (AB>;1F>2)
m_visibleRows = ClientAreaHeight() / m_fontSymbolHeight;
m_visibleCols = ClientAreaWidth() / m_fontSymbolWidth;
}
//+------------------------------------------------------------------+