문제

버튼에 애니메이션 GIF가 있습니다. OK (대부분의 시간 : P)에 애니메이션이지만 창문이 다시 그려지면 (다시 페인트) 애니메이션이 중지됩니다. 페인트 이벤트를 처리하는 동안 버튼 (button.refresh ())을 새로 고치려고했지만 문제를 해결하지 못했습니다.

누구 든지이 문제를 해결하는 방법을 알고 있습니까?

도움이 되었습니까?

해결책

어쩌면 나는 실수했지만 문제는 양식이 다시 그려 질 때가 아니라 애니메이션 객체가 다른 창으로 가려 질 때 애니메이션을 중지한다고 생각합니다. 이것은 의도 된 행동입니다. 버그는 Windows Vista와 Wind

이 버그는 애니메이션 객체의 모든 버튼베이스 파생 제어에 영향을 미치는 것으로 보입니다.

문제는 컨트롤입니다. 사실이 되돌아 갈 것입니다. system.windows.forms.buttonbase.onframechanged에서 buttonbase.cs 파일에 볼 수 있습니다.

if (IsWindowObscured) {
 StopAnimate();
 return;
}

그리고 그 안에 문제가 있습니다.

참고로, onframechanged는 ImageAnimator 스레드에서 호출됩니다. 이것은 imageAnimator.animate (image, eventhandler)에 지정된 콜백입니다. Buttonbase는 이것을 개인적인 무효 애니메이션 (bool animate) 함수로 설정합니다. ImageAnimator 스레드는 50ms마다 투표하고 모니터링하는 이미지에 새 프레임이 필요한지 확인합니다. 그렇다면 컨트롤이 무효화되고 새 프레임이 그려 지도록 깃발을 설정합니다.

이것은 우리에게 접근 할 수 없기 때문에, 나는 그것에 대해 할 수있는 일이 많다고 생각하지 않습니다. 해결 방법으로 500ms마다 컨트롤을 무효화하는 타이머를 구현 했으므로 이전에 중지 된 경우 다시 시작해야합니다. 우리가 그것을 무시하거나 접근 할 수 없다는 것은 매우 성가신 일입니다. 유일한 솔루션은 위의 해킹이거나 직접 또는 타사가 만든 컨트롤을 만들거나 사용하는 것이 두렵습니다.

명확히하기 위해 - 이것은 데스크탑 구성을 사용하여 Windows Vista 또는 Windows 7의 문제입니다. 문제는 데스크탑 구성을 사용하지 않을 때와 같이 Windows가 진정으로 가려지지 않는다는 것입니다. 그들은 항상 창 관리자에 의해 버퍼링됩니다. (Windows 2000+에는 특수 레이어 Windows가 있지만 지금은 무시하십시오). 이전에는 화면에 있지 않거나 다른 창으로 가려진 경우 창의 부분을 사용할 수 없었습니다. 그들이 초점이나 위치 등을 변경함으로써 다시 돌아 왔을 때, 시스템은 해당 영역에 자체적으로 다시 칠할 수 있도록 통지합니다. 그러나 데스크탑 구성을 사용할 때는 창의 실제 내용이 다른 곳에 버퍼링되기 때문에 다시 페인팅이 필요하지 않습니다. 예를 들어 Window 미리보기가 작업 표시 줄 및 Flip-3D에서 작동하는 이유입니다. 부작용은 페인트 메시지가 다시 표시 될 때 페인트 메시지가 다시 표시된 후 다시 표시 될 것으로 예상되는 코드가 실패한다는 것입니다. Buttonbase 코드는 다시 보면 페인트 메시지가 다시 보이면 애니메이션이 다시 시작됩니다. 따라서이 최적화는 버그가되었습니다.

이 문제는 Microsoft Connect에서보고되어야하지만 해결되지는 않을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top