程序库: Easy Canvas - 页 14

 
Mighty7:

我必须说谢谢。现在完美了。干得漂亮

能回答我最后一个问题吗?左右移动和上下移动哪个更快?再次感谢。

 
Mighty7:

能否请您回答最后一个问题?左右移动和上下移动哪个更快?再次感谢。

上/下换挡比左/右换挡稍快。在标准全高清屏幕窗口的普通电脑上,整个移位过程大约需要 0.3 毫秒(1/3000 秒)。

上下移动比左右移动稍快。在普通电脑上,标准全高清屏幕窗口的整个移动过程大约需要 0.3 毫秒(1/3000 秒)。

 
Nikolai Semko:

下移和上移比左右移动稍快。在标准全高清屏幕窗口的普通电脑上,整个移位过程大约需要 0.3 毫秒(1/3000 秒)。

上下移动比左右移动稍快。在普通电脑上,标准全高清屏幕窗口的整个移动过程大约需要 0.3 毫秒(1/3000 秒)。

谢谢。

 
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if (sparam=="0") W.MouseStatus=NO_PRESSED;
   else if (sparam=="1") W.MouseStatus=LEFT_BUTTON_PRESSED;
   else if (sparam=="2") W.MouseStatus=RIGHT_BUTTON_PRESSED;
   else if (sparam=="3") W.MouseStatus=LEFT_AND_RIGHT_BUTTONS_PRESSED;
   else W.MouseStatus=KEY_PRESSED;
   W.IdEvent=id;
   W.lparam=lparam;
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/(double)W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }

我在这里几次除以 0,但重启终端后就不会再出现了 )

 
Oleksii Chepurnyi:

我在这里几次除以 0,但重启终端后就不会再出现了 )

很奇怪,我从来没有遇到过这种情况。
,那就先这样替换吧:

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if (W.dx_pix==0) return;
   if (sparam=="0") W.MouseStatus=NO_PRESSED;
   else if (sparam=="1") W.MouseStatus=LEFT_BUTTON_PRESSED;
   else if (sparam=="2") W.MouseStatus=RIGHT_BUTTON_PRESSED;
   else if (sparam=="3") W.MouseStatus=LEFT_AND_RIGHT_BUTTONS_PRESSED;
   else W.MouseStatus=KEY_PRESSED;
   W.IdEvent=id;
   W.lparam=lparam;
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+

不,这样更好:

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if (sparam=="0") W.MouseStatus=NO_PRESSED;
   else if (sparam=="1") W.MouseStatus=LEFT_BUTTON_PRESSED;
   else if (sparam=="2") W.MouseStatus=RIGHT_BUTTON_PRESSED;
   else if (sparam=="3") W.MouseStatus=LEFT_AND_RIGHT_BUTTONS_PRESSED;
   else W.MouseStatus=KEY_PRESSED;
   W.IdEvent=id;
   W.lparam=lparam;
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }
不幸的是,我无法更新 QB 中的版本。又出故障了。
附加的文件:
iCanvas.mqh  52 kb
 

如果能有一个适用于 4k 和 8k 显示器的通用解决方案,那将会非常有趣。

例如,我们画一个矩形,上面有两个按钮和两个输入框。按钮分别以像素为单位。

如果以像素为单位,那么在 4k 分辨率下,除了输入框外,所有内容都将缩小 2 倍。

但如果自动将整个画布平移 x2,那么在任何屏幕分辨率下,一切都会像在普通显示器上一样。

另一个问题可能是,有些用户会在 Windows 设置中放大字体(这会放大标准输入框)。

因此,有一个更通用的解决方案,即根据字体大小,用一个乘数来改变 kanvas 页面的像素化。


主要条件是在普通全高清显示器上以通常的像素尺寸绘制。解决方案如下

1. 严格按照 x2(4K 时)、x4(8K 时)改变画布比例

2. 使用与字体大小相关的动态乘数缩放工作表。


用途。用于仪表盘、交易面板和其他以像素为单位的绘制对象。

 
Vitaliy Kuznetsov:

如果能有一个 4k 和 8k 显示器的通用解决方案,那将会非常有趣。

例如,我们画一个矩形,上面有两个按钮和两个输入框。按钮分别以像素为单位。

如果以像素为单位,那么在 4k 分辨率下,除了输入框外,其他所有内容都将缩小 2 倍。

但如果自动将整个画布平移 x2,那么在任何屏幕分辨率下,一切都会像在普通显示器上一样。

还有一个问题是,有些用户会进入 Windows 设置并增大字体(这会增大标准输入字段)。

因此,更通用的解决方案是根据字体大小,用一个乘数来改变画布工作表的像素化。


主要条件是在普通的全高清显示器上以通常的像素尺寸绘制。目前正在寻找解决方案:

1. 严格按照 x2(4K 时)、x4(8K 时)改变图纸比例

2. 使用与字体大小相关的动态乘数缩放工作表


用途。用于仪表盘、交易面板和其他以像素为单位的绘制对象。

解决方案的关键是TERMINAL_SCREEN_DPI
这里并不复杂。我已经实现所有功能很久了。
没有时间演示了。
如果你在理解过程中遇到困难,可以谷歌一下 JS 是如何实现的。
 
Nikolai Semko:
解决方案的关键是TERMINAL_SCREEN_DPI
这里并不复杂。我很早就实现了所有功能
没有时间演示示例了。
如果你在理解过程中遇到困难,可以谷歌一下 JS 是如何实现的。

是的,我后来在搜索中找到了。谢谢。这里有一个例子 -https://www.mql5.com/zh/docs/constants/environment_state/terminalstatus

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Состояние клиентского терминала
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Состояние клиентского терминала
  • www.mql5.com
Состояние клиентского терминала - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Nikolai Semko #:
最新版本 1.12

你好,非常有趣,有没有可能将画布转换为对象?我的意思是,例如,将画布矩形转换为标准对象矩形来管理它。

 
Facundo Laje # :

你好,非常有趣,有可能将画布转换为对象吗?我的意思是,例如,将画布的矩形转换成标准对象的矩形来管理它。

如果是字面上的矩形对象,那就不行。
画布也是一个对象。
你只能通过编程将画布对象 "转换 "为矩形对象,使其内容可以移动和缩放。
从视觉上看,它可以完全像一个矩形对象,并在四角用小方块来控制。但在这个社区中,只有少数程序员能够实现这一点,包括我在内。

如果我们谈论的是矩形内部内容的转换,那么我们可以从以下几个方面入手。如果我们谈论的是一个简单的填充或空矩形,任何程序员都能做到。