从头开始创建一个图形库 - 页 5 123456789101112...15 新评论 Реter Konow 2020.08.27 20:42 #41 图书馆的进展情况如何? Alexandr Andreev 2020.08.28 17:15 #42 Реter Konow: 图书馆的进展情况如何? 一切都很好。 Aliaksandr Hryshyn 2020.08.28 17:47 #43 我还掌握了制作一个图形库的方法,只是有我需要的元素。该库的主要技巧是它的窗口引擎。 它不依赖于图形,你可以说虚拟窗口没有一个函数与图形一起工作,即使是绝对的窗口也能正常工作(事件、属性)。 影响窗口行为的一组属性,该窗口的附属属性和其他属性 cV_object_base::Init(my_handler); cV_object_rectangle *app_00=new cV_object_rectangle(); cV_object_rectangle *app_0=new cV_object_rectangle(); cV_object_rectangle *app_1=new cV_object_rectangle(); cV_object_label *lb1=new cV_object_label(); app_00.Create(cV_object_base::global_parent_object); app_00.Set_property(vop_size_x,800); app_00.Set_property(vop_size_y,500); app_00.Set_property(vop_color_back,clrDarkGreen); app_0.Create(app_00,"AAA"); app_00.Set_property(vop_is_position_fixing_parent_x,true); app_00.Set_property(vop_is_position_fixing_parent_y,true); app_1.Create(app_00); app_0.Set_property(vop_is_zorder_top_on_click,true); app_0.Set_property(vop_is_position_fixing_parent_x,true); app_0.Set_property(vop_is_position_fixing_parent_y,true); app_1.Set_property(vop_is_zorder_top_on_click,true); app_0.Set_property(vop_size_x,1000); app_0.Set_property(vop_size_y,300); app_0.Set_property(vop_position_x,100); app_0.Set_property(vop_position_y,100); app_0.Set_property(vop_color_back,clrDarkBlue); app_0.Set_property(vop_is_movable,true); app_0.Set_property(vop_is_selected_multi,false); lb1.Create(app_0,"E_hallo_world_E"); lb1.Set_property(vop_is_movable,true); lb1.Set_property(vop_color_back_selected,clrDarkTurquoise); lb1.Set_property(vop_is_change_color_back_on_select,true); lb1.Set_property(vop_is_zorder_top_on_click,true); app_1.Set_property(vop_size_x,300); app_1.Set_property(vop_size_y,500); app_1.Set_property(vop_position_x,200); app_1.Set_property(vop_position_y,200); app_1.Set_property(vop_is_movable,true); cV_object_rectangle *app_2; cV_object_rectangle *app_3; for(int i1=0; i1<4; i1++) { app_2=new cV_object_rectangle(); app_3=new cV_object_rectangle(); app_2.Create(app_0,ShortToString(ushort('A'+i1))); app_3.Create(app_1); app_2.Set_property(vop_size_x,100); app_2.Set_property(vop_size_y,75); app_3.Set_property(vop_size_x,75); app_3.Set_property(vop_size_y,100); app_2.Set_property(vop_position_x,i1*20); app_2.Set_property(vop_position_y,i1*40); app_3.Set_property(vop_position_x,i1*20); app_3.Set_property(vop_position_y,i1*40); app_2.Set_property(vop_color_back,clrDarkGray); app_3.Set_property(vop_color_back,clrLightGoldenrod); app_2.Set_property(vop_is_movable,true); app_2.Set_property(vop_is_zorder_top_on_click,true); app_3.Set_property(vop_is_movable,true); app_3.Set_property(vop_is_change_color_back_on_select,true); app_3.Set_property(vop_color_back_selected,clrRed); app_2.Set_property(vop_color_back_selected,clrDarkTurquoise); app_2.Set_property(vop_is_change_color_back_on_select,true); } app_3.Set_property(vop_moving_parent_index,1); app_3.Set_property(vop_position_x,150); app_3.Set_property(vop_size_y,150); app_2.Set_property(vop_moving_parent_index,2); app_2.Set_property(vop_position_x,150); app_2.Set_property(vop_size_y,150); app_2.Set_property(vop_color_borders,clrDarkTurquoise); app_3.Set_property(vop_color_borders,clrDarkTurquoise); app_2.Set_property(vop_is_change_color_back_on_mouse_move,true); app_3.Set_property(vop_is_change_color_back_on_mouse_move,true); app_2.Set_property(vop_is_change_color_borders_on_mouse_move,true); app_3.Set_property(vop_is_change_color_borders_on_mouse_move,true); app_3.Set_property(vop_is_selected,true); 作为图形,你可以同时使用标准的对象和画布,以及DirectX,无论你喜欢什么 引擎窗口是构建图形元素的基石。 使用不同的性能优化(排除不必要的图形系统函数调用,以及排除不可见框的绘制)。 在创建一个新的图形项目时很简单,既可以实现图形设计,又可以创建子图形项目/窗口结构。所有的事件和依赖属性的计算都将在引擎层面进行,它不区分自定义图形项目,只在基本窗口层面工作。 创建和删除标准OBJ_RECTANGLE_LABEL对象bool cV_object_rectangle::_Create_resource() { if(!ObjectCreate(0,visual_object_name,OBJ_RECTANGLE_LABEL,0,0,0)) { cLng_add_user(lng_id,8,EnumToString(OBJ_RECTANGLE_LABEL),""); return false; } return true; } bool cV_object_rectangle::_Delete_resource() { ObjectDelete(0,visual_object_name); return true; }这实现了一个改变标准OBJ_RECTANGLE_LABEL对象属性的方法,通过帮助和使用感兴趣的属性 。 bool cV_object_rectangle::_Set_property(eV_object_property property,sV_property_value &property_value) { _is_redraw_object=true; switch(property) { case vop_s_is_hidden: { if(property_value.data_long) { ObjectSetInteger(0,visual_object_name,OBJPROP_XSIZE,0); ObjectSetInteger(0,visual_object_name,OBJPROP_YSIZE,0); ObjectSetInteger(0,visual_object_name,OBJPROP_XDISTANCE,-20); ObjectSetInteger(0,visual_object_name,OBJPROP_YDISTANCE,-20); } else { ObjectSetInteger(0,visual_object_name,OBJPROP_XSIZE,_property_values[vop_s_size_real_x].data_long); ObjectSetInteger(0,visual_object_name,OBJPROP_YSIZE,_property_values[vop_s_size_real_y].data_long); ObjectSetInteger(0,visual_object_name,OBJPROP_XDISTANCE,_property_values[vop_s_position_real_x].data_long); ObjectSetInteger(0,visual_object_name,OBJPROP_YDISTANCE,_property_values[vop_s_position_real_y].data_long); } break; } case vop_s_color_back: { ObjectSetInteger(0,visual_object_name,OBJPROP_BGCOLOR,property_value.data_long); break; } case vop_border_type: { ObjectSetInteger(0,visual_object_name,OBJPROP_BORDER_TYPE,property_value.data_long); break; } case vop_s_color_borders: { ObjectSetInteger(0,visual_object_name,OBJPROP_COLOR,property_value.data_long); break; } case vop_s_position_real_x: { ObjectSetInteger(0,visual_object_name,OBJPROP_XDISTANCE,property_value.data_long); break; } case vop_s_position_real_y: { ObjectSetInteger(0,visual_object_name,OBJPROP_YDISTANCE,property_value.data_long); break; } case vop_s_size_real_x: { ObjectSetInteger(0,visual_object_name,OBJPROP_XSIZE,property_value.data_long); break; } case vop_s_size_real_y: { ObjectSetInteger(0,visual_object_name,OBJPROP_YSIZE,property_value.data_long); break; } case vop_font_size: { ObjectSetInteger(0,visual_object_name,OBJPROP_FONTSIZE,property_value.data_long); break; } case vop_line_width: { ObjectSetInteger(0,visual_object_name,OBJPROP_WIDTH,property_value.data_long); break; } default: { _is_redraw_object=false; } } return true; } 轻松处理事件 这是一个外部事件处理程序,感兴趣的对象(窗口/图形项目)的名称可以在创建它时指定 class My_handler:public iE_event_handler { void On_event(sEvent &event) { if(event.id==CHARTEVENT_CLICK_) { if( (event.sparam=="A")|| (event.sparam=="B")|| (event.sparam=="C")|| (event.sparam=="D")|| (event.sparam=="E_hallo_world_E") ) { sV_property_value v; cV_object_base *obj; obj=cV_object_base::Get_object_from_name(event.sparam); obj.Get_property(vop_is_selected,v); v.data_long=!v.data_long; obj.Set_property(vop_is_selected,v.data_long); } else if(event.sparam=="AAA") { sV_property_value v; cV_object_base *obj; obj=cV_object_base::Get_object_from_name("AAA"); obj.Get_property(vop_is_selected_multi,v); v.data_long=!v.data_long; obj.Set_property(vop_is_selected_multi,v.data_long); } else if(event.sparam=="vt_rectangle_4") { sV_property_value v; cV_object_base *obj; obj=cV_object_base::Get_object_from_name("AAA"); obj.Get_property(vop_position_x,v); v.data_long=v.data_long+5; obj.Set_property(vop_position_x,v.data_long); ulong ms=cV_object_base::Get_timer_msc(); if(ms!=ULONG_MAX) { Print(ms/1000.0," мс"); } } } } };文本标签是通过kanvas实现的,因为OBJ_LABEL对象的 宽度和高度不能改变,为此,当CHARTEVENT_ON_PAINT事件发生时,会进行渲染(需要重绘)。bool cV_object_label::_On_event(const sEvent &event) { if(event.id==CHARTEVENT_ON_PAINT) { color color_back=clrBlack; if(CheckPointer(_object_parent)) { color_back=color(_object_parent._property_values[vop_color_back].data_long); } int width=int(_property_values[vop_s_size_real_x].data_long); int height=int(_property_values[vop_s_size_real_y].data_long); int x=int(_property_values[vop_s_position_global_x].data_long-_property_values[vop_s_position_real_x].data_long); int y=int(_property_values[vop_s_position_global_y].data_long-_property_values[vop_s_position_real_y].data_long); _canvas.Resize(width,height); width=int(_property_values[vop_size_x].data_long); height=int(_property_values[vop_size_y].data_long); _canvas.Erase(ColorToARGB(color_back)); switch(int(_property_values[vop_text_anchor].data_long)) { case TA_CENTER: { x=x+(width-_canvas.TextWidth(_property_values[vop_text].data_string))/2; break; } case TA_RIGHT: { x=x+(width-_canvas.TextWidth(_property_values[vop_text].data_string)); break; } } _canvas.TextOut(x,y,_property_values[vop_text].data_string,ColorToARGB(color(_property_values[vop_s_color_back].data_long)));//); _canvas.Update(false); } return true; }渲染和更新的内容是自动确定的。在调用ChartRedraw()之前,这些属性被记录下来。没有导致图表被重绘的事件被跳过。void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { cV_object_base::On_chart_event(id,lparam,long(dparam),sparam); ulong ms=cV_object_base::Get_timer_msc(); if(ms!=ULONG_MAX) { Print(ms/1000.0," мс"); } }该演示在附件中,其中使用了上述来源。 附加的文件: Test_forms.ex5 221 kb Aliaksandr Hryshyn 2020.08.28 17:49 #44 该演示并没有显示所有可能的属性,只是显示了其中的一部分。 到目前为止,这仍是一项正在进行的工作。 Реter Konow 2020.08.28 18:31 #45 Aliaksandr Hryshyn:该演示并没有显示所有可能的属性,只是显示了其中的一部分。目前,这仍是一项正在进行的工作。 祝你发展顺利!:) Aliaksandr Hryshyn 2020.08.28 19:05 #46 Реter Konow:祝你发展顺利!:) 谢谢 :) Реter Konow 2020.08.29 19:16 #47 在一台有4GB内存和2个处理器核心的弱电脑上测试了MT5中3D图形的功能和潜力。 即使在编程暂停了很长时间后,它也能正常工作。但这东西很重,要创造出严肃的东西需要付出很多努力。 Алексей Тарабанов 2020.08.29 19:24 #48 它对赚钱有帮助吗? Roman 2020.08.29 19:38 #49 Реter Konow:在一台有4GB内存和2个处理器核心的弱小电脑上测试了MT5中3D图形的功能和潜力。即使在编程暂停了很长时间后,它也能正常工作。但是,这个东西很重,要想认真开发,需要付出很多努力。 对于HFT来说, 我认为3D将有助于对杯子的交易量和订单流进行图形化分析。 但我不知道如何解释这种信息。 Denis Sartakov 2020.08.29 19:41 #50 我的上帝!这一切是为了什么? 123456789101112...15 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
图书馆的进展情况如何?
一切都很好。
我还掌握了制作一个图形库的方法,只是有我需要的元素。
该库的主要技巧是它的窗口引擎。
创建和删除标准OBJ_RECTANGLE_LABEL对象
这实现了一个改变标准OBJ_RECTANGLE_LABEL对象属性的方法,通过帮助和使用感兴趣的属性
。
文本标签是通过kanvas实现的,因为OBJ_LABEL对象的 宽度和高度不能改变,为此,当CHARTEVENT_ON_PAINT事件发生时,会进行渲染(需要重绘)。
渲染和更新的内容是自动确定的。在调用ChartRedraw()之前,这些属性被记录下来。没有导致图表被重绘的事件被跳过。
该演示在附件中,其中使用了上述来源。
该演示并没有显示所有可能的属性,只是显示了其中的一部分。
到目前为止,这仍是一项正在进行的工作。
该演示并没有显示所有可能的属性,只是显示了其中的一部分。
目前,这仍是一项正在进行的工作。
祝你发展顺利!:)
祝你发展顺利!:)
谢谢 :)
在一台有4GB内存和2个处理器核心的弱电脑上测试了MT5中3D图形的功能和潜力。
即使在编程暂停了很长时间后,它也能正常工作。但这东西很重,要创造出严肃的东西需要付出很多努力。
在一台有4GB内存和2个处理器核心的弱小电脑上测试了MT5中3D图形的功能和潜力。
即使在编程暂停了很长时间后,它也能正常工作。但是,这个东西很重,要想认真开发,需要付出很多努力。
对于HFT来说, 我认为3D将有助于对杯子的交易量和订单流进行图形化分析。
但我不知道如何解释这种信息。
我的上帝!这一切是为了什么?