2012-11-30 1 views
1

때로는 컨트롤의 사용자 지정 appearence가 필요합니다. 또는 사용자 정의 그림을 많이하십시오. OnPaint (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaint.aspx 참조).Net 응용 프로그램에서 OnPaint를 사용하는 올바른 방법은 무엇입니까?

OnPaint을 사용하여 .net 응용 프로그램에서 페인트하는 것이 올바른 방법은 무엇입니까? 내 애플리케이션을 최적화 된 상태로 유지하고 렌더링 시간을 최소한으로 유지하기 위해 유의해야 할 규칙이 있습니까?

참고 : 내가 본, 그리고 OnPaint를의 비효율적 인 사용에 많은 시간과 시간, 경험, 그러므로 나는이 Q

+0

나는 이것을 잘못하고있는 사람들이 많다. 왜이 질문을 닫아야합니까? –

답변

8

당신은 몇 가지를 알고 있어야 효율적으로 OnPaint을 사용하려면 & A를 생성 :

  • 대조군의 OnPaintForm1들 (... duhh) 컨트롤 그린마다 실행 Form1
  • OnPaint 매번 Form1의이 그려진 하위 제어를 실행한다. 예 : Form1Form1 오른쪽 위 모퉁이에 Form1을 사용하여 도트를 그릴 경우 Form1에 150 개의 하위 컨트롤이있는 경우 도트는 최소 150 회 그려집니다! 렌더링 시간이 크게 늘어납니다. 특히 OnPaint에서 사용자 정의 도면 및 계산을 많이 수행하는 경우.
    • 따라서 컨트롤에 하나 이상의 자식 컨트롤이있는 경우 컨트롤의 OnPaint에 논리가 없어야합니다. 대신 페인트 작업을 수행하는 더 이상 하위 컨트롤이없는 맞춤 컨트롤을 만들어야합니다. 그리고 사용자 정의 도면이 필요한 위치에서 상위 컨트롤에있는 하위 컨트롤로 배치합니다.
    • 컨트롤이 부모에 추가 될 때마다 부모가 다시 그립니다. 다른 컨트롤에 많은 컨트롤을 배치하려는 경우 (예 : Form1에 체크 박스가있는 큰 결과 집합 인 경우 하위 컨트롤을 추가하기 전에 Form1.SuspendLayout() (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.suspendlayout.aspx 참조)을 사용해야합니다. 컨트롤 추가를 완료하면 Form1.ResumeLayout()이 표시됩니다. 이렇게하면 OnPaint 이벤트가 일시적으로 중지되고 렌더링 시간이 줄어 듭니다.
    • 투명 필름은 항상 렌더링 시간을 늘립니다.
    • 이러한 방식으로 구성 요소를 배치하면 그 사이에 배경이 없으므로 부모 컨트롤에서 OnPaint 이벤트 수가 줄어 듭니다. 예 : 서로 아래에 4 개의 텍스트 상자를 놓아서 서로를 쿵쿵 거린다. 따라서 그들 사이에 아무런 배경도없고 컨트롤은 모두 4 OnPaint 이벤트 대신 하나의 OnPaint 이벤트로 그려집니다. 물론 모든 구성 요소를 나란히 접착하지 않으므로 항상 가능한 것은 아닙니다. 그러나 성능이 외모보다 더 중요하다면, 예를 들어 어떤 종류의 커스텀 '데이터 그리드 (datagrid)'에서와 같이 할 가치가 있습니다.
    • 절대 OnPaint 이벤트에서 컨트롤의 위치 또는 크기를 변경하면이 이벤트가 새 OnPaint 이벤트를 호출하므로 절대로 변경하지 마십시오. 컨트롤의 위치를 ​​변경하거나 크기를 조정해야하는 경우 OnPaint이 호출되기 전에 코드에 다른 컨트롤을 추가해야합니다. 예를 들어 OnLayout 또는 OnResize 또는 비슷한 이벤트에 재배치/크기 조정 코드를 배치하십시오. 여전히 응용 프로그램이 작동하도록 OnPaint 이벤트에서 재배치/크기 조정 코드를 배치해야한다고 생각한다면 잘못된 것보다 코드의 논리를 수정해야합니다.
    • 외부 컨트롤 에 대해 Refresh()를 호출하기 전에 System.Math.Pow (2, 2) 번 생각하십시오.새로 고침을 요청하는 충동이 있다면 아마도 새로운 이벤트와 이벤트 핸들러가 필요합니다. 그러면 표시하려는 내용과 동기화 상태를 유지할 수 있습니다. Invalidate()에서도 마찬가지입니다.
    • 효과적으로 그리는 지 확인하려면 다음을 수행 할 수 있습니다. 1. 응용 프로그램을 엽니 다. 2. 최상위 부모에게 OnPaint에 브레이크 포인트를 둡니다. 3. 응용 프로그램을 포함하도록 창을 최대화합니다. 4. 창을 다시 최소화하면 응용 프로그램이 제어에 의해 제어를 다시 그릴 것입니다. 일이 두 배로 길러지면, 당신은 당신의 논리에 실수를 범했습니다. 뭔가 내가 잊었 마음에 오면

가 글쎄, 그게 모든 생각, 내가 뭔가를 잊어 버린 경우, 나는이 질문을 & A. 업데이트됩니다, 또는 내가 주를 가지고 기쁠 실수를 그것의!

누군가가이 정보를 이전에 찾고 있었기 때문에 .Net에서 맞춤 페인트를 사용하기 시작했습니다.