처음부터 그래픽 라이브러리 만들기 - 페이지 4

 
Реter Konow :
왜 안되는지 누가 알겠습니까...

라이브러리 구성표를 먼저 컴파일한 다음 코드를 작성해야 합니다. 그들은 일반적으로 그렇게합니다.

C++에서 작동

왜 그들은 계획이 작성되지 않았는지, 이에 대한 전제 조건이 있었습니까 ???
 
Alexandr Andreev :

C++에서 작동

왜 그들은 계획이 작성되지 않았는지, 이에 대한 전제 조건이 있었습니까 ???
그녀는 어디에 있니? 3페이지에서 못봤습니다.
 
Реter Konow :
그녀는 어디에 있니? 3페이지에서 못봤습니다.

최소한의 스타일 코드 New_window<<Window_Above.Size; New_Window<<Window_Above.Location; New_window.Size<<0.5 (크기는 자동으로 부모의 절반이 됩니다); ...

또한이 클래스에서는 작은 십자가의 위치에서 이전 창 (베이스)까지의 관계가 이미 고려되었습니다.

캠페인은 순조롭게 진행되지 않을 것입니다 ... 글쎄, 그것은 발생합니다
 
Alexandr Andreev :

최소한의 스타일 코드 New_window<<Window_Above.Size; New_Window<<Window_Above.Location; New_window.Size<<0.5 (크기는 자동으로 부모의 절반이 됩니다); ...

또한이 클래스는 이미 작은 십자가의 위치에서 이전 창까지의 관계를 고려했습니다.

에헤헤헤헤 .... "우리는 집을 무엇을 지어야 할까, 그려야 할까, 살까...".

나 자신도 같은 접근 방식을 가지고 있습니다. 나는 수년간의 노력을 통해서만 그에 대한 대가를 지불합니다.
 
Алексей Барбашин :

...

글쎄, 나는 내 관점 에서 표준 라이브러리 와 Anatoly 라이브러리에서 볼 수 있는 "결점"을 반복해서 설명했습니다.

내 생각에는 두 라이브러리 모두 한 가지 중요한 단점이 있습니다. 인터페이스는 개별 차트 개체를 기반으로 합니다. 즉, 인터페이스에 컨트롤이 많을수록 차트 자체에서 개체가 더 많이 분리됩니다. 한편으로 이것은 그 자체로는 문제가 없어 보이지만 다른 한편으로 드래그되는 것은 단일 "요소가 있는 양식" 개체가 아니라 여러 요소가 다르기 때문에 대화상자를 드래그할 때 문제가 발생합니다. . 그리고 이를 위해서는 추가 리소스가 필요합니다.

Anatoly의 라이브러리는 매우 세련되지만 구성이 복잡하고 기본 프로그램에 통합하기 어렵습니다. 그리고 표준 라이브러리는 컨트롤 자체에 제한이 있지만 원래 아키텍처가 제 생각에는 매우 좋습니다.

사실, 최고의 솔루션은 Petr Konov가 하려고 하는 것입니다. GUI 코드 생성 기능이 있는 그래픽 인터페이스 디자이너지만 확장된 이벤트 모델만 사용하므로 메인 프로그램과 통합할 때 다음 단계로 올라갈 필요가 없습니다. 거대한 GUI 코드(MVVM의 아날로그와 같은 것), 물론 사용자가 스스로 확장할 수 있는 개체가 포함됩니다.

물론 이것은 그래픽 라이브러리의 문제에 대한 매우 단순화된 관점입니다. 요점은 양식을 끌 때 추가 리소스가 전혀 소비되지 않는다는 것이 아니라 캔버스 작업에 대한 근본적인 초점 부족으로 GUI의 가능성과 기능이 제한된다는 것입니다. 결론은 MT 개체에는 속성이 거의 없고 라이브러리 핸들러가 드로어블 요소를 관리하고 다양한 기능을 모두 지원할 만큼 충분히 개발되지 않았다는 것입니다. MT 개체의 복잡성과 라이브러리의 제어 기능은 캔버스에서 요구하는 최소 수준에 도달하지 않습니다.

이러한 라이브러리를 캔버스용으로 가져와 다시 작성한다는 것은 사전에 쉽고 간단할 수 없는 근본적으로 새로운 수준으로 라이브러리를 높이는 것을 의미합니다.


추신. Anatoly는 그의 라이브러리에서 캔버스에 대한 길을 시작했고 MKL에서 손으로 그린 표를 처음으로 만들었습니다. 그러나 세포가 반독립적인 요소이고 각 세포에 개별적으로 접근하는 데 어려움이 있기 때문에 구성 방법이 불완전합니다.

Anatoly는 이 전환 비용과 소요 시간을 기억합니다.

 

이 정도

 #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의 스타일로. 센트.....

 
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가 될 것이라는 사실이 아닙니다. 그런 다음 코드를 편집하고 싶지 않은 방식으로

그리고 왜 bool이 거기에 있습니까?

이상적으로는

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

그리고 TD3도 없습니다(사실, 전체 클래스는 두 개의 값으로 작성됩니다). TD라고 불리는 이유는 코드에서도 작성되었습니다.