文章 "图形界面 VII: 页面控件 (第二章)" - 页 3

 

如何将 CLabel 添加到标签页,当我创建 CLabel 项目并希望添加到标签页时,编译器给出了这些错误:


CLabel m_overview_titlte_label;

bool CMainPanel::CreateOverviewTitleLabel(const string text)
  {

//--- 传递面板对象
   m_overview_title_label.WindowPointer(m_window);
//--- 附加到第一组选项卡的第四个选项卡上
   m_main_panel_tabs.AddToElementsArray(0,m_overview_title_label);  
   m_main_panel_tabs.AddToElementsArray( 
//--- 坐标
   int x=m_window.X()+OVERVIE_TITLE_LABEL_GAP_X;
   int y=m_window.Y()+OVERVIE_TITLE_LABEL_GAP_Y;
//--- 创建前设置属性
   m_overview_title_label.XSize(140);
   m_overview_title_label.YSize(18);
   //m_overview_title_label.
//--- 创建控制
   if(!m_overview_title_label.Create(m_chart_id,text,m_subwin,x,y))
      return(false);
//--- 将对象添加到对象组的通用数组中
   //CWndContainer::AddToElementsArray(0,m_overview_title_label);
   return(true);
  }


Compiler Error:

WindowPointer' - 函数未定义 MainPanel.mqh 233 27

m_overview_title_label' - 参数转换不允许 MainPanel.mqh 235 43

'm_overview_title_label' - 希望使用相同类型的变量 MainPanel.mqh 235 43

 
Martin Fischer 函数。 我可以创建这些对象,但无法将它们附加到窗口。 在这种情况下不起作用...... 2.) CComboBox 是静态对象吗?是否可以在创建后修改 中的元素列表?







ComboBox-Listview 中的元素列表?

谢谢!

我也遇到过同样的问题,我是通过创建一个 include 文件并编写我的标签类来解决这个问题的。您必须在 Include\EasyAndFastGUI\Controls\MyLabel.mqh 中创建该文件。

这段代码是

//+------------------------------------------------------------------+
//|我的标签mqh
//|版权 2023, Sassiz.根
//|https://t.me/R00T_S4SS12 | |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, Sassiz.Root"
#property link      "https://t.me/R00T_S4SS12"
#property strict

#include "Element.mqh"
#include "Window.mqh"
//+------------------------------------------------------------------+
//| 创建复选框的类|
//+------------------------------------------------------------------+
class MyLabel : public CElement
  {
private:
   //-- 连接元素的表单指针
   CWindow          *m_wnd;
   //--- 创建复选框的对象

   CLabel            m_label;

   //--- 复选框文本
   string            m_label_text;
   //--- 文本标签页边距
   int               m_label_x_gap;
   int               m_label_y_gap;
   //--- 不同状态下文本标签的颜色
   color             m_label_color;
   color             m_label_color_off;
   color             m_label_color_hover;
   color             m_label_color_locked;
   color             m_label_color_array[];
   //--- 按下鼠标左键的优先级
   int               m_zorder;
   int               m_area_zorder;

   //---
public:
                     MyLabel(void);
                    ~MyLabel(void);
   //--- 创建复选框的方法
   bool              CreateLabel(const long chart_id,const int subwin,const string text,const int x,const int y);
   //---
private:
   bool              CreateLabel2(void);
   //---
public:
   //--- (1) 存储表单指针,(2) 返回/设置复选框的状态
   void              WindowPointer(CWindow &object)                 { m_wnd=::GetPointer(object);            }

   //--- (1) 背景颜色,(2) 文本标签的页边距

   void              LabelXGap(const int x_gap)                     { m_label_x_gap=x_gap;                   }
   void              LabelYGap(const int y_gap)                     { m_label_y_gap=y_gap;                   }
   //--- 不同状态下文字的颜色
   void              LabelColor(const color clr)                    { m_label_color=clr;                     }

   //---(1)复选框说明,(2)返回/设置复选框按钮的状态
   string            LabelText(void)                          const { return(m_label.Description());         }

   //--- 更改颜色
   void              ChangeObjectsColor(void);
   //---
public:
   //-- 图表事件处理程序
   virtual void      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
   //--- 定时器
   virtual void      OnEventTimer(void);
   //--- 移动元素
   virtual void      Moving(const int x,const int y);
   //--- (1) 显示,(2) 隐藏,(3) 重置,(4) 删除
   virtual void      Show(void);
   virtual void      Hide(void);
   virtual void      Reset(void);
   virtual void      Delete(void);
   //---(1)设置、(2)重置鼠标左键按下的优先级
   virtual void      SetZorders(void);
   virtual void      ResetZorders(void);
   //-- 重置颜色
   virtual void      ResetColors(void);
   virtual void      SetText(string text);
   virtual void      SetFontSize(int fontSize);
   //---
private:
   //--- 处理对元素的按压
   bool              OnClickLabel(const string clicked_object);
  };
