MQL로 작성된 UI 갤러리 - 페이지 78

 
Реter Konow #:
이런 것을 만드는 것은 쉽지 않습니다. )

제가 알기로는 표준 C캔버스 클래스에는 색상 그라데이션을 그리는 기능이 없는데, GUI에서 그라데이션 문제를 어떻게 해결하셨나요?

조명 효과를 말하는 건가요? 글쎄요, 빛을 추가했습니다 :D 설명했듯이 CCanvas는 세부 사항이 아닌 기본 사항과 구조에만 적용됩니다.

//+------------------------------------------------------------------+
//| Macro to generate color                                          |
//+------------------------------------------------------------------+
#define XRGB(r,g,b)    (0xFF000000|(uchar(r)<<16)|(uchar(g)<<8)|uchar(b))
#define ARGB(a,r,g,b)  ((uchar(a)<<24)|(uchar(r)<<16)|(uchar(g)<<8)|uchar(b))
#define TRGB(a,rgb)    ((uchar(a)<<24)|(rgb))
#define GETRGB(clr)    ((clr)&0xFFFFFF)
#define GETRGBA(clr)   uchar((clr)>>24)
#define GETRGBR(clr)   uchar((clr)>>16)
#define GETRGBG(clr)   uchar((clr)>>8)
#define GETRGBB(clr)   uchar(clr)
#define COLOR2RGB(clr) (0xFF000000|(uchar(clr)<<16)|(uchar((clr)>>8)<<8)|uchar((clr)>>16))
#define RGB2COLOR(rgb) ((uchar(rgb)<<16)|(uchar((rgb)>>8)<<8)|uchar((rgb)>>16))


//+------------------------------------------------------------------+
//| Add light to rectangular area                                    |
//+------------------------------------------------------------------+
void CCanvasExt::AddLight(int x1, int y1, int x2, int y2, bool updown=true, double intensity=.5, int isoftedge=20, color lightcolor=C'255,255,255')
   {
   if (intensity==0)
      return;
      
   int tmp;
//--- sort vertexes
   if(x2<x1)
     {
      tmp=x1;
      x1 =x2;
      x2 =tmp;
     }
   if(y2<y1)
     {
      tmp=y1;
      y1 =y2;
      y2 =tmp;
     }
//--- out of screen boundaries
   if(x2<0 || y2<0 || x1>=m_width || y1>=m_height)
      return;
//--- stay withing screen boundaries
   if(x1<0)
      x1=0;
   if(y1<0)
      y1=0;
   if(x2>=m_width)
      x2=m_width -1;
   if(y2>=m_height)
      y2=m_height-1;


//--- calculate softedge
   isoftedge=MIN(100,isoftedge);
   int softedge=isoftedge>0 ? isoftedge*(y2-y1)/100 : 0;

//--- correct height
   y2-=(y2-y1)/2;
   y2+=(softedge/2);
   y2++;
   y2=MIN(m_height-1,y2);   
   
//--- prepare 
   COLOR_RGBA rgb=_ColorLumaMult(lightcolor,ABS(intensity));
   double r=(int)GETRGBR(rgb);
   double g=(int)GETRGBG(rgb);
   double b=(int)GETRGBB(rgb);  
   
   if (intensity<0)
      {
      r=0-r;
      g=0-g;
      b=0-b;
      }
   uint pixel;     
   int istart;
   int iend;
   int i;

//--- check direction
   if (updown)
      {
   //--- add main light   
      for(;y1<y2-softedge;y1++)
         {
         istart=y1*m_width+x1;
         iend=istart+(x2-x1);
         for (i=istart;i<=iend;i++)
            {
            pixel=m_pixels[i];
            m_pixels[i]=ARGB(GETRGBA(pixel),MIN(GETRGBR(pixel)+r,0xFF),MIN(GETRGBG(pixel)+g,0xFF),MIN(GETRGBB(pixel)+b,0xFF));// m_pixels[i]+=XRGB(r,g,b);
            //m_pixels[i]|=rgb;
            }
         }
      if (softedge==0)
         return;
   
   //-- Add soft edge 
      double decr=r/softedge;
      double decg=g/softedge;
      double decb=b/softedge;
   
   //--- Loop rows separate and adjust color each row   
      for (;y1<=y2;y1++)
         {
         r-=decr; r=MAX(0,r); 
         g-=decg; g=MAX(0,g); 
         b-=decb; b=MAX(0,b); 
         
         istart=y1*m_width+x1;
         iend=istart+(x2-x1);
         for (i=istart;i<=iend;i++)
            {
            pixel=m_pixels[i];
            m_pixels[i]=ARGB(GETRGBA(pixel),MIN(GETRGBR(pixel)+r,0xFF),MIN(GETRGBG(pixel)+g,0xFF),MIN(GETRGBB(pixel)+b,0xFF));// m_pixels[i]+=XRGB(r,g,b);
            }
         }
      }   
  }   
 
