从头开始创建一个图形库 - 页 14 1...789101112131415 新评论 Реter Konow 2020.10.12 21:58 #131 尝试做一个完整的窗口。就像一个Windows表格。你可以在没有动态的情况下做到这一点,但既然你已经部分实现了,我想你会得到一个类似Windows的 "橡胶 "窗口。 Aliaksandr Hryshyn 2020.10.12 22:04 #132 Реter Konow: 尝试做一个完整的窗口。就像一个Windows表格。你可以在没有动态的情况下做到这一点,但由于你已经部分实现了它,我想你会得到一个类似于Windows的 "橡胶 "窗口。 最难的部分将是画纽扣:)) Реter Konow 2020.10.12 22:06 #133 Aliaksandr Hryshyn: 最难的部分将是画纽扣:)) 是的,我想这是最难的部分,因为没有任何。))))。 Aliaksandr Hryshyn 2020.10.13 15:16 #134 卷轴是单独制作的,它们可以应用于特定的窗口配置,其余的(事件、对所需属性的改变)将自动完成。连接它们是非常简单的。 _scroll_v.Create(_main,_grid_cols,true,30); _scroll_h.Create(_main,_grid_cols,false,30); 关于 创建表格的 难度: 引擎的结果非常好,所以用它创建一个表格并不难。 //+------------------------------------------------------------------+ //| V_grid.mqh | //| Aliaksandr Hryshyn | //| https://www.mql5.com/ru/users/greshnik1 | //+------------------------------------------------------------------+ #property copyright "Aliaksandr Hryshyn" #property link "https://www.mql5.com/ru/users/greshnik1" #include <Greshnik\\\Windows_engine\\Windows_engine_base.mqh> #include <Greshnik\\\Windows_engine\\V_objects\\V_scrollbar.mqh> enum eG_property { gp_=0, }; //Таблица class V_grid { int _cols;//Количество столбцов int _rows;//Количество строк int _cell_width;//Ширина клетки int _cell_height;//Высота клетки int _scroll_width;//Ширина полосы прокрутки int _size_caption;//Размер заголовков int _size_fixing_col;//Размер фиксированного столбца bool _is_captions;//Наличие заголовков bool _is_cols_fixing;//Наличие первого фиксированного столбца bool _is_scroll_bar_v;//Наличие вертикальной полосы прокрутки bool _is_scroll_bar_h;//Наличие горизонтальной полосы прокрутки cV_object_base *_main;//Основное окно cV_object_base *_grid_view;//Окно отображения сетки V_scrollbar _scroll_v;//Вертикалдьная прокрутка V_scrollbar _scroll_h;//Горизонтальная прокрутка cV_object_base *_caption_v;//Окно отображения заголовков cV_object_base *_caption;//Окно с заголовками cV_object_base *_col_fixing_v;//Окно отображения фиксированного столбца cV_object_base *_col_fixing;//Фиксированный столбец cV_object_base *_grid_cols;//Столбцы.Отсюда брать массивы столбцов //События, которые влияют на вертикальную прокрутку class Events_scroll_v_change: public iE_event_handler { public: V_grid *_v_grid; void On_event(sEvent &event); }; Events_scroll_v_change scroll_v_change; //События, которые влияют на горизонтальную прокрутку class Events_scroll_h_change: public iE_event_handler { public: V_grid *_v_grid; void On_event(sEvent &event); }; Events_scroll_h_change scroll_h_change; //События перемещения сетки class Events_grid: public iE_event_handler { public: V_grid *_v_grid; void On_event(sEvent &event); }; Events_grid events_grid; public: //Создание таблицы bool Create( cV_object_base &parent_object, string name=NULL ); //Возвращает указатель на основной объект cV_object_base* Get_main_v_object(); //Изменение основных свойств таблицы void Set_property( eG_property grid_property, long property_value ); //Получение значения свойства long Get_property( eG_property grid_property );//При ошибке возвращает LONG_MAX //Поучение объекта ячейки таблицы cV_object_base* Get_cell_object( int pos_x,//Индекс столбца int pos_y//Индекс строки );//Возвращает объект ячейки или NULL при ошибке //Получение объекта столбца таблицы cV_object_base* Get_col_object( int pos_x//Индекс столбца );//Возвращает объект ячейки или NULL при ошибке }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ cV_object_base* V_grid::Get_col_object(int pos_x) { if((pos_x>=_grid_cols.Get_property(vop_s_childs_count).data_long)||(pos_x<0)) { cLng_add_user(cV_object_base::lng_id,21,string(pos_x),""); return NULL; } return _grid_cols.Get_child(pos_x); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ cV_object_base* V_grid::Get_cell_object(int pos_x,int pos_y) { if((pos_x>=_grid_cols.Get_property(vop_s_childs_count).data_long)||(pos_x<0)) { cLng_add_user(cV_object_base::lng_id,21,string(pos_x),""); return NULL; } cV_object_base *obj=_grid_cols.Get_child(pos_x); if((pos_y>=obj.Get_property(vop_s_childs_count).data_long)||(pos_y<0)) { cLng_add_user(cV_object_base::lng_id,21,string(pos_x),""); return NULL; } return obj.Get_child(pos_y); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ long V_grid::Get_property(eG_property grid_property) { switch(grid_property) { } return 0; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void V_grid::Set_property(eG_property grid_property,long property_value) { switch(grid_property) { } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void V_grid::Events_grid::On_event(sEvent &event) { switch(event.id) { case CHARTEVENT_ON_PROPERTY_CHANGED_: { switch(eV_object_property(event.lparam)) { case vop_position_x: { _v_grid._caption.Set_property(vop_position_x,event.dparam); break; } case vop_position_y: { _v_grid._col_fixing.Set_property(vop_position_y,event.dparam); break; } } break; } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void V_grid::Events_scroll_v_change::On_event(sEvent &event) { } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void V_grid::Events_scroll_h_change::On_event(sEvent &event) { } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool V_grid::Create(cV_object_base &parent_object,string name=NULL) { if(CheckPointer(_main)) { cLng_add_user(cV_object_base::lng_id,20,"V_grid",""); return false; } scroll_v_change._v_grid=GetPointer(this); scroll_h_change._v_grid=GetPointer(this); events_grid._v_grid=GetPointer(this); _cols=5; _rows=5; _cell_width=400; _cell_height=400; _scroll_width=20; _size_caption=30; _size_fixing_col=30; _is_captions=true; _is_cols_fixing=true; _is_scroll_bar_v=true; _is_scroll_bar_h=true; int width=850; int height=850; _main=new cV_object_base(); _main.Set_property_info(vop_position_x,20); _main.Set_property_info(vop_position_y,20); _main.Set_property_info(vop_size_x,width); _main.Set_property_info(vop_size_y,height); _main.Create(parent_object,name); _caption_v=new cV_object_base(); if(_is_cols_fixing) { _caption_v.Set_property_info(vop_position_x,_size_fixing_col); if(_is_scroll_bar_v) { _caption_v.Set_property_info(vop_size_x,width-_scroll_width-_size_fixing_col); } else { _caption_v.Set_property_info(vop_size_x,width-_cell_width); } } else { _caption_v.Set_property_info(vop_position_x,0); if(_is_scroll_bar_v) { _caption_v.Set_property_info(vop_size_x,width-_scroll_width); } else { _caption_v.Set_property_info(vop_size_x,width); } } _caption_v.Set_property_info(vop_position_y,0); _caption_v.Set_property_info(vop_size_y,_size_caption); _caption_v.Set_property_info(vop_is_hidden,!_is_captions); _caption_v.Set_property_info(vop_is_anchor_left,true); _caption_v.Set_property_info(vop_is_anchor_right,true); _caption_v.Create(_main); _caption_v.Add_event_handler(GetPointer(scroll_v_change)); _caption_v.Set_property_change_event(vop_is_hidden); _caption=new cV_object_base(); _caption.Set_property_info(vop_position_x,0); _caption.Set_property_info(vop_position_y,0); _caption.Set_property_info(vop_size_x,_cols*_cell_width); _caption.Set_property_info(vop_size_y,_size_caption); _caption.Set_property_info(vop_is_canvas,true); _caption.Create(_caption_v); for(int i1=0; i1<_cols; i1++) { cV_object_base *col_caption=new cV_object_base(); col_caption.Set_property_info(vop_position_x,i1*_cell_width); col_caption.Set_property_info(vop_position_y,0); col_caption.Set_property_info(vop_size_x,_cell_width); col_caption.Set_property_info(vop_size_y,_size_caption); col_caption.Set_property_info(vop_color_back,clrWhiteSmoke); col_caption.Set_property_info(vop_color_borders,clrGray); col_caption.Set_property_info(vop_border_type,long(BORDER_FLAT)); col_caption.Set_property_info(vop_text_anchor,TA_CENTER|TA_VCENTER); col_caption.Set_property_info(vop_border_line_width,1); col_caption.Set_property_info(vop_text,"Col "+string(i1)); col_caption.Set_property_info(vop_is_canvas_from_parent,true); col_caption.Create(_caption); } _col_fixing_v=new cV_object_base(); _col_fixing_v.Set_property_info(vop_position_x,0); if(_is_captions) { _col_fixing_v.Set_property_info(vop_position_y,_size_caption); if(_is_scroll_bar_h) { _col_fixing_v.Set_property_info(vop_size_y,height-_size_caption-_scroll_width); } else { _col_fixing_v.Set_property_info(vop_size_y,height-_size_caption); } } else { _col_fixing_v.Set_property_info(vop_position_y,0); if(_is_scroll_bar_h) { _col_fixing_v.Set_property_info(vop_size_y,height-_scroll_width); } else { _col_fixing_v.Set_property_info(vop_size_y,height); } } _col_fixing_v.Set_property_info(vop_size_x,_size_fixing_col); _col_fixing_v.Set_property_info(vop_is_anchor_top,true); _col_fixing_v.Set_property_info(vop_is_anchor_bottom,true); _col_fixing_v.Set_property_info(vop_is_hidden,!_is_cols_fixing); _col_fixing_v.Create(_main); _col_fixing=new cV_object_base(); _col_fixing.Set_property_info(vop_position_x,0); _col_fixing.Set_property_info(vop_position_y,0); _col_fixing.Set_property_info(vop_size_x,_size_fixing_col); _col_fixing.Set_property_info(vop_size_y,_rows*_cell_height); _col_fixing.Set_property_info(vop_is_canvas,true); _col_fixing.Create(_col_fixing_v); for(int i1=0; i1<_rows; i1++) { cV_object_base *cell_fixing=new cV_object_base(); cell_fixing.Set_property_info(vop_position_x,0); cell_fixing.Set_property_info(vop_position_y,i1*_cell_height); cell_fixing.Set_property_info(vop_size_x,_size_fixing_col); cell_fixing.Set_property_info(vop_size_y,_cell_height); cell_fixing.Set_property_info(vop_color_back,clrWhiteSmoke); cell_fixing.Set_property_info(vop_color_borders,clrGray); cell_fixing.Set_property_info(vop_border_type,long(BORDER_FLAT)); cell_fixing.Set_property_info(vop_text_anchor,TA_CENTER|TA_VCENTER); cell_fixing.Set_property_info(vop_border_line_width,1); cell_fixing.Set_property_info(vop_text,string(i1)); cell_fixing.Set_property_info(vop_is_canvas_from_parent,true); cell_fixing.Create(_col_fixing); } _grid_view=new cV_object_base(); if(_is_cols_fixing) { _grid_view.Set_property_info(vop_position_x,_size_fixing_col); if(_is_scroll_bar_v) { _grid_view.Set_property_info(vop_size_x,width-_size_fixing_col-_scroll_width); } else { _grid_view.Set_property_info(vop_size_x,width-_size_fixing_col); } } else { _grid_view.Set_property_info(vop_position_x,0); if(_is_scroll_bar_v) { _grid_view.Set_property_info(vop_size_x,width-_scroll_width); } else { _grid_view.Set_property_info(vop_size_x,width); } } if(_is_captions) { _grid_view.Set_property_info(vop_position_y,_size_caption); if(_is_scroll_bar_h) { _grid_view.Set_property_info(vop_size_y,height-_size_caption-_scroll_width); } else { _grid_view.Set_property_info(vop_size_y,height-_size_caption); } } else { _grid_view.Set_property_info(vop_position_y,0); if(_is_scroll_bar_h) { _grid_view.Set_property_info(vop_size_y,height-_scroll_width); } else { _grid_view.Set_property_info(vop_size_y,height); } } _grid_view.Set_property_info(vop_is_anchor_left,true); _grid_view.Set_property_info(vop_is_anchor_right,true); _grid_view.Set_property_info(vop_is_anchor_top,true); _grid_view.Set_property_info(vop_is_anchor_bottom,true); _grid_view.Create(_main); _grid_view.Add_event_handler(GetPointer(scroll_v_change)); _grid_view.Set_property_change_event(vop_size_y); _grid_cols=new cV_object_base(); _grid_cols.Set_property_info(vop_position_x,0); _grid_cols.Set_property_info(vop_position_y,0); _grid_cols.Set_property_info(vop_size_x,_cols*_cell_width); _grid_cols.Set_property_info(vop_size_y,_rows*_cell_height); _grid_cols.Create(_grid_view); _grid_cols.Add_event_handler(GetPointer(events_grid)); _grid_cols.Set_property_change_event(vop_position_x); _grid_cols.Set_property_change_event(vop_position_y); _scroll_v.Create(_main,_grid_cols,true,30); _scroll_h.Create(_main,_grid_cols,false,30); for(int i1=0; i1<_cols; i1++) { cV_object_base *col=new cV_object_base(); col.Set_property_info(vop_position_x,i1*_cell_width); col.Set_property_info(vop_position_y,0); col.Set_property_info(vop_size_x,_cell_width); col.Set_property_info(vop_size_y,_rows*_cell_height); col.Create(_grid_cols); for(int i2=0; i2<_rows; i2++) { cV_object_base *cell=new cV_object_base(); cell.Set_property_info(vop_position_x,0); cell.Set_property_info(vop_position_y,i2*_cell_height); cell.Set_property_info(vop_size_x,_cell_width); cell.Set_property_info(vop_size_y,_cell_height); cell.Set_property_info(vop_color_back,clrSlateGray); cell.Set_property_info(vop_color_text,clrBlack); cell.Set_property_info(vop_text_anchor,TA_CENTER|TA_VCENTER); cell.Set_property_info(vop_text,string(i1*_rows+i2)); cell.Set_property_info(vop_color_back_mouse_moving,clrDimGray); cell.Create(col); } } return true; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ cV_object_base* V_grid::Get_main_v_object() { return GetPointer(_main); } //+------------------------------------------------------------------+ Aliaksandr Hryshyn 2020.10.13 15:18 #135 如果有人能忙着制作一个 用于创建控件的图形库,那就更好了。 Aliaksandr Hryshyn 2020.10.13 16:51 #136 Реter Konow:是的,我想这是最难的部分,因为没有任何。))))。 为你的显示器提供一个演示。对于右下角,你可以调整表格的大小 附加的文件: Test_v_grid.ex5 502 kb Реter Konow 2020.10.14 11:44 #137 Aliaksandr Hryshyn:为你的显示器提供一个演示。对于右下角,你可以调整表格的大小 谢谢你为我的显示器提供的演示。 就这样。 最初实施的是 "橡胶 "窗口机制。 但在调整大小的时候。 窗户不应该闪烁。 应该有8个用于调整大小的窗口把手--每边和每个角落都有。 事实上,窗口作为一个实体并没有形成。目前还没有诚信。 根据想法,你应该来一个类似的选择。 嗯,总的来说,你肯定做得很好!我没有想到。)))) 继续前进。 Maxim Kuznetsov 2020.10.14 12:09 #138 我想起来了! 我想起了这一切让我想起了什么......。 GVision(TVision的后代之一)的演示。 在大约93-95年,你可以在列宁斯基街的 "科技书屋 "书店买到上述的演示(*谁不知道--软件是以零售方式出售的)。 甚至还有一个单独的显示器,上面滚动着演示,你可以 "尝试"。它很酷--标志、按钮、检查/广播框和图形......。 但后来我买了一辆Zortec-C。一个沉重的盒子,里面有5卷文件和一些软盘:-) 好记性。 Aliaksandr Hryshyn 2020.10.14 15:41 #139 Реter Konow:谢谢你为我的显示器提供的演示。 就这样。 最初实施的是 "橡胶 "窗口机制。 但当你调整大小。 窗户不应该闪烁。 应该有8个用于调整大小的窗口把手--每边和每个角落都有。 事实上,窗口作为一个实体并没有形成。目前还没有诚信。 根据想法,你应该来一个类似的选择。 好吧,总的来说,你肯定做得很好!我没有想到。)))) 继续。 1.大量使用矩形和坎肩的动态,如果所有东西都在一个坎肩上,也许不会眨眼,平台已经有了限制,在一个坎肩上画所有东西是不可取的。也许如果只是为了在DirectX上一次性翻译... 2.我刚刚添加了一个小组件,实现了拉伸。而且没有完整性,只是组装的元素,也不一定是图形。 你没有想到什么?伸展?这对我来说就是这么简单。我为我的项目制作这些东西,我没有计划创建图形控件 库,尽管创建的基础非常好。 #include <Greshnik\\\Windows_engine\\Windows_engine_base.mqh> //Элемент, который будет изменять размер родительского окна перетаскиванием мышки //По умолчанию окошко будеи распологаться в правом нижнем углу class cV_resizer { cV_object_base *_main;//Основное окно class My_events: public iE_event_handler { public: cV_object_base *_e_my; void On_event(sEvent &event); }; My_events ev; public: //Создание таблицы bool Create( cV_object_base &parent_object, string name=NULL ); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void cV_resizer::My_events::On_event(sEvent &event) { if(event.id==CHARTEVENT_ON_PROPERTY_CHANGED_) { if(event.lparam==vop_position_x) { cV_object_base *par=_e_my.Get_parent(); long p=par.Get_property(vop_size_x).data_long; long pos=_e_my.Get_property(vop_position_x).data_long; long size=_e_my.Get_property(vop_size_x).data_long; long d=pos+size-p; par.Set_property(vop_size_x,p+d); _e_my.Set_property(vop_position_x,par.Get_property(vop_size_x).data_long-size); } else { cV_object_base *par=_e_my.Get_parent(); long p=par.Get_property(vop_size_y).data_long; long pos=_e_my.Get_property(vop_position_y).data_long; long size=_e_my.Get_property(vop_size_y).data_long; long d=pos+size-p; par.Set_property(vop_size_y,p+d); _e_my.Set_property(vop_position_y,par.Get_property(vop_size_y).data_long-size); } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool cV_resizer::Create(cV_object_base &parent_object,string name=NULL) { int width=20; int height=20; long width_p=parent_object.Get_property(vop_size_x).data_long; long heigth_p=parent_object.Get_property(vop_size_y).data_long; _main=new cV_object_base(); _main.Set_property_info(vop_size_x,width); _main.Set_property_info(vop_size_y,height); _main.Set_property_info(vop_position_x,width_p-width); _main.Set_property_info(vop_position_y,heigth_p-height); _main.Set_property_info(vop_is_movable,true); _main.Create(parent_object); _main.Add_event_handler(GetPointer(ev)); _main.Set_property_change_event(vop_position_x); _main.Set_property_change_event(vop_position_y); ev._e_my=GetPointer(_main); return true; } Реter Konow 2020.10.14 15:50 #140 Aliaksandr Hryshyn:1. 矩形和坎肩在动态中被大量使用,如果所有东西都在一个坎肩上,也许它不会眨眼,但已经有平台的限制,在一个坎肩上画所有东西是不可取的。也许如果只是为了在DirectX上一次性翻译...2.我刚刚添加了一个小组件,实现了拉伸。而且没有完整性,只是组装的元素,也不一定是图形。你没有想到什么?伸展?这对我来说就是这么简单。它的闪烁是因为你改变了整个画布的尺寸,这很耗费资源,但如果你在最大尺寸的画布上改变可见图像的区域,你就能摆脱这种不愉快的效果。也就是说,你事先创建一个显示器屏幕大小的kanvas,将图像连接到它(同样大小),然后 "裁剪 "它。而调整大小的功能只会定义画布的可见区域,而不是重新创建它。 1...789101112131415 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
尝试做一个完整的窗口。就像一个Windows表格。你可以在没有动态的情况下做到这一点,但由于你已经部分实现了它,我想你会得到一个类似于Windows的 "橡胶 "窗口。
最难的部分将是画纽扣:))
是的,我想这是最难的部分,因为没有任何。))))。
卷轴是单独制作的,它们可以应用于特定的窗口配置,其余的(事件、对所需属性的改变)将自动完成。连接它们是非常简单的。
关于 创建表格的 难度: 引擎的结果非常好,所以用它创建一个表格并不难。
是的,我想这是最难的部分,因为没有任何。))))。
为你的显示器提供一个演示。对于右下角,你可以调整表格的大小
为你的显示器提供一个演示。对于右下角,你可以调整表格的大小
谢谢你为我的显示器提供的演示。
就这样。
但在调整大小的时候。
根据想法,你应该来一个类似的选择。
嗯,总的来说,你肯定做得很好!我没有想到。))))
我想起来了!
我想起了这一切让我想起了什么......。
GVision(TVision的后代之一)的演示。
在大约93-95年,你可以在列宁斯基街的 "科技书屋 "书店买到上述的演示(*谁不知道--软件是以零售方式出售的)。
甚至还有一个单独的显示器,上面滚动着演示,你可以 "尝试"。它很酷--标志、按钮、检查/广播框和图形......。
但后来我买了一辆Zortec-C。一个沉重的盒子,里面有5卷文件和一些软盘:-)
好记性。
谢谢你为我的显示器提供的演示。
就这样。
但当你调整大小。
根据想法,你应该来一个类似的选择。
好吧,总的来说,你肯定做得很好!我没有想到。))))
1.大量使用矩形和坎肩的动态,如果所有东西都在一个坎肩上,也许不会眨眼,平台已经有了限制,在一个坎肩上画所有东西是不可取的。也许如果只是为了在DirectX上一次性翻译...
2.我刚刚添加了一个小组件,实现了拉伸。而且没有完整性,只是组装的元素,也不一定是图形。
你没有想到什么?伸展?这对我来说就是这么简单。我为我的项目制作这些东西,我没有计划创建图形控件 库,尽管创建的基础非常好。
1. 矩形和坎肩在动态中被大量使用,如果所有东西都在一个坎肩上,也许它不会眨眼,但已经有平台的限制,在一个坎肩上画所有东西是不可取的。也许如果只是为了在DirectX上一次性翻译...
2.我刚刚添加了一个小组件,实现了拉伸。而且没有完整性,只是组装的元素,也不一定是图形。
你没有想到什么?伸展?这对我来说就是这么简单。