//+------------------------------------------------------------------+
//| 构造函数|
//+------------------------------------------------------------------+
MyLabel::MyLabel(void) :      
                             m_label_x_gap(20),
                             m_label_y_gap(2),
                             m_label_color(clrBlack)
                             
  {
//--- 在基类中存储元素类的名称
   CElement::ClassName(CLASS_NAME);
//--- 设置点击鼠标左键的优先级
   m_zorder      =0;
   m_area_zorder =1;
  }
//+------------------------------------------------------------------+
//| 销毁器|
//+------------------------------------------------------------------+
MyLabel::~MyLabel(void)
  {
  }
//+------------------------------------------------------------------+
//| 事件处理|
//+------------------------------------------------------------------+
void MyLabel::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- 光标移动事件的处理
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      //--- 离开,如果元素是隐藏的
      if(!CElement::IsVisible())
         return;
      //--- 如果子窗口的数量不匹配,则离开
      if(CElement::m_subwin!=CElement::m_mouse.SubWindowNumber())
         return;
      //--- 检查元素上的焦点
      CElement::MouseFocus(m_mouse.X()>X() && m_mouse.X()<X2() && m_mouse.Y()>Y() && m_mouse.Y()<Y2());
      return;
     }
//--- 处理对象上的鼠标左键点击
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      //--- 按下复选框
      if(OnClickLabel(sparam))
         return;
     }
  }
//+------------------------------------------------------------------+
//| 定时器|
//+------------------------------------------------------------------+
void MyLabel::OnEventTimer(void)
  {
//--- 如果表单未被阻止
   if(!m_wnd.IsLocked())
      //--- 更改元素对象的颜色
      ChangeObjectsColor();
  }
//+------------------------------------------------------------------+
//| 创建一组复选框对象|
//+------------------------------------------------------------------+
bool MyLabel::CreateLabel(const long chart_id,const int subwin,const string text,const int x,const int y)
  {
//--- 如果没有表格指针,则离开
   if(!CElement::CheckWindowPointer(::CheckPointer(m_wnd)))
      return(false);
//--- 初始化变量
   m_id         =m_wnd.LastId()+1;
   m_chart_id   =chart_id;
   m_subwin     =subwin;
   m_x          =x;
   m_y          =y;
   m_label_text =text;
//--- 边缘的边距
   CElement::XGap(CElement::X()-m_wnd.X());
   CElement::YGap(CElement::Y()-m_wnd.Y());
//--- 创建一个元素

   if(!CreateLabel2())
      return(false);
//--- 如果窗口是对话框或已最小化,则隐藏元素
   if(m_wnd.WindowType()==W_DIALOG || m_wnd.IsMinimized())
      Hide();
//---
   return(true);
  }


//+------------------------------------------------------------------+
//| 创建复选框标签|
//+------------------------------------------------------------------+
bool MyLabel::CreateLabel2(void)
  {
//--- 生成对象名称
   string name=CElement::ProgramName()+"_lable_"+(string)CElement::Id();
//--- 坐标
   int x =CElement::X()+m_label_x_gap;
   int y =CElement::Y()+m_label_y_gap;
//--- 根据状态显示文字颜色
   color label_color=clrBlack;//(m_check_button_state) ? m_label_color : m_label_color_off;
//--- 设置对象
   if(!m_label.Create(m_chart_id,name,m_subwin,x,y))
      return(false);
//--- 设置属性
   m_label.Description(m_label_text);
   m_label.Font(FONT);
   m_label.FontSize(FONT_SIZE);
   m_label.Color(label_color);
   m_label.Corner(m_corner);
   m_label.Anchor(m_anchor);
   m_label.Selectable(false);
   m_label.Z_Order(m_zorder);
   m_label.Tooltip("\n");
//--- 边缘的边距
   m_label.XGap(x-m_wnd.X());
   m_label.YGap(y-m_wnd.Y());
//--- 初始化梯度阵列
   CElement::InitColorArray(label_color,m_label_color_hover,m_label_color_array);
//--- 存储对象指针
   CElement::AddToArray(m_label);
   return(true);
  }
//+------------------------------------------------------------------+
//| 移动元素|
//+------------------------------------------------------------------+
void MyLabel::Moving(const int x,const int y)
  {
//--- 离开,如果元素是隐藏的
   if(!CElement::IsVisible())
      return;
//-- 在元素字段中存储缩进
   CElement::X(x+XGap());
   CElement::Y(y+YGap());
//-- 在对象的字段中存储坐标
   m_label.X(x+m_label.XGap());
   m_label.Y(y+m_label.YGap());
//-- 更新图形对象的坐标
   m_label.X_Distance(m_label.X());
   m_label.Y_Distance(m_label.Y());
  }
