从头开始创建一个图形库 - 页 4

 
Реter Konow:
谁知道它为什么不起作用...

应该先画出图书馆的示意图,然后再编写代码。通常是这样做的。

在C++中工作

你为什么认为方案没有制定出来,有这个前提条件吗?
 
Alexandr Andreev:

在C++中工作

你为什么认为没有模式,是否有一个前提条件?
它在哪里?我在三页中没有看到它。
 
Реter Konow:
它在哪里?我在三页中没有看到它。

我在想做一个使用的基础,这将减少到最小的代码风格 New_Window<<<Window_Upper.Size; New_Window<<Window_Upper.Position; New_Window.Size<<0.5(大小自动变成上面的一半); ...

而这一类已经考虑到了从小十字的位置到更高的窗口(底座)的关系。

看起来不会很顺利......它的发生。
 
Alexandr Andreev:

我在想做一个使用的基础,这将减少到最小的代码风格 New_Window<<<Window_Upper.Size; New_Window<<Window_Upper.Position; New_Window.Size<<0.5(大小自动变成上面的一半); .

而这一类已经考虑到了从小十字的位置到较高窗口的关系。

Ehhh, heh, heh...."我们建一个房子要花多少钱,我们会画出来,我们会住......"

我自己也有同样的做法。只是我用多年的辛勤工作来偿还。
 
Алексей Барбашин:

...

我已经多次描述了我在标准库 和Anatoly的库中看到的 "缺陷"。

在我看来,这两个库都有一个明显的缺点: 界面是建立在离散的图表对象上的,也就是说,界面中的控件越多,图表本身的孤立对象就越多一方面,这本身不是一个问题,但另一方面,这也是拖放对话框的一个问题,因为拖放的不是一个 "带元素的表单 "对象,而是许多不同的元素。而这就会消耗额外的资源。

阿纳托利的图书馆非常别致,但它的组成很复杂,很难整合到主程序中。而标准库在控件本身上是有限的,尽管在我看来原始架构是非常好的。

事实上,最好的解决方案是Petr Konov试图做的:带有GUI代码生成的GUI生成器,但带有扩展的事件模型,所以当与主程序集成时,你不必挖掘巨大的GUI代码(类似于MVVM),当然还有用户可以自己扩展的对象。

当然,这是对图形库问题的一个非常简化的看法。这不是关于拖放表单和缺乏kanvas处理,这限制了GUI的可能性和功能。底线是,MT-对象的属性很少,而库处理程序没有充分发展 到可以管理所绘制的元素并支持其所有不同的能力。MT对象的复杂性和库的控制功能并没有达到kanvas要求的最低水平。

采用这些库并为kanvas重写,意味着将它们提高到一个根本性的新水平,这在先验上是不容易和简单的。


ZS.Anatoly在他的图书馆里开始了画布之路,并且是第一个在MKL中创建绘制表格的人。然而,构建它们的方法并不完善,因为细胞是半独立的元素,单独处理每个细胞有困难。

我记得过渡期花了阿纳托利多少钱,花了多长时间。

 

它或多或少是这样的

#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
 
 

这就是坐标类的结束。我甚至不知道接下来是什么。

不过我认为我们应该增加定位。

以下、中、左、上的风格。cent.....。

 
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)
 
Alexandr Andreev:

情况是这样的。

#define  TD1 int
#define  TD2 double 

而这正是所缺少的。

#define  TD3 bool
#define  TD4
 void 
 
Aliaksandr Hryshyn:

而这正是所缺少的。

我想使用模板,但它们不能编译,上一页的简化例子

而且也不确定它是否会是int而不是某个枚举,然后你就不想纠正代码了

为什么我们要在这里使用一个 "布尔"?

理想情况下,它应该是这样的

enum EPX{}//px
enum EPR{}//процент
#define  TD1 EPX
#define  TD2 EPR

而且没有TD3(事实上整个类是为两个值写的)。为什么我调用TD也写在代码中