2009-09-27 7 views
2

내가 A, B, C 세 가지 컨트롤을 가지고 있다고 가정 해 봅시다. CDialog에서 모두 상속받습니다. A는 기본 대화 상자이고 A는 B가 들어 있으며 B에는 C가 들어 있습니다. 그리고 매번 마우스를 끈 C, B 및 C를 사용합니다. C가 함께 움직일거야. http://img507.imageshack.us/img507/7039/31709956.jpg이 경우 이중 버퍼를 사용하는 방법은 무엇입니까?

우리는이 자신을 다시 그리도록 B와 C의 원인이됩니다 알고

은 이미지입니다. 깜박임이 발생할 수 있습니다.

그리고 내 질문은 두 가지 대화 상자 B와 C를 이중 버퍼링하는 방법이 있는지 아닌지 여부입니다.

XP와 Vista에는 WS_EX_COMPOSITED 속성이 있는데 도움이되지만이 것은 사용하고 싶지 않습니다.

누군가가 memDC를 사용하도록 제안 할 수 있지만 내 문제는 B의 ondraw 및 C의 ondraw 기능을 버퍼에 병합하는 방법입니다.

누군가 내가 말한 것을 알고 싶습니다.

미리 감사드립니다.

+0

당신이 말할 때 : 대화 ... 그들은 별도의 창을 의미합니까? (그래서 CDialog?) – Toad

+0

예, 모든 대화는 CDialog에서 상속됩니다 ~ – MemoryLeak

답변

2

많이 깜박 거리는 것은 erasebackground 메소드를 오버로드하는 것입니다. 이 메서드는 전체 배경을 단색으로 채 웁니다. 페인트는 모든 항목을 페인트합니다. 지우기 배경을 제거하면 페인트가 이미있는 항목 위에 페인트를하여 깜박 거림을 제거합니다.

+0

하지만 내 문제는 어떻게 B의 ondraw 및 C의 버퍼에 함수를 ondraw 작업을 병합 할 수 있습니다? C, B 및 C를 드래그하면 시퀀스가 ​​B 그리기 먼저 C 다음에는 자신의 ondraw 함수로 끝났습니다. 비트 맵에 버퍼를 두 번 버퍼링 한 다음 맨 위에 그립니다. A. 그러나 나는 이것을하는 방법을 모른다. – MemoryLeak

+0

2 개의 별도 윈도우가 1 개의 오프 스크린 비트 맵을 사용하여 다시 그릴 수 있다고 상상할 수 없습니다. 이렇게하려면 별도의 창이 아닌 대화 상자가 필요합니다. – Toad

+0

안녕하세요 ... 저는 방금 테스트 이미지를 보았습니다. 대화 상자가 정말로 완전히 그려져 있습니까? (그래서 컨트롤이 없습니다.)이 경우 CDialog를 귀찮게하고 직접 메인 창에 직접 그리지 않으므로 함께 깜박임을 제거하지 마십시오. – Toad

1

CS_PARENTDC가 도움이됩니다.

0

B와 C가 A의 하위 (대화 상자의 일반적인 경우)라고 가정 할 경우 A는 WS_CLIPCHILDREN 스타일 집합을 가져야합니다. B와 C가 A의 형제 인 경우 A의 WS_CLIPSIBLINGS 비트를 설정하십시오.

0

주 대화 상자 A에 대해 하나 MemDC을 가지고 결합 MemDC B & C. 유 C를 드래그 할 때 지금, 당신은 현재의 위치 에 따라이 2 MemDC 결합으로되어있다 에 대한 기능을 비트 블리트 사용하여 다음 마지막으로 당신이해야 할 대화 상자의 실제 DC에 결합 된 memDC의 bitblt.

이와 함께 onerasebackground 메서드를 재정의해야하므로 깜박임이 없을 수 있습니다.

관련 문제