Doerk Hilger #: 조명 효과를 말하는 건가요? 글쎄요, 빛을 추가했습니다 :D 말했듯이 CCanvas도 기본과 구조에만 적용되고 세부 사항에는 적용되지 않습니다.
알겠습니다, 감사합니다. )
 
Реter Konow #:
알겠습니다, 감사합니다. )

자유롭게 사용하세요 :)
추신 : 제가 보기에 업다운은 실제로 쓸모가 없습니다. 어쨌든 빛은 어쨌든 보통 위에서부터 나옵니다.

 
Doerk Hilger #:

자유롭게 사용하세요 :)
추신: 제가 볼 수 있는 한 위아래는 실제로 쓸모가 없습니다. 어쨌든 빛은 보통 위에서부터 들어옵니다.

예, 흥미로운 옵션이 있습니다. 시도해 보겠습니다 :)

저는 주어진 소스 색상에서 더 밝은 색상으로 배광을 반대 방향으로 작동시킵니다. 설명하자면, 색상 분할 알고리즘 자체가 올바르게 작동하여 256개의 음영을 배열에 기록합니다. 이것이 함수가 허용하는 각 색상에 대한 전체 범위입니다. 그러나 페인팅 알고리즘은 요소의 표면에 한 방향으로만 그라데이션을 적용합니다. 오랫동안 저는 기능을 추가하고 볼륨과 복잡한 평면 요소를 제공하는 다방향 그라데이션을 만들고 싶었습니다. 원칙적으로 이것은 어려운 작업이 아닙니다. 그러나 앞으로 더 중요한 작업이 많이 있습니다).

 
친구, EA를 백테스트할 때 GUI를 사용하는 방법을 알아낼 수 있다면 감사하겠습니다.
 
Реter Konow #:
쉬운 일이 아닙니다. )

제가 알기로는 표준 C캔버스 클래스에는 색상 그라데이션을 그리는 기능이 없는데, GUI에서 그라데이션 문제를 어떻게 해결하셨나요?
코드의 수식으로 모두 해결했습니다.
파일:
 
Yu Zhang 백테스트할 때 GUI를 사용하는 방법을 알아내 주시면 감사하겠습니다.

그보다 쉬운 것은 없습니다.

설명한 핵심은 모든 이벤트를 관리하며 이벤트가 틱인지 차트 이벤트인지는 중요하지 않습니다. 틱에서도 마우스 위치 등을 가져와서 변경 사항을 확인한 다음 차트 이벤트에 대해 OnEACylce()를 실행하기만 하면 됩니다. 더 이상 어떤 제한도 받지 않습니다.

 
내일 개발 현황에 대한 자세한 업데이트를 올리겠습니다.

오늘은 6개의 에디터 중 2개의 기초를 다졌다고 말씀드릴 수 있습니다.
 

현재 개발 상태:

1. 개체, 요소, 창, 매개변수의 수백 가지 속성을 에디터의 탭과 테이블에 통합하기 위해 많은 작업을 수행했습니다. 이를 분리하고 정렬하는 작업이 필요했습니다. 이 작업의 약 70%가 완료되었습니다. 이러한 속성이 모두 사용자의 작업에 필요한 것은 아니지만 편집기의 추가 개발을 위해 필요합니다.

