文章 "图形界面 X: 在多行文本框中选择文本 (集成构建 13)" - 页 13

 
Anatoli Kazharski:

还有更多绑定元素的方法:

//---

结合这些属性,试着解决这个问题。


我知道 X(...) 和 Y(...) 方法将元素刚性绑定到 X 和 Y 坐标上,当接收改变主窗体窗口大小的事件时,它们不会以任何方式对 X 和 Y 坐标的位置做出反应。
 
Konstantin:

我知道 X(...) 和 Y(...) 方法将元素刚性绑定到 X 和 Y 坐标上,当接收改变主窗体窗口大小的事件时,它们不会以任何方式对 X 和 Y 坐标的位置做出反应。

您能否举一个现成的 Windows 应用程序的例子来说明您的需求?我不太明白您需要什么。或者用图形来描述一下。

如果我理解正确的话,元素_2 应绑定到窗体的底边,而元素_1 应自动垂直调整大小,并缩进到元素_2 的高度。

 
Anatoli Kazharski:

能否以现成的 Windows 应用程序为例,说明您的需求?我不太明白你需要什么。或者用图形来描述一下。

如果我没理解错的话,元素_2 应绑定到表单的底边,而元素_1 应自动调整垂直大小,并缩进到元素_2 的高度。


你说得没错,也就是说,当窗口大小发生变化时,元素_1 的 Y 轴大小也会发生变化,而你需要元素_2 也跟着缩小,即表单内元素的正常缩放。到目前为止,我已经建立了一个拐杖,即元素_1 不会缩放 ))。我稍后会处理这个问题。
 
图库缺少显示优先级设置,因为来自开放顺序/位置的图标具有更高的优先级,因此会被放在图库所有图形元素的顶部,我认为在图库 "核心 "中创建图形对象 时可以实现这一点。
 
Konstantin:
我认为可以通过在库的 "核心 "中创建图形对象 来实现。

试着这样做

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

讨论文章 "GUI X:多行输入框中的文本选择(第 13 版)"。

Anatoli Kazharski, 2017.05.08 21:40

在自定义应用程序类中,你需要创建一个CProgram::OnTradeEvent() 方法。

在主文件中,应在OnTrade() 函数中调用该方法:

//+------------------------------------------------------------------+
//| 贸易功能|
//+------------------------------------------------------------------+
void OnTrade(void)
  {
   program.OnTradeEvent();
  }

//---

例如,我的CProgram::OnTradeEvent() 方法的内容如下:

//+------------------------------------------------------------------+
//| 贸易交易事件|
//+------------------------------------------------------------------+
void CProgram::OnTradeEvent(void)
  {
//-- 向所有图表发送交易事件
   m_events.SendEventToAllCharts(0,ON_TRADE_EVENT,0,0.0,m_program_name);
//--- 设置最后一个位置的交易
   if(m_show_deals.CheckButtonState())
      if(m_vdeals.ShowDealsLastPosition())
         ResetWindow();
//--- 检查止损距离
   if(m_trailing_stop.CheckButtonState())
      m_ctrade.CheckStopLossSize(::Symbol());
//-- 为贸易操作进行变量清零
   m_ctrade.ZeroCalcPositionVariables();
//-- 初始化余额数组并更新图表上的序列
   InitBalanceArray();
   m_line_chart.SeriesUpdate(0,m_balance_data,"Balance",clrCornflowerBlue);
  }

 
Anatoli Kazharski:

试试这样做:


我见过这种方法,但我认为你需要在库的 "核心 "部分(即创建图形对象 时)补充这种用法:

bool  ObjectSetInteger( 
   long                             chart_id,      // 图表标识符 
   string                           name,          // 名称 
   ENUM_OBJECT_PROPERTY_INTEGER     prop_id,       // 财产 
   long                             prop_value     // 值 
   );

属性

OBJPROP_BACK

 
Konstantin:

我见过这种情况,但我认为在库的 "核心 "部分,即创建图形对象 时,需要对用法进行补充:

属性:

OBJPROP_BACK

然后,图形将覆盖界面的图形对象。

//---

现在先执行ResetWindow()。我稍后会尝试将其内置到内核中,以便自动更新。

 
Anatoli Kazharski:

然后,图形将覆盖界面的图形对象。

//---

现在先用ResetWindow()。我稍后会尝试将其内置到内核中,以便自动更新。


不完全是这样,你需要把所有图形对象放在前台,然后图形会在后面,我已经在我的图形库 中实现过很多次了))
 
Konstantin:

不完全是这样,你需要将所有图形对象优先置于前台,然后图形就会在后面,我已经在我的图形库中实现过很多次了 ))

我不知道你做了什么,也不知道你是怎么做的,但默认情况下它们都在前台。最近创建的图表在最上面。创建后更改优先级的唯一方法是再次隐藏和显示对象,但应放在底部的对象除外。

 

在 CTabs.类的方法 中应突出显示一个检查数组是否为空的功能:

void CTabs::CalculatingPatch(int &x,int &y,int &x_size,int &y_size)
  {
   if(ArraySize(m_tabs) == 0)
      return;

   if(m_position_mode==TABS_TOP)
     {
      x      =m_tabs[m_selected_tab].X()+1;
      y      =m_tabs[m_selected_tab].Y2()-1;
      x_size =m_tabs[m_selected_tab].XSize()-2;
      y_size =1;
     }
   else if(m_position_mode==TABS_BOTTOM)
     {
      x      =m_tabs[m_selected_tab].X()+1;
      y      =m_tabs[m_selected_tab].Y();
      x_size =m_tabs[m_selected_tab].XSize()-2;
      y_size =1;
     }
   else if(m_position_mode==TABS_LEFT)
     {
      x      =m_tabs[m_selected_tab].X2()-1;
      y      =m_tabs[m_selected_tab].Y()+1;
      x_size =1;
      y_size =m_tabs[m_selected_tab].YSize()-2;
     }
   else if(m_position_mode==TABS_RIGHT)
     {
      x      =m_tabs[m_selected_tab].X();
      y      =m_tabs[m_selected_tab].Y()+1;
      x_size =1;
      y_size =m_tabs[m_selected_tab].YSize()-2;
     }
  }

中应添加高亮显示,这是对空数组的检查,因为如果没有该检查,在没有标签页的情况下,整个表单会出错崩溃。