//+------------------------------------------------------------------+
//| 当光标悬停在对象上时更改对象颜色
//+------------------------------------------------------------------+
void MyLabel::ChangeObjectsColor(void)
  {
//--- 如果元素被阻止,则离开

//---
   color label_color=clrBlack;//(m_check_button_state) ? m_label_color : m_label_color_off;
   CElement::ChangeObjectColor(m_label.Name(),CElement::MouseFocus(),OBJPROP_COLOR,label_color,m_label_color_hover,m_label_color_array);
  }
//+------------------------------------------------------------------+
//| 显示组合框|
//+------------------------------------------------------------------+
void MyLabel::Show(void)
  {
//--- 离开,如果元素已经可见
   if(CElement::IsVisible())
      return;
//--- 使所有对象可见
   for(int i=0; i<CElement::ObjectsElementTotal(); i++)
      CElement::Object(i).Timeframes(OBJ_ALL_PERIODS);
//--- 可见性状态
   CElement::IsVisible(true);
  }
//+------------------------------------------------------------------+
//| 隐藏组合框|
//+------------------------------------------------------------------+
void MyLabel::Hide(void)
  {
//--- 离开,如果元素已经可见
   if(!CElement::IsVisible())
      return;
//--- 隐藏所有对象
   for(int i=0; i<CElement::ObjectsElementTotal(); i++)
      CElement::Object(i).Timeframes(OBJ_NO_PERIODS);
//--- 可见性状态
   CElement::IsVisible(false);
  }
//+------------------------------------------------------------------+
//| 重绘|
//+------------------------------------------------------------------+
void MyLabel::Reset(void)
  {
//--- 离开,如果这是一个下拉元素
   if(CElement::IsDropdown())
      return;
//--- 隐藏和显示
   Hide();
   Show();
  }
//+------------------------------------------------------------------+
//| 删除|
//+------------------------------------------------------------------+
void MyLabel::Delete(void)
  {
//--- 删除对象
   m_label.Delete();
//-- 清空对象数组
   CElement::FreeObjectsArray();
//-- 按默认值初始化变量
   CElement::MouseFocus(false);
   CElement::IsVisible(true);
  }
//+------------------------------------------------------------------+
//eth the priorities|
//+------------------------------------------------------------------+
void MyLabel::SetZorders(void)
  {
   m_label.Z_Order(m_zorder);
  }
//+------------------------------------------------------------------+
//| 重置优先级|
//+------------------------------------------------------------------+
void MyLabel::ResetZorders(void)
  {
   m_label.Z_Order(0);
  }
//+------------------------------------------------------------------+
//| 重置元素对象的颜色|
//+------------------------------------------------------------------+
void MyLabel::ResetColors(void)
  {

//-- 重置颜色
   m_label.Color(clrBlack);
//-- 将焦点归零
   CElement::MouseFocus(false);
  }

//+------------------------------------------------------------------+
//| 点击元素标题|
//+------------------------------------------------------------------+
bool MyLabel::OnClickLabel(const string clicked_object)
  {

//--- 鼠标光标当前位于元素上方
   m_label.Color(m_label_color_hover);
//--- 发送相关信息
   ::EventChartCustom(m_chart_id,ON_CLICK_LABEL,CElement::Id(),0,m_label.Description());
   return(true);
  }
//+------------------------------------------------------------------+


void MyLabel::SetText(string text){
   m_label.Description(text);
}

void MyLabel::SetFontSize(int fontSize){
   m_label.FontSize(fontSize);
}

然后像这样从 MyLabel 类中创建对象并使用它:

   //-- 标签
   MyLabel           m_overview_title_label;

然后

//+------------------------------------------------------------------+
//| 创建概述标题标签|
//+------------------------------------------------------------------+
bool CMainPanel::CreateOverviewTitleLabel(const string text)
  {

//--- 传递面板对象
   m_overview_title_label.WindowPointer(m_window);
//--- 附加到第一组选项卡的第四个选项卡上
   m_main_panel_tabs.AddToElementsArray(0,m_overview_title_label);  
//--- 坐标
   int x=m_window.X()+OVERVIE_TITLE_LABEL_GAP_X;
   int y=m_window.Y()+OVERVIE_TITLE_LABEL_GAP_Y;
//--- 创建前设置属性
   m_overview_title_label.XSize(140);
   m_overview_title_label.YSize(18);
   m_overview_title_label.SetText(text);
   m_overview_title_label.SetFontSize(18);
   //m_overview_title_label.
//--- 创建控制
   if(!m_overview_title_label.CreateLabel(m_chart_id,m_subwin,text,x,y))
      return(false);
//--- 将对象添加到对象组的通用数组中
   CWndContainer::AddToElementsArray(0,m_overview_title_label);
   return(true);
  }
 
如果我们增加标签页的数量,无论是纵向还是横向,都将无法滚动,从而导致窗口超出其极限,降低其效率。