2- 스크롤 메커니즘이 디버깅되었습니다. 이제 각 탭은 슬라이더의 위치를 "기억"하고 캔버스로 돌아갈 때 자동으로 마지막 보기 위치로 스크롤됩니다.

3. 스크롤과 관련된 지연을 수정했습니다. 예를 들어 마우스 휠로 스크롤하는 동안 인터랙티브 요소가 지정된 속도 임계값에서 커서에 반응하지 않습니다. 휠 이벤트의 도착 속도가 초당 3(이벤트 간 300ms)을 초과하는 경우커서 아래에 있는 요소가 다시 그려지지 않습니다. 또한 이제 스크롤하는 동안 스트립 공간과 그 구성 요소만 그려집니다. 나머지 캔버스 공간은 무시되지 않습니다.

4. 테이블 축소기인 T_FOLDER 요소의 작업이 조정되었습니다. 비디오에서 명확하게 볼 수 있습니다.

5. 요소 현상에 대한 문제를 발견하고 수정했습니다.

6. 편집기의 하위 창 디자인이 더 잘 고려되었습니다. 편리하고 미적 솔루션이 발견되었습니다. 그러나이 방향으로해야 할 일이 많이 있습니다.


가장 가까운 계획:

1. Get_property()Set_property() 함수를 작성합니다. 템플릿에서 복사한 인스턴스를 편집할 수 있습니다. 첫 번째 함수는 각 요소에서 모든 속성(300개 이상)을 한 번에 가져와서 편집기 탭의 편집 요소(동영상에 있는 요소)에 넣습니다. 두 번째 함수는 편집기 요소의 사용자 지정 값을 기본 캔버스(중앙에 있는)의 편집 가능한 인스턴스 속성으로 보냅니다.

2. 4년 전에 잘 작동했던 수동 요소 편집 기능을 복원합니다.


 
오늘은 12 월 21 일입니다. 12월 10일, 즉 20일 이전에는 미니멀 버전의 에디터가 준비될 것으로 예상했고, 원칙적으로 이전에 작동했던 미니멀 버전을 복원했다면 그렇게 됐을 텐데, 에디터 정식 버전을 만들기로 결정했습니다. 그래서 예상보다 훨씬 더 많은 작업이 필요했습니다.

앞서 비주얼 에디터의 6가지 기본 사항에 대해 이야기했습니다. 다시 한 번 상기시켜드리겠습니다:

1. 요소/창 복제.

템플릿을 복사하고 속성을 수정하여 요소의 새 인스턴스를 만듭니다.

2. 요소/창 삭제하기.

코어에서 이전에 복제된 인스턴스 지우기.


3. 창/요소의 속성 검색하기.

속성 편집기 요소는 편집 초점에 해당하는 인스턴스의 속성 값을 검색해야 합니다.

4. 요소/창의 속성 편집하기.

프로퍼티를 편집하는 방법은 (1) 요소 편집기를 통한 방법과 (2) 인스턴스를 수동으로 편집하는 방법, 총 두 가지가 있습니다. 예를 들어 리플리, 이동, x 표면에 인쇄 등이 있습니다.


5. 템플릿/프로젝트 로드.

추가 편집을 위해 편집기 내에서 저장된 템플릿과 프로젝트를 불러올 수 있는 기능입니다.

6. 템플릿/프로젝트 저장.

완성된 GUI 템플릿과 프로젝트를 파일로 저장하여 나중에 사용자 지정 프로그램으로 전송하거나 베타 버전으로 사용하고 다시 불러와서 편집 또는 복사할 수 있는 기능입니다.

일반적으로 비주얼 에디터의 6가지 기본 기능은 위와 같습니다.

일곱 번째 기초로, 저는 그래픽 편집기 인터페이스가 없으면 작동하지 않는 그래픽 편집기 인터페이스를 추가하고 싶습니다.


새해가 되기 전에 요소 편집기와 수동 모드 모두에서 복제, 삭제 및 시각적 편집을 구현할 예정입니다. 시간이 지나면 제가 무엇을 할 수 있을지 지켜보겠습니다.