64 비트 비스타에서 REDRAW 문제를 일으킬 수 있지만 .NET WinForms의 32 비트에는없는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/386826

문제

이것은 CPU를 컴파일하고 x86으로 컴파일 할 때 발생합니다. GUI의 섹션은 크기 조정되지 않으면 REDRAW를 재조정하지 않습니다. 예를 들어 기본 양식이 최대화되면 일부 컨트롤이 크기를 조정하지 않으며 다른 컨트롤은 이전에있는 것을 다시 그리지 않고 표시하지 않는 섹션이 있습니다.

이것은 XP와 Vista의 32 비트 기계에서 잘 작동하지만 64 비트 비스타 (테스트 할 X64 XP가 없음)에서는 다시 그리기가 제대로 작동하지 않습니다.

누구든지 이것을 추적 할 곳에 대한 아이디어가 있습니까?

편집 : 이것은 2 개의 별도의 기계에서 발생하며, 적어도 내가 현재 진행중인 기계에는 NVIDIA의 최신 드라이버가 있습니다.

EDIT2 : 64 비트 시스템에서 32 비트 XP 가상 머신을 실행하고 응용 프로그램은 VM에서 다시 그리기 문제를 나타내지 않습니다.

EDIT3 : 드라이버 문제 일 수 있지만 운전자가 문제를 해결하는지 또는시기를 알 수 없습니다. 한 동료는 NVIDIA보다 집에서 ATI 카드에 문제가 적지 만 지난 몇 개월 동안 거의 매월 비디오 드라이버를 업데이트 해 왔으며 여전히 해결되지 않았으므로 제품을 출시 할 수는 없습니다. 그리고 고객에게 언젠가 운전자 제조업체 가이 문제를 해결할 수 있다고 말합니다.

누구든지 피하기 위해 어떤 것들을 피하려고 노력하는 것에 대한 통찰력이 있습니까? 우리는 x86으로 컴파일하고 있으며 모든 구성 요소는 x86입니다. 테스트 프로젝트의 구성 요소 로이 문제를 재현 할 수 없으며 다른 사람이 대부분의 구성 요소 포럼에서 이러한 문제를보고하지 않았으므로 우리가하고있는 일일 가능성이 상당히 높습니다.

도움이 되었습니까?

해결책

그것은 끔찍하게 들립니다 이것 문제.

Windows의 창 크기를 조정할 때 일반적으로 각 창이 수신되는 체인이됩니다. WM_SIZE 메시지와 전화 MoveWindow() (또는 이와 유사) 어린이에게 WM_SIZE 등등. .NET은 표지 아래에서 똑같은 일을 할 것이라고 확신합니다.

X64에서 Windows는이 둥지의 깊이를 제한하며 특정 지점 (12-15 Nested Windows) 후에는 WM_SIZE 더 이상 메시지. 이 제한은 x86에 존재하지 않는 것으로 보입니다. 이 제한은 X64 버전의 Windows에서 실행되는 X86 및 X64 코드 모두에 영향을 미칩니다.

다른 x64 설치가 다른 증상을 보이기 때문에 이것은 우리를 오랫동안 우리에게 만들었습니다. 위의 MSDN 블로그 게시에는 몇 가지 가능한 해결 방법이 있습니다. 우리는 2 차 스레드를 사용하여 창 크기를 비동기로 수행하여 문제를 상당히 깔끔하게 해결했습니다.

다른 팁

Windows 양식을 사용하는 경우 Windows 64 비트의 중첩 제한 문제와 관련이 있습니다.

자세한 내용 : http://www.feedghost.com/blogs/blogentry.aspx?entryid=17829

요약해서 말하자면...

MS 소스에서 Control.setBoundScore :

SafeNativeMethods.SetWindowPos(new HandleRef(window, Handle), NativeMethods.NullHandleRef, x, y, width, height, flags);

// NOTE: SetWindowPos causes a WM_WINDOWPOSCHANGED which is processed
// synchonously so we effectively end up in UpdateBounds immediately following
// SetWindowPos.
//
//UpdateBounds(x, y, width, height);

그리고 MSDN에서 :

http://social.msdn.microsoft.com/forums/en-us/windowsuidevelopment/25181bd5-394d-4b94-a6ef-06e3e4287527/

"약간의 조사에 따르면 Windows는 특정 중첩 레벨에 도달 할 때 WM_Size 전송을 중지하는 것으로 나타났습니다. 즉, 부모가 WM_Size를 처리 할 때 크기를 조정하려고하면 WM_SIZE가 어린이 창에 WM_Size를 보내지 않습니다. 사용자 재료/업데이트/Serivice는 WM_Size 전파를 중지하는 최대 중첩 수준을 포장합니다. 최신 XP 32BIT/SP2에서는 15에서 31까지 다양 할 수 있으며 (효과적으로 도달 할 수 없음) 심지어 훨씬 높을 수 있습니다.

