从头开始创建一个图形库 - 页 4 1234567891011...15 新评论 Alexandr Andreev 2020.03.11 10:38 #31 Реter Konow: 谁知道它为什么不起作用... 应该先画出图书馆的示意图,然后再编写代码。通常是这样做的。 在C++中工作 你为什么认为方案没有制定出来,有这个前提条件吗? Реter Konow 2020.03.11 10:40 #32 Alexandr Andreev: 在C++中工作 你为什么认为没有模式,是否有一个前提条件? 它在哪里?我在三页中没有看到它。 Alexandr Andreev 2020.03.11 10:45 #33 Реter Konow: 它在哪里?我在三页中没有看到它。 我在想做一个使用的基础,这将减少到最小的代码风格 New_Window<<<Window_Upper.Size; New_Window<<Window_Upper.Position; New_Window.Size<<0.5(大小自动变成上面的一半); ... 而这一类已经考虑到了从小十字的位置到更高的窗口(底座)的关系。 看起来不会很顺利......它的发生。 Реter Konow 2020.03.11 10:49 #34 Alexandr Andreev: 我在想做一个使用的基础,这将减少到最小的代码风格 New_Window<<<Window_Upper.Size; New_Window<<Window_Upper.Position; New_Window.Size<<0.5(大小自动变成上面的一半); . 而这一类已经考虑到了从小十字的位置到较高窗口的关系。 Ehhh, heh, heh...."我们建一个房子要花多少钱,我们会画出来,我们会住......"我自己也有同样的做法。只是我用多年的辛勤工作来偿还。 Реter Konow 2020.03.11 11:53 #35 Алексей Барбашин: ... 我已经多次描述了我在标准库 和Anatoly的库中看到的 "缺陷"。 在我看来,这两个库都有一个明显的缺点: 界面是建立在离散的图表对象上的,也就是说,界面中的控件越多,图表本身的孤立对象就越多。一方面,这本身不是一个问题,但另一方面,这也是拖放对话框的一个问题,因为拖放的不是一个 "带元素的表单 "对象,而是许多不同的元素。而这就会消耗额外的资源。 阿纳托利的图书馆非常别致,但它的组成很复杂,很难整合到主程序中。而标准库在控件本身上是有限的,尽管在我看来原始架构是非常好的。 事实上,最好的解决方案是Petr Konov试图做的:带有GUI代码生成的GUI生成器,但带有扩展的事件模型,所以当与主程序集成时,你不必挖掘巨大的GUI代码(类似于MVVM),当然还有用户可以自己扩展的对象。 当然,这是对图形库问题的一个非常简化的看法。这不是关于拖放表单和缺乏kanvas处理,这限制了GUI的可能性和功能。底线是,MT-对象的属性很少,而库处理程序没有充分发展 到可以管理所绘制的元素并支持其所有不同的能力。MT对象的复杂性和库的控制功能并没有达到kanvas要求的最低水平。 采用这些库并为kanvas重写,意味着将它们提高到一个根本性的新水平,这在先验上是不容易和简单的。 ZS.Anatoly在他的图书馆里开始了画布之路,并且是第一个在MKL中创建绘制表格的人。然而,构建它们的方法并不完善,因为细胞是半独立的元素,单独处理每个细胞有困难。 我记得过渡期花了阿纳托利多少钱,花了多长时间。 Alexandr Andreev 2020.03.11 16:02 #36 它或多或少是这样的 #define TEMPLATE(T) template<typename T> #define TEMPLATE2(T1,T2) template<typename T1, typename T2> #define TEMPL(T) TEMPLATE(T) #define TEMPL1(T) TEMPLATE(T) #define TEMPL2(T,T1) TEMPLATE2(T,T1) //whats TD (template define)? because TT is busy //почемуто этот код в шаблонах на мкл не хочет компилироваться поэтому через дефайн - это Плохо надо бы через шаблоны как то придумать.... привет метаквотам #define TD1 int #define TD2 double #define EMPY -1 #define GET this.operator>> #define SET this.operator<< class CCoordD; class CSizeD; class CCoordBaseD //полностью внутрений класс { private: #define ME CCoordBaseD TEMPL1(T) bool Chek(T *a) {return CheckPointer(a)!=POINTER_INVALID;} TEMPL1(T) bool Chek(T a) {return a!=(T)EMPY;} TD1 Error() {Print(__FUNCTION__," ",__LINE__," POINTER_INVALID size"); int a[]; a[0]=0; return (TD1)EMPY;};//wtf??? =P CRASH Error TD1 GetA() {return c.GetA()+ar;} TD1 GetP() {return c.Result() + size.GetP()*(TD1)pr;} public: ME() {Init();} ME(TD1 a) {Init(a);} ME(TD1 a,CCoordD &b) {Init(a,b);} ME(TD1 a,CCoordD &b,CSizeD &x) {Init(a,b,x);} ME(TD2 a,CSizeD &b) {Init(a,b);} ME(TD2 a,CCoordD &b,CSizeD &x) {Init(a,b,x);} CCoordD *c;//one coord CSizeD *size;//size TD1 ar; TD2 pr;//percent проценты void Init() {ar=(TD1)EMPY; pr=(TD2)EMPY; } TD1 Result() {return Chek(ar)?Chek(c)?GetA():ar:Chek(pr)?Chek(size)?GetP():Error():(TD1)EMPY;} ME *GetMe() {return &this;} ME *GetCoorBase() {return c;} ME *GetSizeBase() {return size;} CCoordD *GetCoor() {return c;} CSizeD *GetSize() {return size;} void Init(TD1 a) {Init(); SET(a);} void Init(TD1 a,CCoordD &b) {Init(); SET(a); SET(b);} void Init(TD1 a,CCoordD &b,CSizeD &x) {Init(); SET(a); SET(b); SET(x);} void Init(TD1 a,CSizeD &b,CCoordD &x) {Init(); SET(a); SET(b); SET(x);} // void Init(TD2 p) {Init(); pr=p_;} void Init(TD2 a,CSizeD &b) {Init(); SET(a); SET(b);} void Init(TD2 a,CCoordD &b,CSizeD &x) {Init(); SET(a); SET(b); SET(x);} void Init(TD2 a,CSizeD &b,CCoordD &x) {Init(); SET(a); SET(b); SET(x);} void operator >> (TD1 a) {a=ar;} void operator >> (TD2 a) {a=pr;} void operator >> (CCoordD &a) {a=GetPointer(c);} void operator >> (CSizeD &s) {s=GetPointer(size);} void operator << (TD1 a) {ar=a;} void operator << (TD2 a) {pr=a;} void operator << (CCoordD &a) {c=GetPointer(a);} void operator << (CSizeD &s) {size=GetPointer(s);} void operator << (ME &a) {a>>c; a>>ar; a>>pr; a>>size;} void operator = (CCoordD &a) {SET(a);} void operator = (CSizeD &a) {SET(a);} void operator = (ME &a) {SET(a);} TD1 operator ~ () {return Result();} #undef ME #undef GET #undef SET }; class CSizeD : public CCoordBaseD { public: CSizeD(){}; }; class CCoordD : public CCoordBaseD { public: CCoordD(){}; }; class CCoord; class CTX {public:CTX(){}}; class CTY {public:CTY(){}}; class CTZ {public:CTZ(){}}; TEMPL(T) class CCoordA : public T { public: CCoordD ar; CSizeD size; CCoordA() {}; CCoordA(TD1 a1,TD1 a2=(TD1)0) {Init(a1,a2);} CCoordA(TD1 a1,CCoordD &c1, CSizeD &c2,TD1 a2) {Init(a1,c1,c2,a2);} CCoordA(TD1 a1,CCoordD &c1, CSizeD &c2,TD2 a2=(TD2)1) {Init(a1,c1,c2,a2);} CCoordA(TD2 a1,CCoordD &c1, CSizeD &c2,TD1 a2) {Init(a1,c1,c2,a2);} CCoordA(TD2 a1,CCoordD &c1, CSizeD &c2,TD2 a2=(TD2)1) {Init(a1,c1,c2,a2);} void Init() {} void Init(TD1 a1,TD1 a2=(TD1)0) {ar.Init(a1); size.Init(a2);} void Init(TD1 a1,CCoordD &c1, CSizeD &c2,TD1 a2) {ar.Init(a1,c1,c2); size.Init(a2,c1,c2);} void Init(TD1 a1,CCoordD &c1, CSizeD &c2,TD2 a2=(TD2)1) {ar.Init(a1,c1,c2); size.Init(a2,c1,c2);} void Init(TD2 a1,CCoordD &c1, CSizeD &c2,TD1 a2) {ar.Init(a1,c1,c2); size.Init(a2,c1,c2);} void Init(TD2 a1,CCoordD &c1, CSizeD &c2,TD2 a2=(TD2)1) {ar.Init(a1,c1,c2); size.Init(a2,c1,c2);} void operator <<(CSizeD &a) {return ;} void operator <<(CCoordD &a) {return ;} bool Chek(int px) {return (px-=(int)~ar) < 0 && px<(int)~size;} }; class CCoord { public: CCoordA<CTX> X; CCoordA<CTY> Y; CCoord () {} void operator >> (CCoordA<CTX> &a) {a=GetPointer(X);} void operator >> (CCoordA<CTY> &a) {a=GetPointer(Y);} void operator << (CCoord &a) {a>>X; a>>Y;} bool MouseOn(CMouse &mouse)//px { return X.Chek(mouse.X) && Y.Chek(mouse.Y); } }; CCoord Pro1; void Func() { TD1 bi;//buf int TD1 bd;//buf double CCoord general;//создали класс координат некого объекта - к примеру окна дженерал general.X.Init((int)0,(int)1000); //установили размер general.Y.Init((int)0,(int)1000); CCoord next;//создали класс координат следующего окна next<<general;//сделали его зависимым от главного окна next.X.ar<<(double)0.25;//старт по оси Х 25%, если значение типа дабл автоматически считается процент next.X.size<<(double)0.5;//размер окна равен 50% от главного. } #undef TD1 #undef TD2 Alexandr Andreev 2020.03.11 16:03 #37 这就是坐标类的结束。我甚至不知道接下来是什么。 不过我认为我们应该增加定位。 以下、中、左、上的风格。cent.....。 Aliaksandr Hryshyn 2020.03.11 19:52 #38 Alexandr Andreev: 情况是这样的。 #define TEMPLATE(T) template<typename T> #define TEMPLATE2(T1,T2) template<typename T1, typename T2> #define TEMPL(T) TEMPLATE(T) #define TEMPL1(T) TEMPLATE(T) #define TEMPL2(T,T1) TEMPLATE2(T,T1) 你还忘了这个。 #define TE(T) TEMPL(T) #define TE1(T) TEMPL1(T) #define TE2(T,T1) TEMPL2(T,T1) Aliaksandr Hryshyn 2020.03.11 19:56 #39 Alexandr Andreev: 情况是这样的。 #define TD1 int #define TD2 double 而这正是所缺少的。 #define TD3 bool #define TD4 void Alexandr Andreev 2020.03.12 06:13 #40 Aliaksandr Hryshyn: 而这正是所缺少的。 我想使用模板,但它们不能编译,上一页的简化例子 而且也不确定它是否会是int而不是某个枚举,然后你就不想纠正代码了 为什么我们要在这里使用一个 "布尔"? 理想情况下,它应该是这样的 enum EPX{}//px enum EPR{}//процент #define TD1 EPX #define TD2 EPR 而且没有TD3(事实上整个类是为两个值写的)。为什么我调用TD也写在代码中 1234567891011...15 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
谁知道它为什么不起作用...
在C++中工作
你为什么认为方案没有制定出来,有这个前提条件吗?在C++中工作
你为什么认为没有模式,是否有一个前提条件?它在哪里?我在三页中没有看到它。
我在想做一个使用的基础,这将减少到最小的代码风格 New_Window<<<Window_Upper.Size; New_Window<<Window_Upper.Position; New_Window.Size<<0.5(大小自动变成上面的一半); ...
而这一类已经考虑到了从小十字的位置到更高的窗口(底座)的关系。
看起来不会很顺利......它的发生。我在想做一个使用的基础,这将减少到最小的代码风格 New_Window<<<Window_Upper.Size; New_Window<<Window_Upper.Position; New_Window.Size<<0.5(大小自动变成上面的一半); .
而这一类已经考虑到了从小十字的位置到较高窗口的关系。
...
我已经多次描述了我在标准库 和Anatoly的库中看到的 "缺陷"。
在我看来,这两个库都有一个明显的缺点: 界面是建立在离散的图表对象上的,也就是说,界面中的控件越多,图表本身的孤立对象就越多。一方面,这本身不是一个问题,但另一方面,这也是拖放对话框的一个问题,因为拖放的不是一个 "带元素的表单 "对象,而是许多不同的元素。而这就会消耗额外的资源。
阿纳托利的图书馆非常别致,但它的组成很复杂,很难整合到主程序中。而标准库在控件本身上是有限的,尽管在我看来原始架构是非常好的。
事实上,最好的解决方案是Petr Konov试图做的:带有GUI代码生成的GUI生成器,但带有扩展的事件模型,所以当与主程序集成时,你不必挖掘巨大的GUI代码(类似于MVVM),当然还有用户可以自己扩展的对象。
当然,这是对图形库问题的一个非常简化的看法。这不是关于拖放表单和缺乏kanvas处理,这限制了GUI的可能性和功能。底线是,MT-对象的属性很少,而库处理程序没有充分发展 到可以管理所绘制的元素并支持其所有不同的能力。MT对象的复杂性和库的控制功能并没有达到kanvas要求的最低水平。
采用这些库并为kanvas重写,意味着将它们提高到一个根本性的新水平,这在先验上是不容易和简单的。
ZS.Anatoly在他的图书馆里开始了画布之路,并且是第一个在MKL中创建绘制表格的人。然而,构建它们的方法并不完善,因为细胞是半独立的元素,单独处理每个细胞有困难。
我记得过渡期花了阿纳托利多少钱,花了多长时间。
它或多或少是这样的
这就是坐标类的结束。我甚至不知道接下来是什么。
不过我认为我们应该增加定位。
以下、中、左、上的风格。cent.....。
情况是这样的。
你还忘了这个。
情况是这样的。
而这正是所缺少的。
而这正是所缺少的。
我想使用模板,但它们不能编译,上一页的简化例子
而且也不确定它是否会是int而不是某个枚举,然后你就不想纠正代码了
为什么我们要在这里使用一个 "布尔"?
理想情况下,它应该是这样的
而且没有TD3(事实上整个类是为两个值写的)。为什么我调用TD也写在代码中