2012-02-12 6 views
2

저는 스키닝 라이브러리 (Devexpress) 및 MDI 상위 폼이있는 .NET 응용 프로그램을 보유하고 있습니다.WM_SETREDRAW 및 Z- 순서/포커스 손실

자식 폼을 추가 할 때 성능상의 이유로 그림을 사용하지 않도록 설정하려면 WM_SETREDRAW을 사용합니다.

그러나, 다시 WM_SETREDRAW 1을 설정하고 가 MDI 부모에를 새로 호출 한 후, 기본 폼은 z 순서를 잃고 내 바탕 화면의 배경에있다.

나는 다음 BringToFront 또는 초점를 호출해야하지만 내 응용 프로그램이 사용자에 대해 "사라"하는 짧은 시간 (< 1 초)는 여전히 존재한다.

다시 그리기를 비활성화하고 양식을 계속 볼 수있는 더 좋은 방법이 있습니까?

+0

이상한. Enabled 속성을 수정하지 않으시겠습니까? 그것은 그것을 설명 할 것이다. –

답변

3

나는 문제가 the documentation이 말에서 유래 의심 : 응용 프로그램이 숨겨진 창에 WM_SETREDRAW 메시지를 전송

경우, 창이 표시된다 (즉, 운영 체제에 WS_VISIBLE 스타일을 추가합니다 창문).

a hidden window is effectively disabled 때문에 (아직 메시지를 처리 ​​할 수 ​​있지만, 그것은 사용자 입력을받을 수 없습니다), 이것은 당신이 가능하게 창문을 비활성화하는 충돌하여 올바른 순서의 실행됩니다. 현재 초점이 맞춰진 창을 사용할 수 없게되면 포커스를 잃어 버리므로 아무데도 사용할 수 없으므로 초점은 어딘가에이되어야합니다.

정확히 코드를 보지 않고 어떤 일이 벌어지고 있는지 말하기가 어렵습니다. 또한 WM_SETREDRAW 메시지를 MDI 부모 또는 MDI 자식에게 보내고 있는지 여부에 대한 질문이 확실하지 않습니다. 하지만 이 skinning 라이브러리가 악몽을 일으키는 버그를 일으키는 것으로 악명이 높다고 말할 수 있습니다. 처음에는 그러한 것을 정말로 필요로하는지, 그리고 정말로 투쟁의 가치가 있는지 여부를 자문 해보십시오.

내가 자식 폼을 추가

, 내가 성능상의 이유로 그림을 사용하지 WM_SETREDRAW를 사용

는 또한 기본 동기에 의문을 제기해야합니다. 오히려 다른 방법보다, 폼의 생성자의 내부에 초기화을 모두 수행한다고 가정, 자식 폼을 추가 할 때

는 그림이나 성능에 문제가 없어야합니다. 이렇게하면 모든 것이 올바르게 초기화되고 전에 양식이 표시되고 여러 번 다시 그리지 않아도됩니다. 모든 것은 양식이 처음 표시 될 때 정확히 한 번 그려지며 WM_SETREDRAW과 같은 이상적인 경우와 똑같습니다. 다시 그릴 수있게 설정하면 한 번만 그려집니다.