文章 "图形界面 X: 高级列表和表格管理。代码优化 (集成构建 7)" - 页 9

 

托尔,谢谢你的提示:

//--- 栏
   for(uint c=l; c<m_visible_columns_total; c++)
     {
      //--- 获取垂直滚动条滑块的当前位置
      v=m_scrollv.CurrentPos()+t;
      //--- 行
      for(uint r=t; r<m_visible_rows_total; r++)
        {
         //--- 偏移表数据
         if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
           {
            //--- 对突出显示的一行进行调整
            color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
            color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];
            //--- 调整单元格中的 (1) 数值、(2) 背景颜色、(3) 文本颜色和 (4) 文本对齐方式
            SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
            v++;
           }
        }
      //---
      h++;
     }
所以,一切正常运行;)
 

关于交易、自动交易系统和测试交易策略的论坛

EasyAndFastGUI 库

Viktor Glovluk, 2017.01.26 10:42 AM.

亲爱的论坛成员,请帮帮忙!

Anatoli Kazharski 提供的这个库的基础上,我试图焊接一只猫头鹰,并希望在文件中组织复选框状态和输入字段值的记录!但为了避免每次都记录所有值,我不知道如何确定被点击的元素!在用户应用程序中有一个事件处理程序,参数 lparam 只负责提供元素的索引,但我不明白如何通过这个索引找到元素,然后进行处理!

在此先表示感谢!


 

Viktor Glovluk, 2017.01.26 10:42

亲爱的论坛成员,请帮帮我!

Anatoli Kazharski 提供的这个库的基础上,我正在尝试焊接一只猫头鹰,并希望在文件中记录复选框的状态和输入字段的值!但为了避免每次都记录所有值,我不知道如何确定被点击的元素!在用户应用程序中有一个事件处理程序,参数 lparam 只负责提供元素的索引,但我不明白如何通过这个索引找到元素,然后进行处理!

在此先表示感谢!

点击复选框可以通过标识符为ON_CLICK_LABEL 的 事件进行跟踪。

lparam 中包含元素标识符的值。

例如

//+------------------------------------------------------------------+
//| 事件处理程序|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- 文本标签上的点击事件
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {
      //--- 如果你点击了第一个复选框
      if(lparam==m_checkbox1.Id())
        {
         //---
        }
     }
  }
 

这真的是唯一的办法吗?

//--- 如果你点击了第一个复选框

if(lparam==m_checkbox1.Id())

在我发帖后已经得到答复!谢谢!我必须查看所有复选框和输入框 吗?举个例子,如果有 "一堆 "复选框和输入框?有没有数组存储所有项目的索引?然后通过该索引获取必要的值(例如,已点击或未点击的复选框、输入字段中的值)!
 
Viktor Glovluk:

这是唯一的办法吗?

你想怎么做?说清楚。
 
Viktor Glovluk:

...

如果有 "一堆 "元素,该如何举例?有没有存储所有元素索引的数组?那么就可以通过这个索引来获取必要的值(例如,已点击或未点击的复选框、输入框中的值)!

看看CWndContainer 类的内容。它们都存储在WindowElements 结构中。可以通过用户类访问它们。

   //--- 元素数组的结构
   struct WindowElements
     {
      //--- 所有对象的总数组
      CChartObject     *m_objects[];
      //--- 所有元素的总数组
      CElementBase     *m_elements[];

      //--- 个人元素数组:
      // 上下文菜单数组
      CContextMenu     *m_context_menus[];
      //--- 主菜单数组
      CMenuBar         *m_menu_bars[];
      //--- 工具提示
      CTooltip         *m_tooltips[];
      //-- 不同类型的下拉列表数组
      CElementBase     *m_drop_lists[];
      //--- 滚动条数组
      CElementBase     *m_scrolls[];
      //-- 文本标签表数组
      CElementBase     *m_labels_tables[];
      //-- 来自输入字段的表格数组
      CElementBase     *m_tables[];
      //-- 绘制的表格数组
      CElementBase     *m_canvas_tables[];
      //--- 标签数组
      CTabs            *m_tabs[];
      //-- 带图片的标签数组
      CIconTabs        *m_icon_tabs[];
      //-- 日历数组
      CCalendar        *m_calendars[];
      //--- 下拉日历数组
      CDropCalendar    *m_drop_calendars[];
      //-- 树状列表
      CTreeView        *m_treeview_lists[];
      //--- 文件导航器
      CFileNavigator   *m_file_navigators[];
      //--- 标准图形(图形对象)
      CStandardChart   *m_sub_charts[];
      //--- 图片滑动条
      CPicturesSlider  *m_pictures_slider[];
      //--- 时间
      CTimeEdit        *m_time_edits[];
      //-- 多行字段
      CTextBox         *m_text_boxes[];
     };
   //-- 每个窗口的元素数组阵列
   WindowElements    m_wnd[];
 

越远越好!:)

我又一次遇到了我无法理解的事件处理程序实现!创建自定义应用程序时,应该通过一个类来连接图形用户界面:

//--- 连接贸易面板类
#include "Menu.mqh"
CProgram program;

但是,如果按钮按下、复选框的状态和输入框 的值都在 CProgram 类的私有 区域内,又该如何捕捉它们呢?我是否应该把我需要的东西移到公共 区域,还是我误解了什么?

 
Viktor Glovluk:

...

但是,如何捕捉按钮的按下、如何获取复选框的状态和输入框 的值,等等......

CP 程序 处理程序中

//+------------------------------------------------------------------+
//| 事件处理程序|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- 文本标签上的点击事件
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {

     }

  } 

//---

所有文章都有 MQL 应用程序示例文件,展示如何处理控件 事件。

 
Anatoli Kazharski:

CP 程序 处理程序中

//+------------------------------------------------------------------+
//| 事件处理程序|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- 文本标签上的点击事件
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {

     }

  } 

//---

所有文章都有 MQL 应用程序示例文件,展示了如何处理控件事件。

CProgram 处理程序中很清楚,但这个处理程序是用于界面的,对吗?你不应该把交易解决方案塞进去!我对 OOP 了解甚少,大部分知识都来自您的文章,所以我可能很笨!:)

那么,举个例子,如何在 Expert Advisor(智能交易系统)中实现订单的开仓,而订单的手数是在输入栏中 设置的?我需要在 EA 中获取该字段的值!

 
Viktor Glovluk:

CProgram 处理程序中很清楚,但这个处理程序是为界面服务的,不是吗?你不应该把贸易解决方案塞进去!

为什么不呢?可以。它是您的 MQL 应用程序(指标或智能交易系统)的一个类。一切都一样。

您可以像这样从输入字段 中获取值:

m_spin_edit1.GetValue()