Создание графической библиотеки с нуля - страница 4

 
Реter Konow:
Кто ж его знает, почему не работает...

Схему библиотеки сначала нужно составить, а потом коды писать. Обычно так делают.

на С++ работает

С чего взяли что схема не составлена, к этому были предпосылки???
 
Alexandr Andreev:

на С++ работает

С чего взяли что схема не составлена, к этому были предпосылки???
А где она? На трех страницах не видел.
 
Реter Konow:
А где она? На трех страницах не видел.

Думал запилить основу использования которой сводилось бы к минимальному коду стиле Новое_окно<<Окно_Выше.Размер; Новое_окно<<Окно_Выше.Раположение; Новое_окно.Размер<<0.5(размер автоматически станет половину от вышестоящего); ... 

Причем в этом классе уже учтена взаимосвязь с позиции небольшого крестика до старшего окна (базового).

Походу гладко не получиться... ну бывает
 
Alexandr Andreev:

Думал запилить основу использования которой сводилось бы к минимальному коду стиле Новое_окно<<Окно_Выше.Размер; Новое_окно<<Окно_Выше.Раположение; Новое_окно.Размер<<0.5(размер автоматически станет половину от вышестоящего); ... 

Причем в этом классе уже учтена взаимосвязь с позиции небольшого крестика до старшего окна.

Эххх, хе, хе.... "что нам стоит дом построить, нарисуем, будем жить...".

Я сам такой же подход имею. Только плачу за него годами тяжелейшего труда. 
 
Алексей Барбашин:

...

Ну я уже неоднократно описывал "недостатки", которые с моей точки зрения я вижу в стандартной библиотеке и в библиотеке Анатолия.

У обеих библиотек есть один существенный, на мой взгляд, недостаток: интерфейс строится на дискретных объектах чарта, То есть чем больше элементов управления в интерфейсе, тем больше обособленных объектов на самом графике. С одной стороны это вроде как само по себе не представляет проблемы, а с другой стороны это представляет проблему при перетаскивании диалогов, так как перетаскивается не единый объект "форма с элементами", а множество различных элементов. А на это расходуются дополнительные ресурсы.

Библиотека Анатолия очень шикарна, но она сложна по своему составу и сложна в интеграции в основную программу. А стандартная библиотека ограничена в самих элементах управления, хотя исходная архитектура очень даже хорошая на мой взгляд.

По сути лучшим решением было бы то, что пытается сделать Петр Конов: графический конструктор создания интерфейсов с генерацией кода GUI, но только с расширенной событийной моделью, чтобы при интеграции с основной программой не приходилось лазить в огромный код GUI (что-то вроде аналога MVVM), ну и конечно же с объектами, которые пользователи могли бы самостоятельно расширять.

Конечно, это очень упрощенный взгляд на проблематику графических библиотек. Дело вовсе не в расходе дополнительных ресурсов при перетаскивании форм, а в принципиальном отсутствии заточенности на работу с канвасом, что ограничивает возможности и функциональность GUI. Суть в том, что МТ-объекты имеют мало свойств, а обработчики библиотек недостаточно развиты, чтобы управлять рисованными элементами и поддерживать все их разнообразные возможности. Сложность МТ-объектов и управляющего функционала библиотек не дотягивается до минимального уровня, требуемого канвасом.

Взять и переписать эти библиотеки под канвас, означает поднять их на принципиально новый уровень, что априори не может быть легко и просто. 


ЗЫ. Анатолий начал путь к канвасу в своей библиотеке и первым создал рисованные таблицы на МКЛ. Однако, метод их построения несовершенен, вследствии того, что ячейки - это полу-самостоятельные элементы и есть сложности обращения к каждой в отдельности.

Я помню, чего стоил Анатолию этот переход и сколько времени он занял. 

 

Примерно так

#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
 
 

За сим с классом координат закончено. Даже не знаю что там дальше

Хотя вроде еще позиционирование надо добавить

В стиле next, in, left, top. 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, а потом по коду править ой как не хочется

И зачем там bool

В идеале должны быть так

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

И никаких ТD3 (по факту там весь класс написан на два значения). Почему назвал TD также написал в коде

Причина обращения: