文章 "图形界面 VII: 页面控件 (第二章)" - 页 3 123 新评论 Mohammad-Reza Yakhyan 2023.01.19 17:32 #21 如何将 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 Mohammad-Reza Yakhyan 2023.01.19 21:42 #22 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); } matinz 2025.04.14 11:11 #23 如果我们增加标签页的数量,无论是纵向还是横向,都将无法滚动,从而导致窗口超出其极限,降低其效率。 123 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
如何将 CLabel 添加到标签页,当我创建 CLabel 项目并希望添加到标签页时,编译器给出了这些错误:
Compiler Error:
WindowPointer' - 函数未定义 MainPanel.mqh 233 27
m_overview_title_label' - 参数转换不允许 MainPanel.mqh 235 43
ComboBox-Listview 中的元素列表?
谢谢!
我也遇到过同样的问题,我是通过创建一个 include 文件并编写我的标签类来解决这个问题的。您必须在 Include\EasyAndFastGUI\Controls\MyLabel.mqh 中创建该文件。
这段代码是
然后像这样从 MyLabel 类中创建对象并使用它:
//-- 标签 MyLabel m_overview_title_label;然后