文章 "如何创建任意复杂度的图形面板"

 

新文章 如何创建任意复杂度的图形面板已发布:

本文详细介绍了如何在 CAppDialog 类的基础上创建面板,以及如何在面板上增加控件。它描述了面板的结构和框架,显示了对象的继承关系。从这篇文章中,您还可以学习到事件是怎样处理的以及它们是怎样在独立的控件之间传递的。另外还有实例演示了如何编辑面板参数,例如大小和背景颜色。

标准库的面板与对话框部分的对象是按照下面的顺序创建和使用的:首先创建"Border(边框)"对象,在其中会加上面板的背景,作为 "Back(背后的)"对象,然后,在背景上使用客户区域"ClientBack"。子控件可以在客户区域中加入,标题对象是面板的名称,并且包含两个控制按钮,是加在面板的顶部的。

AppWindow 面板上的图形对象

作者:Vladimir Karputov

 

感谢您的文章。信息量很大!

 
是的,这篇文章很有用,但我不明白如何处理 ON_DBL_CLICK 事件,您能提供帮助吗?
 
Andrii Djola:
是的,这篇文章很有用,但我不明白如何处理 ON_DBL_CLICK 事件,您能帮忙吗?

双击是两次点击,两次点击之间的时间间隔很小。因此,可以用与普通点击相同的方法来处理--您只需在OnChartEvent 中添加一个静态变量即可。请查看https://www.mql5.com/zh/docs/constants/chartconstants/enum_chartevents 中的示例,并执行类似操作:

//+------------------------------------------------------------------+
//| 图表事件函数|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // 事件标识符 
                  const long& lparam,   // 长类型事件参数
                  const double& dparam, // 事件参数为双类型
                  const string& sparam  // 字符串类型的事件参数
                  )
  {
//--- 鼠标最后一次点击的时间
   static uint last_click=0;
//--- 左键单击图表
   if(id==CHARTEVENT_CLICK)
     {
      uint click_time=GetTickCount();
      Print("鼠标在图表上点击的坐标: x = ",lparam,"  y = ",dparam);
      if(click_time-last_click<dbl_click_time) 
        {
         Print("DoubleClick!");
         // 任何其他行动
        }
      last_click=click_time;
     }
//--- 鼠标点击图形对象
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      Print("在名为''的对象上按下鼠标键"+sparam+"'");
     }
//--- 按下键盘上的按钮
   if(id==CHARTEVENT_KEYDOWN)
     {
      switch(lparam)
        {
         case KEY_NUMLOCK_LEFT:  Print("KEY_NUMLOCK_LEFT 已按下"。);   break;
         case KEY_LEFT:          Print("KEY_LEFT 已按下"。);           break;
         case KEY_NUMLOCK_UP:    Print("KEY_NUMLOCK_UP 已被按下"。);     break;
         case KEY_UP:            Print("KEY_UP已按下"。);             break;
         case KEY_NUMLOCK_RIGHT: Print("KEY_NUMLOCK_RIGHT 已按下"。);  break;
         case KEY_RIGHT:         Print("右键");          break;
         case KEY_NUMLOCK_DOWN:  Print("KEY_NUMLOCK_DOWN 已按下"。);   break;
         case KEY_DOWN:          Print("KEY_DOWN 已按下"。);           break;
         case KEY_NUMPAD_5:      Print("KEY_NUMPAD_5 已按下"。);       break;
         case KEY_NUMLOCK_5:     Print("KEY_NUMLOCK_5 已被按下"。);      break;
         default:                Print("按了某个未列出的键"。);
        }
      ChartRedraw();
......
     }
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Существуют 11 видов событий, которые можно обрабатывать с помощью функции предопределенной функции OnChartEvent(). Для пользовательских событий предусмотрено 65535 идентификаторов в диапазоне от CHARTEVENT_CUSTOM до CHARTEVENT_CUSTOM_LAST включительно. Для генерации пользовательского события необходимо использовать функцию EventChartCustom...
 
Andrii Djola:
是的,这篇文章很有用,但我不明白如何处理 ON_DBL_CLICK 事件,您能帮我吗?

