2014-01-06 2 views
1

동시에 이동하고 창 크기를 조정할 때마다 내 창이 깜박입니다. 일반적으로 크기 조정이 창의 왼쪽에서 수행 될 때 발생합니다.왼쪽에서 크기를 조정할 때 창에서 깜박임이 발생합니다.

왜 이런 깜박임이 발생합니까? 즉, 창을 재배치 할 때 OS가 수행하는 작업은 무엇입니까?

참고 : 반드시 Windows에서 창 크기를 조정 원점의 X와 Y

+0

이유는 전체 창을 이동하기 때문입니다. Windows는 이제 그 특정 위치의 모든 것을 다시 그릴 것입니다. 오른쪽에서 수축하면 테두리가 다시 채워집니다. 클라이언트 영역은 그냥 자른대로 다시 칠할 필요가 없습니다. 오른쪽에서 스트레칭하려면 클라이언트 영역뿐만 아니라 그려지지 않은 컨트롤도 모두 그려야합니다. 창을 이동하려면 모든 단일 구성 요소와 클라이언트 영역 및 경계를 다시 칠해야합니다. – Brandon

+0

@CantChooseUsernames 당신이 말한 것을이'SWP_NOCOPYBITS'에 연결하려고합니다. 하지만 비트를 복사한다고 생각했습니다. – bluejamesbond

+0

어떤 OS를 사용하고 있습니까? 테마가 활성화 된 (즉, 기본적으로) Windows XP는 피할 수없는 깜박임이 있습니다. Vista를 제외한 다른 모든 Windows 버전은 정상입니다. 나는 비스타를 시도하지 않았다. – arx

답변

4

를 이동하지 않는 창을 의미 오른쪽에서 크기 조절시 나는 깜박 거림이 발생하지 않는 OS와 윈도우의 사이에 전송되는 여러 메시지를 포함 처리기 (WNDCLASSEX 구조의 lpfnWndProc 구성원은 창 클래스의 register에 사용됨). 메시지 모니터링 도구를 사용하여 직접 발견 할 수 있습니다. Visual Studio와 함께 제공되는 Spy++은 이러한 도구 중 하나입니다.

재미있는 메시지 하나는 WM_NCCALCSIZE입니다.이 메시지는 창 크기 조정 중에 호출되어 두 개의 사각형 (WVR_VALIDRECTS 플래그가 설정된 경우)을 생성 할 수 있습니다. 원본 및 대상이 새 창에서 "재사용"할 수있는 기존 창 클라이언트 영역의 내용 지정 창 위치. 기본적으로는 왼쪽 상단 모서리가 피벗이라고 가정한다 : 왼쪽 또는 위쪽 테두리가 피벗을 유지하기 위해 복사 얻을 낡은 윈도우의 내용을 야기 크기 조정

  • ;
  • 오른쪽 하단 테두리의 크기를 조정하면 창의 왼쪽 상단 모서리가 이동하지 않으므로 아무 것도 복사하지 않습니다.

이 기본 복사는 다시 칠하는 동안 비주얼을 배치하는 방식과 일치하지 않으면 깜박임이 발생할 수 있습니다. 예를 들어, 오른쪽 또는 아래쪽 테두리에 상대적으로 표시되는 모든 것은 왼쪽 또는 위쪽 테두리에서 크기를 조정하면 잘못 배치됩니다. 이러한 개체는 불필요하게 이전 크기와 새 크기의 혼합을 떠나게됩니다. 다시 칠해진다. WM_SIZE에서 InvalidateRect으로 엉망진창을 치료하려고하면 깜박임 (물건을 잘못 배치 한 시간 간격은 짧지 만 여전히 존재 함)이 표시됩니다.

이 동작을 사용하지 않도록 설정하는 가장 쉬운 방법은 CS_HREDRAW 및 CS_VREDRAW를 창에 맞게 Class Styles으로 설정하는 것입니다.

+0

좋은 답변입니다! 후속 작업을 수행하려면 상단과 좌측에서 크기를 조정할 때 피벗을 보존하려고 시도 할 때 OS에서 이전 내용을 늘립니까? 또한 OS가 처음으로 이동 한 다음 크기를 조정하는 것처럼 보입니다. 확인 할수 있어요? 또한 CS_HREDRAW 및 CS_VREDRAW를 비활성화했으며 여전히 깜박 거립니다. – bluejamesbond

+0

그리고 setPosWindow가 WM_PAINT를 호출하는 것을 어떻게 멈출 수 있습니까? – bluejamesbond

+0

OS가 늘어나지 않습니다. 원본 및 대상 클라이언트 영역 너비/높이 중 짧은 것을 사용하여 복사합니다. 깜박임의 또 다른 이유는 유효한 브러시로'WNDCLASSEX :: hbrBackground'를 초기화하기 때문일 수 있습니다 : [WM_ERASEBKGND] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms648055 (v = vs.85)).aspx)는 WM_PAINT에서 다시 칠할 기회를 얻기 전에이를 사용하여 나머지 영역을 지 웁니다. – NonNumeric

관련 문제