2011-09-05 6 views
1

WebBrowser 컨트롤을 재정의하는 사용자 정의 컨트롤이 있습니다. 부모 폼에서 BackgroundImage 영역을 가져 와서 HTML 코드의 배경으로 만드는 메서드가 있습니다. 다음과 같이 작동합니다.Control이 완전히로드 된 직후에 어떤 이벤트가 시작됩니까?

  1. 자체가 보이지 않습니다.
  2. 캡쳐 부모 양식.
  3. 자신을 표시합니다.
  4. 캡처 한 이미지의 특정 영역을 취하여 배경으로 설정합니다.
  5. 자체를 새로 고칩니다.

컨트롤이 완전히로드 된 직후에 해당 메서드가 실행되기를 원합니다. 생성자에서이 작업을 수행 할 수 없습니다. 중요한 개체와 부모 속성은 여전히 ​​null이므로 사용해야합니다. OnVisibleChanged 이벤트에 넣고 bool 변수를 false로 설정하여 단 한 번만 실행하지만 프로젝트를 다시 빌드 할 때마다 실행됩니다. (실행하지 않고도 html 코드의 배경으로 사용하지만 다른 디렉토리로 인해 비트 맵을 생성합니다. Directory.CurrentDirectory() 메서드 사용). OnLoad 이벤트로도 실행하려고했지만 OnVisibleChanged와 동일한 문제가 발생합니다. OnVisibleChanged보다 더 적절한 이벤트가 있습니까?

추신. 모든 이벤트가 기본 클래스의 이벤트를 발생시켜야하는지 항상 궁금해했습니다. 그것을 할 필요가 있습니까? 나는 어떤 diffrence도 전혀 보지 않고, 모든 것이 훌륭하게 작동한다. 이벤트 메소드의 처음이나 끝 부분에 있어야할까요?

+0

이벤트 그렇다면 닭고기와 계란도 무한 루프의 문제 -) –

+0

내 영어로 죄송합니다 제목을 편집했습니다] –

답변

3

'완전히로드 된'개념은 없습니다. 컨트롤을 생성하는 것은 Winforms의 원자 적 연산이며 OnHandleCreated()가 신호를 보냅니다. 당신이 여기에서 찾고있는 것은 을 완벽하게 제어하고있다.. 페인팅은 Windows에서 우선 순위가 낮은 작업으로 다른 작업은 수행하지 않아도됩니다.

는 WM_PAINT을의 WndProc()를 오버라이드 (override) 잡기에 의해 그 통지를 받기 : 당신은 아마, 그 자체가 프레임 워크에 의해 해고를 찾고 있습니다

bool fullyPainted = false; 

protected override void WndProc(ref Message m) { 
    base.WndProc(ref m); 
    if (m.Msg == 15 && !fullyPainted) { 
     fullyPainted = true; 
     // etc... 
    } 
} 
+0

OnPaint 메서드에서 동일하게 작동합니까? 부모님도 그 그림을 그린 것을 어떻게 알 수 있습니까? –

+0

아니요, 일부 컨트롤에서는 OnPaint가 호출되지 않습니다. WebBrowser와 같습니다. 네이티브 컨트롤에는 ControlStyles.UserPaint가 해제되어 있습니다. 페인팅은 Z 순서대로 이루어 지므로 WM_PAINT를 얻을 때 부모가 페인트되었다고 가정 할 수 있습니다. –

관련 문제