如果您尝试按照正确的方法做所有事情,就不可能捕捉到 ON_DBL_CLICK 事件。一个简单的测试:我运行面板和对话框 部分的任何示例面板,在 CWnd::OnMouseUp 中设置一个断点:

结果是,无论您是单击还是双击面板,光标都不会转到断点。真扫兴。

 
Vladimir Karputov:

好吧,如果你尝试用正确的方法做所有事情,那就不可能捕捉到 ON_DBL_CLICK 事件。一个简单的检查方法:运行面板和对话框 部分的任何示例面板,在 CWnd::OnMouseUp 上设置一个断点:

结果是,无论您是单击还是双击面板,光标都不会转到断点。哎呀。

解决方法在另一个主题https://www.mql5.com/ru/forum/239867#comment_7224345 中显示

Обсуждение статьи "Улучшаем работу с Панелями: добавляем прозрачность, меняем цвет фона и наследуемся от CAppDialog/CWndClient"
Обсуждение статьи "Улучшаем работу с Панелями: добавляем прозрачность, меняем цвет фона и наследуемся от CAppDialog/CWndClient"
  • 2018.04.23
  • www.mql5.com
Опубликована статья Улучшаем работу с Панелями: добавляем прозрачность, меняем цвет фона и наследуемся от CAppDialog/CWndClient: Автор: Vladimir Ka...
 
MetaQuotes Software Corp.:

新文章《如何创建任何复杂程度的图形面板》已发布:

作者:Vladimir Karputov弗拉基米尔-卡尔普托夫

很好的介绍!谢谢
 

这篇文章写得非常好。我非常喜欢。写得非常好。


谢谢!

 

这是一篇非常好的文章,可以让我们更深入地了解这一主题。


遗憾的是,这并不能改变系统中缺少可视化对话编辑器的事实。

此外,对话框中的鼠标事件没有被正确拦截,当鼠标按钮被按下时,图表会在后台移动。

此外,底层指标的工具提示也是通过对话框显示的。

尽管 Doerk 的代码已经纠正了这一问题。

为 MetaTrader 5 替换CWndContainer 库 https://www.mql5.com/zh/code/13722

我想知道 Metaquotes 如何能如此固执地忽视这一点并不予纠正。

Die Ersetzung des CWndContainer
Die Ersetzung des CWndContainer
  • 投票: 24
  • 2016.09.01
  • Doerk Hilger
  • www.mql5.com
Der echte Autor: Original von MetaQuotes Software Corp. Die Modifizierung von Doerk. Diese Datei ersetzt die originale Datei WndContainer.mqh. Eine neue Funktion und zwei kleine Modifikationen verhindern die Veränderung des Charts beim Druck und bei der Haltung der Maus-Taste innerhalb im Bereichs des Containers, das heißt, beim Druck der...
 
Otto Pauser:

这篇文章非常精彩,可以让你更接近或深化这一主题。


遗憾的是,这并不能改变系统中缺少可视化对话编辑器的事实。

此外,对话框中的鼠标事件没有被正确拦截,当鼠标按钮被按下时,图表会在后台移动。

此外,后面指标的工具提示也会通过对话框显示出来。

尽管 Doerk 的代码已经更正,但还是出现了这种情况。

为 MetaTrader 5 替换 CWndContainer 库 https://www.mql5.com/zh/code/13722

我想知道 Metaquotes 如何能如此固执地忽视这一点并不予纠正。

奥托,我明白你在烦恼什么。

我之所以说再见,是因为在 MT5 的图形 编程方面有太多的纠结点。

我不知道 MQ 追求的是什么概念,但我认为他们走错了方向。

窗口中内置了一个特殊的图形框架。

他们总是在谈论安全性,因此尽可能地封装。


只需提供一个数据应用程序接口,然后让用户决定使用哪种语言。这才是现代方式。


致辞

 
该类功能很好,但不能用于当前的应用程序,因为面板只有在 Windows dpi 缩放设置为 1 时才会看起来不错。
因此,应用程序在你的屏幕上可能看起来不错,但在其他人的屏幕上可能就不行了。