그러나 여전히 XP X64에 따라 너무 적지 만 여전히 비슷한 못생긴 일이 비스타의 일부 빌드에서 다른 메시지에 발생합니다.

그래서 그것은 확실히 Windows 버그입니다. "

두 가지 선택이 있습니다 : 제어 계층의 깊이를 줄이기 (보다 이상적인 솔루션) 또는 다른 시스템에서 사용하는 각 시스템에서 "고정 된"컨트롤을 도출하십시오.

public class FixedPanel : Panel
{
  protected override void SetBoundsCore( int x, int y, int width, int height, BoundsSpecified specified )
  {
    base.SetBoundsCore( x, y, width, height, specified );

    if( specified != BoundsSpecified.None )
    {
      if( ( specified & BoundsSpecified.X ) == BoundsSpecified.None )
      {
        x = Left;
      }
      if( ( specified & BoundsSpecified.Y ) == BoundsSpecified.None )
      {
        y = Top;
      }
      if( ( specified & BoundsSpecified.Width ) == BoundsSpecified.None )
      {
        width = Width;
      }
      if( ( specified & BoundsSpecified.Height ) == BoundsSpecified.None )
      {
        height = Height;
      }
    }

    if( x != Left || y != Top || width != Width || height != Height )
    {
      UpdateBounds( x, y, width, height );
    }
  }
}

이 문제의 가장 큰 원인은 응용 프로그램에서 다시 그리프 문제라고 생각합니다. 64 비트에 미묘한 Windows 메시지 순서 차이가있어 코드 에이 문제를 노출시키는 것이 가능합니다.

다음을 수행하여이를 실험 할 수 있습니다.

  1. 응용 프로그램에 타이머를 추가하십시오.
  2. 이벤트 핸들러는 flakycontrol.update ()를 호출합니다.

타이머를 5 초 길게 설정했습니다. 그런 다음 Win64에서 응용 프로그램을 실행하고 문제가 해결되는지 확인하십시오. 그렇다면 가장 가능성이 높은 원인은 귀하의 컨트롤 중 하나가 무효화되었음을 제대로 신호하지 않습니다.

응용 프로그램의 사용자 정의 컨트롤부터 시작합니다. 코드의 모든 재정의 메소드 및 이벤트 핸들러에 업데이트 호출을 체계적으로 추가하십시오. 결국 당신은 문제를 해결하는 것을 찾은 다음 버그가 실제로 어디에 있는지 알게 될 것입니다.

MSDN에 설명 된 stegloke () 솔루션을 사용하는 경우 블로그 onsizechanged ()를 무시하는 제어의 어린이의 도킹을 비활성화하십시오. 나는 dock = dockstyle.fill을 가지고 있었고 dockstyle으로 변경해야했습니다.

나에게 디스플레이 드라이버 문제처럼 들립니다 ...

최신 드라이버로 업데이트하고 문제가 해결되는지 확인하십시오. 64/32 비트 차이는 아마도 붉은 허풍 일 것입니다 ...

나는 고든에 동의 할 것이다. 새로운 64 비트 머신이 32 비트에서 잘 보이는 프로그램과 관련하여 디스플레이 문제가 있었지만 64 비트 머신에서 홀수 문제가 발생하는 문제를 보았습니다. 최신/권장 드라이버로 업데이트하면 거의 항상 문제가 해결되었습니다.

문제없이 가상 OS에서 프로그램을 실행할 수 있다는 사실은 (적어도 VirtualPC에서) 그래픽 카드가 모방되기 때문에 드라이버 문제임을 암시합니다. 즉, 그래픽 카드가 일반적으로 처리하는 일부는 이제 CPU에 의해 수행되므로 그래픽 드라이버와 상호 작용하지 않습니다. 가상화 전문가가 아니며 가상화 계층이 다른 방식으로 문제에 영향을 줄 수 있다고 생각합니다.

나는 이것이 나무에있는 hwnd의 숫자와 관련이 있다고 생각합니다. 구체적인 세부 사항을 모르지만 64 비트가있는 중첩 된 HWND에 제한이있었습니다. 내가 보는 시간이 발생했는데, 나는 전체 Vista Basic (또는 에어로) 테마에서 Windows Classic으로 돌아가서 돌아 다니며 해결합니다. 이 시점에서 문제는 사라집니다.

클래식으로 전환하고 해결되면 중첩 된 HWND의 수를 줄일 수 있는지 확인하십시오.

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