본문 바로가기

Dev::DotNet/WinForm

Spread 의 Annotation 시 속도 문제


FarPoint Spread 에 Annotation 기능이 있다.


[Spread Sample]


Pen 이나 각종 Shape, 이미지 를 올려서 편집이 가능하고 엑셀 파일을 저장/로드했을 때 바로 연동도 가능하다.

굉장히 편하고 유용한 기능이다. 일반적으로 사용했을 경우에는 말이다.


Spread Sheet 에 셀 Merge 좀 해주고 이미지 좀 넣어주고 그러면 그럴수록..

(화면으로 표시되고 그려야할 부분이 넓고 복잡한 하고 다양한 셀 구조를 가지면)

Pen 으로 Drawing 시 속도는 눈에 뛰게 떨어진다.


원인을 이야기 해보자면..

우선 Spread 는 컨트롤을 화면에 그릴 때 극악의 포퍼먼스를 자랑한다.

특히 여러 Cell 을 Merge 했을 때, 더군다나 그 Merge 된 Cell 안에 멀티라인으로 텍스트를 가득 채워넣거나 이미지라도 

넣어놓는다면 당장에 화면 갱신, 스크롤할때 바로 느려지는 것을 볼 수 있다.

이런 Merge 된 Cell 이 많아지면 많이질수록 그 효과는 시너지를 일으킨다.


그런데..저 Annotation 기능을 사용해서 화면에 그릴 때 Spread 는 "화면에 보여지는" 모든 셀들을 다시 그린다.

위 이미지 처럼 셀이 텅텅 비어있거든 Merge 된 Cell 이 없는 경우에는 별 문제 없이 사용할 수 있지만

셀들이 복잡하게 구성되는 경우에는 거의 사용이 불가능할 정도로 그려지는 것이 끈기는 것을 볼 수 있을 것이다.


그렇다면 해결책은 무엇인가...

아직까지 저 Spread 의 Annotation 기능의 중간을 가로채서 속도를 해결하는 방법을 찾지를 못했다.

기본적으로 Cell 의 Paint 기능을 개선을 한다고 해도 

Cell 의 구성이 복잡해졌을 때는 이전보다는 조금 덜 느려지는 거지 느려지는 것은 마찬가지였다.

(Spread 자체 기능으로 화면에 그릴 때 보다 거의 15~20배 정도 단축시켰으나 

Annotation 에서 Pen 으로 그릴 때 원할하게 사용할 정도로 되지는 않음.)


그래서 약간 꼼수로...

Pen 으로 그릴 때 그 좌표를 다 따서 보관하고 화면에는 직접 Graphics 의 DrawLine 으로 그려서보여주고..

다 그렸을 때 그 좌표를 토대로 Spread 의 Shape 개체를 만들어서 넣어주면 그래도 어느정도는 쓸만하게 사용할 수 있다.


spread.SuspendLayout();
{
System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
path.AddLines(mlstPoint.ToArray()/*좌표 리스트*/);
                                  
FarPoint.Win.Spread.DrawingSpace.PSShape pso 
= new FarPoint.Win.Spread.DrawingSpace.CustomShape();
      pso.CanMove  = FarPoint.Win.Spread.DrawingSpace.Moving.HorizontalAndVertical;
      pso.CanRotate = true;
      pso.ForeColor = Color.Empty;
      pso.BackColor = Color.Empty;
      pso.ShapeOutlineColor = Color.Black;
      pso.ShapeOutlineStyle = System.Drawing.Drawing2D.DashStyle.Solid;
      pso.ShapeOutlineThickness = 1;
      pso.Shape = path;
              
      pso.Left = ?;
      pso.Top = ?;
      pso.Width = ?;
      pso.Height = ?;
 
      spread.ActiveSheet.DrawingContainer.AddShape(pso);
}
spread.ResumeLayout();