文章 "图形界面 VIII: 文件导航器控件 (第三章)" - 页 2

 

阿纳托利,在我看来,这是我在这里看到的最好的 mql 图形库实施方案。

我现在正在研究如何将它 "嵌入 "到我的 EA 中。除了以下两点,一切都已足够:

1)没有在单个单元格内设置控件(复选框、按钮......)的表格。

2)我不知道如何制作一个具有动态内容的窗口。

对于 1)-th,原则上很明显,你需要创建一个新类作为 CTable 的扩展。但对于第 2) 项,这就是个谜了。假设在 Expert Advisor 工作的不同时刻都会打开一个对话窗口,根据当前条件,对话窗口中的复选框数量会有所不同。如果下一次打开窗口时复选框的数量增加了,那就很清楚是怎么做到的了。但如果复选框数量减少,该如何操作呢?如果我理解正确的话,有必要 "杀死 "一些 "订阅 "到该窗口的控件,但在CWndContainer 中没有销毁项的方法,只有添加项的方法。如果这个版本的库可以做到这一点,您能告诉我怎么做吗?

 
akskarabey:

阿纳托利,在我看来,这是我在这里看到的最好的 mql 图形库实施方案。

我现在正在研究如何将它 "嵌入 "到我的 EA 中。除了以下两点,一切都已足够:

1)没有在单个单元格内设置控件(复选框、按钮......)的表格。

2)我不知道如何制作一个具有动态内容的窗口。

对于 1)-th,原则上很明显,您需要创建一个新类作为 CTable 的扩展。但对于第 2) 项,这就是个谜了。假设在 Expert Advisor 工作的不同时刻,都会打开一个对话窗口,根据当前条件,对话窗口中的复选框数量会有所不同。如果下一次打开窗口时复选框的数量增加了,那就很清楚是怎么做到的了。但如果复选框数量减少,该如何操作呢?如果我理解正确的话,有必要 "杀死 "一些 "订阅 "到该窗口的控件,但在 CWndContainer 中没有销毁项的方法,只有添加项的方法。如果这个版本的库可以做到这一点,您能告诉我怎么做吗?

感谢您提出的有趣建议。

是的,现在这个版本还没有现成的解决方案。我发现需要这样的功能,所以我把它们添加到了实施计划中。

关于第二点。如果您需要复选框的动态列表,那么创建一个类似CCheckboxList 的项目类,并在创建项目后使用添加和删除数组(列表)项目的方法会更容易。顺便说一下,我们还计划将此功能添加到所有类型的列表和表格中。

 
Anatoli Kazharski:

关于第二点。如果您需要复选框的动态列表,更简单的方法是创建另一个CCheckboxList 类型元素的类,并在创建元素后使用添加和删除数组(列表)元素的方法。顺便说一下,我们还计划将此功能添加到所有类型的列表和表格中。

是否可以用不同的复选框集制作多个标签,并显示所需的复选框?
 
Andrey Khatimlianskii:
我们能否用不同的复选框组制作多个标签,并显示所需的复选框?

如果这些复选框组是预定义的,那么这个选项就没问题。

已经可以创建选项卡:图形用户界面七:"选项卡 "元素(第 2 章)>>

 
Anatoli Kazharski:

如果从一开始就预定义了集合,则可以使用该选项。

已经可以创建标签:图形用户界面七:标签元素(第 2 章)>>。

这是给提问者的提示)

还有一个小问题--是否可以通过编程激活标签页。

 
Andrey Khatimlianskii:

...

还有一个小问题--是否可以通过编程激活选项卡。

在自定义类中,在创建元素之前创建界面时:

//+------------------------------------------------------------------+
//| 创建标签区域|
//+------------------------------------------------------------------+
bool CProgram::CreateTabs(void)
  {
#define  TABS1_TOTAL 4
//--- 传递面板对象
   m_tabs.WindowPointer(m_window1);
//--- 坐标
   int x=m_window1.X()+TABS1_GAP_X;
   int y=m_window1.Y()+TABS1_GAP_Y;
//--- 包含文本和标签宽度的数组
   string tabs_text[]={"Tab 1","Tab 2","Tab 3","Tab 4"};
   int tabs_width[]={90,90,90,90};
//--- 创建前设置属性
   m_tabs.XSize(596);
   m_tabs.YSize(243);
   m_tabs.TabYSize(TabsHeight);
   m_tabs.PositionMode(TabsPosition);
   m_tabs.SelectedTab((m_tabs.SelectedTab()==WRONG_VALUE) ? 1 : m_tabs.SelectedTab());
//--- 添加具有指定属性的标签页
   for(int i=0; i<TABS1_TOTAL; i++)
      m_tabs.AddTab(tabs_text[i],tabs_width[i]);
//--- 创建一个控件
   if(!m_tabs.CreateTabs(m_chart_id,m_subwin,x,y))
      return(false);
//--- 将对象添加到对象组的通用数组中
   CWndContainer::AddToElementsArray(0,m_tabs);
   return(true);
  }

//---

这样就可以了吗?或者,在工作过程中创建元素后,是否有必要以编程方式切换选项卡?

 

最好能增加这样的功能......

比如

m_tabs.SelectTab(...)
 
Ruslan Khasanov:
Andrey Khatimlianskii

我将在创建标签页后,通过指定其索引来激活它。

的确,在有些情况下这是必要的。我想到了一些可以自动激活标签页的方法。)

 

如何根据显示导航器的窗口大小调整导航器的大小?

例如:窗口大小为 450。如何将导航器放入窗口,使其左右各缩进 2 个像素?

 
Artyom Trishkin:

如何根据显示导航器的窗口大小调整导航器的大小?

例如:窗口大小为 450。如何将导航器放入窗口,使左右各缩进 2 个像素?

您需要使用CFileNavigator::TreeViewAreaWidth() 和CFileNavigator::ContentAreaWidth() 方法,指定树形列表区域和内容区域的宽度。如果不设置内容区域的宽度,导航器的右边缘将自动与窗口的右边缘对齐。