2010-04-14 4 views
0

나는 자식 창을 포함하는 창을 가지고있는 문제에 직면 해있다. 자식 창에는 Windows Media Player를 사용하여 비디오가 재생되는 다른 자식 창이 있습니다. 부모 윈도우에 ShowWindow (hWnd, SW_HIDE)를 호출하고 전체 표면에 페인트 할 때마다 (비디오가 재생되는) 그랜드 자식 창에 의해 점유 된 영역이 오버라이드되지 않습니다. spy ++를 사용하여 재정의되지 않은 영역이 다시 칠하기 전에 숨겨진 것으로 설정되었음을 알았습니다.Drawing 문제로 인해 ShowWindow (hWnd, SW_HIDE)가 자동으로 사각형을 무효화합니까?

나는 그랜드 자식 창의 hwnd를 모니터링했는데 WM_EraseBKGND 또는 WM_NCPAINT 메시지를받지 못하는 것 같습니다. 이것이 점령 한 지역이 무효화되지 않아 그려 질 수 없다는 것을 의미합니까? 나는 winforms에 처음이다.

감사합니다.

+1

비디오 창은 일반적으로 화면 업데이트를 위해 일반적인 Windows API를 우회하는 DirectX와 같은 기술을 사용합니다. 불행히도 나는 당신을 도울 방법을 모른다 - 나는 자식 창이 그것이 숨겨져 있음을 감지하고 손주를 자동으로 비활성화 할 것으로 기대한다. –

+0

일부 조사를 한 후 DirectX가 문제라고 생각하고 바탕 화면 구성을 해제 (Vista 사용)하고이 문제가 발생하지 않습니다. 또한 비디오가 재생되는 동안 (멈추거나 숨기는 대신) 창을 숨기면 문제가 발생하지 않습니다. – wk1989

+0

문제는 Vista의 EVR 비디오 렌더러와 관련이있는 것 같습니다. 렌더링하는 비디오가 중단되면 그 영역이 차지하는 영역이 그려지지 않는 것 같습니다. – wk1989

답변

1

매우 명확하지 않은데 부모 창을 숨기면 아무 것도 보이지 않는다고 가정해야합니다. 관련성이있는 한 가지 점은 비디오가 항상 하드웨어 오버레이에 표시된다는 것입니다. 이것은 비디오 어댑터의 기능으로, 비디오 메모리의 다른 부분을 오버레이하여 합성 이미지를 생성 할 수 있습니다. 따라서 비디오 창을 숨기면 해당 창 부모는 실제로 겹쳐지지 않았기 때문에 다시 칠 메시지를받지 못합니다.

Invalidate() 메서드를 사용하면 창을 강제로 다시 칠할 수 있습니다. 피하기 P/Invoke ShowWindow() 가능한 경우 Visible 속성은 항상 좋은 대안입니다.