文章 "图形界面 VI: 复选框控件,编辑框控件以及它们的组合类型 (第一章)" - 页 2

 
Thomas Schwabhäuser:

...

感谢您的建议!

我会增加这项功能。请关注本系列未来文章的更新。

 

在您的示例中,总是输出 id、lparam、dparam、sparam。

   if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)

     {

      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);

      //Print(m_spin_edit1.GetValue());

     }

我们会得到以下结果

TestLibrary (NZDUSD,H1) CProgram::OnEvent > id: 1020; lparam: 12; dparam: -1.0; sparam: Spin Edit 1:

id - 元素标识符

lparam - ?

dparam - ?

sparam - 元素名称

我们正在考虑一个输入字段--当然,获取输入值是很有趣的,如何尽可能快地获取呢?

 
Pavel Kolchin:

在您的示例中,总是有 id、lparam、dparam、sparam 输出。

...

id - 元素标识符

lparam - ?

dparam - ?

sparam - 元素名称

在大多数情况下,控件生成信息和参数的含义如下:

  • id - 事件标识符。
  • lparam - 元素标识符。
  • dparam - 元素索引。
  • sparam - 由库用户指定的显示文本(元素名称)。

我稍后会准备一个表格,显示每个元素的事件参数集。

Pavel Kolchin:

...

我们考虑一个输入框--当然,获取输入值是很有趣的,如何尽可能快地获取呢?

只需使用CSpinEdit::GetValue() 方法,您就可以获取输入字段中的当前值。

示例

//--- 来自输入框的事件已到达
   if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
     {
      //--- 如果项目 ID 来自第一个输入字段
      if(lparam==m_spin_edit1.Id())
        {
         //--- 输出其值
         Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
        }
      //---
      return;
     }
 
如果我们不知道字段名称,或者我们有上百个字段,也许可以通过 id 方法查看其中的内容,或者类似this.GetValue() 这样的方法。
 
Pavel Kolchin:
如果我们不知道名称,或者我们有上百个字段,也许可以通过 id 方法查看其中的内容,或者类似this.GetValue() 这样的方法
因此,每个元素都有自己唯一的元素 id。
 
Anatoli Kazharski:
因此,每个元素都有自己唯一的元素标识符。


if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

   if(lparam==m_spin_edit1.Id()){Print(m_spin_edit1.GetValue());}

   if(lparam==m_spin_edit2.Id()){Print(m_spin_edit2.GetValue());}

   if(lparam==m_spin_edit3.Id()){Print(m_spin_edit3.GetValue());}

   if(lparam==m_spin_edit4.Id()){Print(m_spin_edit4.GetValue());}

   if(lparam==m_spin_edit5.Id()){Print(m_spin_edit5.GetValue());}

   if(lparam==m_spin_edit6.Id()){Print(m_spin_edit6.GetValue());}

   if(lparam==m_spin_edit7.Id()){Print(m_spin_edit7.GetValue());}

   if(lparam==m_spin_edit8.Id()){Print(m_spin_edit8.GetValue());}

   if(lparam==m_spin_edit9.Id()){Print(m_spin_edit9.GetValue());}

   ...

}

我的意思是不要写这样的代码,也许这样做是有意义的。

if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

    Print(GetValue(lparam));

   или

   Print(this.GetValue());

}

但我的字段不多,第一种方案对我来说很好。

 

Pavel Kolchin:

...

我的意思是不要写这样的代码,也许这样做是有意义的。

if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

    Print(GetValue(lparam));

   или

   Print(this.GetValue());

}

我还不知道如何对所有元素的所有 get-Method 进行处理。不过我会考虑的。
 
//+------------------------------------------------------------------+
//| 图表事件函数|
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   program.ChartEvent(id,lparam,dparam,sparam);
   if(lparam==program.m_checkbox.Id())
      if(program.m_checkbox.CheckButtonState())
        {
         program.m_checkbox.LabelColor(clrGreen);
        }
   else
     {
      program.m_checkbox.LabelColor(clrRed);
     }
  }
//+------------------------------------------------------------------+
简单的任务。点击复选框时,更改复选框标签的颜色。选中 - 绿色文本,未选中 - 红色文本。这行不通。未选中时变成蓝色,选中时仍然是蓝色。
 

Alexander Fedosov:

简单的任务。点击复选框时,更改复选框标签的颜色。选中 - 绿色文本,未选中 - 红色文本。这行不通。未选中时变成蓝色,选中时仍然是蓝色。

现在,您只需在项目安装前为不同状态设置颜色即可(如下示例):

//+------------------------------------------------------------------+
//| 创建复选框 1|
//+------------------------------------------------------------------+
bool CProgram::CreateCheckBox1(const int x_gap,const int y_gap,string text)
  {
//--- 保存窗口指针
   m_checkbox1.WindowPointer(m_window1);
//--- 创建前设置属性
   m_checkbox1.XSize(90);
   m_checkbox1.YSize(18);
   m_checkbox1.LabelColor(clrGreen);
   m_checkbox1.LabelColorOff(clrRed);
   m_checkbox1.LabelColorHover(clrCornflowerBlue);
   m_checkbox1.LabelColorLocked(clrSilver);

//--- 创建一个控件
   if(!m_checkbox1.CreateCheckBox(m_chart_id,m_subwin,text,x_gap,y_gap))
      return(false);
//--- 将对象添加到对象组的通用数组中
   CWndContainer::AddToElementsArray(0,m_checkbox1);
   return(true);
  }
 
Alexander Fedosov:
//+------------------------------------------------------------------+
//| 图表事件函数|
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   program.ChartEvent(id,lparam,dparam,sparam);
   if(lparam==program.m_checkbox.Id())
      if(program.m_checkbox.CheckButtonState())
        {
         program.m_checkbox.LabelColor(clrGreen);
        }
   else
     {
      program.m_checkbox.LabelColor(clrRed);
     }
  }
//+------------------------------------------------------------------+
简单的任务。点击复选框时,更改复选框标签的颜色。选中 - 绿色文本,未选中 - 红色文本。这行不通。未选中时变成蓝色,选中时仍然是蓝色。

这样如何?

   if(lparam==program.m_checkbox.Id())
     {
      if(program.m_checkbox.CheckButtonState()) program.m_checkbox.LabelColor(clrGreen);
      else program.m_checkbox.LabelColor(clrRed);
     }