Sıfırdan bir grafik kitaplığı oluşturma - sayfa 4

 
Реter Konow :
Kim bilir neden çalışmıyor...

Önce kütüphane şeması derlenmeli, ardından kodlar yazılmalıdır. Genellikle bunu yaparlar.

C++'da çalışır

Neden planın hazırlanmadığını anladılar, bunun için önkoşullar var mıydı ???
 
Alexandr Andreev :

C++'da çalışır

Neden planın hazırlanmadığını anladılar, bunun için önkoşullar var mıydı ???
O nerede? Üç sayfada göremedim.
 
Реter Konow :
O nerede? Üç sayfada göremedim.

Minimum stil koduna indirgenecek olan kullanım temelini azaltmayı düşünüyordum New_window<<Window_Above.Size; New_Window<<Window_Above.Location; New_window.Size<<0.5 (boyut otomatik olarak ebeveynin yarısı olur); ...

Ayrıca, bu sınıfta, küçük bir haç konumundan eski pencereye (taban) olan ilişki zaten dikkate alınmıştır.

Kampanya sorunsuz sonuçlanmayacak ... iyi, oluyor
 
Alexandr Andreev :

Minimum stil koduna indirgenecek olan kullanım temelini azaltmayı düşünüyordum New_window<<Window_Above.Size; New_Window<<Window_Above.Location; New_window.Size<<0.5 (boyut otomatik olarak ebeveynin yarısı olur); ...

Ayrıca, bu sınıf, küçük bir haç konumundan eski pencereye olan ilişkiyi zaten dikkate almıştır.

Ehhh, heh, heh .... "Bir ev ne yapalım, çizelim, yaşayacağız...".

Ben de aynı yaklaşıma sahibim. Onun parasını sadece yıllarca süren sıkı çalışmayla ödüyorum.
 
Алексей Барбашин :

...

Eh, benim açımdan standart kütüphanede ve Anatoly kütüphanesinde gördüğüm "eksiklikleri" defalarca açıkladım.

Her iki kütüphanenin de bence önemli bir dezavantajı var: Arayüz, ayrık grafik nesneleri üzerine kuruludur, yani, arayüzde ne kadar fazla kontrol olursa, grafiğin kendisinde o kadar çok izole edilmiş nesne olur. Bir yandan, bu kendi içinde bir sorun gibi görünmüyor, ancak diğer yandan, sürüklenen tek bir "elemanlı form" nesnesi değil, birçok farklı eleman olduğu için diyalogları sürüklerken sorun yaratıyor. . Ve bu ek kaynaklar gerektirir.

Anatoly'nin kütüphanesi çok şık, ancak kompozisyon açısından karmaşık ve ana programa entegre edilmesi zor. Orijinal mimari bence çok iyi olsa da, standart kütüphane kontrollerde sınırlıdır.

Aslında, en iyi çözüm Petr Konov'un yapmaya çalıştığı şey olurdu: GUI kod oluşturma özelliğine sahip, ancak yalnızca genişletilmiş bir olay modeline sahip bir grafik arayüz tasarımcısı, böylece ana programla entegrasyon sırasında devasa GUI kodu (MVVM analogu gibi bir şey) ve elbette kullanıcıların kendi başlarına genişletebilecekleri nesnelerle.

Elbette bu, grafik kitaplıklarının sorunlarının çok basitleştirilmiş bir görünümüdür. Buradaki nokta, formları sürüklerken ek kaynakların tüketimi değil, GUI'nin olanaklarını ve işlevselliğini sınırlayan tuval ile çalışmaya odaklanmanın temel eksikliğidir. Sonuç olarak, MT nesnelerinin birkaç özelliği vardır ve kitaplık işleyicileri, çizilebilir öğeleri yönetmek ve bunların çeşitli özelliklerini desteklemek için yeterince geliştirilmemiştir . MT nesnelerinin karmaşıklığı ve kitaplıkların kontrol işlevselliği, tuvalin gerektirdiği minimum seviyeye ulaşmaz.

Bu kitaplıkları tuval için alıp yeniden yazmak, onları temelde yeni bir düzeye yükseltmek anlamına gelir, ki bu a priori kolay ve basit olamaz.


not. Anatoly tuval yolculuğuna kütüphanesinde başladı ve MKL'de elle çizilmiş tablolar oluşturan ilk kişi oldu. Ancak, hücrelerin yarı bağımsız elemanlar olması ve her birine tek tek ulaşmada zorluklar olması nedeniyle, bunların yapım yöntemi kusurludur.

Bu geçişin Anatoly'ye neye mal olduğunu ve ne kadar sürdüğünü hatırlıyorum.

 

Aşağı yukarı böyle

 #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
 
 

Koordinat sınıfı ile sim arkasında bitti. sonrasını bile bilmiyorum

Konumlandırmanın hala eklenmesi gerekiyor gibi görünse de

Sonraki, içeri, sol, üst tarzında. kuruş.....

 
Alexandr Andreev :

Aşağı yukarı böyle


 #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)

Bunu da unuttum:

 #define TE(T) TEMPL(T)
#define TE1(T) TEMPL1(T)
#define TE2(T,T1) TEMPL2(T,T1)
 
Alexandr Andreev :

Aşağı yukarı böyle

 #define TD1 int
#define TD2 double 

Ve bu eksik:

 #define TD3 bool
#define TD4
 void 
 
Aliaksandr Hryshyn :

Ve bu eksik:

Şablon kullanmak istedim ama derlenmiyor, basitleştirilmiş bir örnek son sayfada

Ve tam olarak int olacağı ve bir tür numaralandırma olmayacağı bir gerçek değil ve sonra kodu nasıl düzenlemek istemezseniz düzenleyin.

Ve neden orada bool

İdeal olarak öyle olmalı

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

Ve TD3 yok (aslında tüm sınıf iki değerle yazılmıştır). TD denilen neden koda da yazdı?