2010-08-09 5 views
0

괜찮습니다. 타원을 그릴 수 있습니다. 문제는 이것입니다. 즉 하나의 타원을 그리지 만 x 값을 다른 것으로 변경하려고합니다. 내가 10으로 그것을 x 값을 원하지만 그것은 x 값과 새로운 타원을 생성하는 메신저를 보인다 내가 하나의 타원을 그리고 x 값이 1 열 후 초 같은 10 여기 내가 아니라 내 코드C++ gdi drawing 타원 문제

while(sd==1)//sd equal 1 
{ 
    sf++;//sf equals 1 
    onPaint(hdc); 
    InvalidateRect(hWnd,0,true); 
} 
//on paint function 
VOID onPaint(HDC hdc) 
{ 
    Graphics graphics(hdc); 
    Pen  pen(Color(255, 0, 0, 255)); 
    graphics.DrawEllipse(&pen,sf , 0, 50, 50); 
} 

입니다 무효화 rect는 모든 것을 칠한 후 다시 칠해도 작동하지 않는다고 생각합니다.

답변

0

애니메이션을 만들고 싶다면 타이머를 설정하는 것이 좋습니다.

WM_PAINT를 생성하는 방법으로 InvalidateRect를 사용하면 과도한 것처럼 보이지만 훨씬 더 많은 작업을 수행 할 것입니다. 대신 OnTimer 호출에서 직접 그릴 수 있습니다. WM_PAINT 외부에 있으므로 GetDC를 사용하여 장치 컨텍스트를 가져와야합니다.

예를 들어 DrawFrame (HDC hDC) 기능을 사용할 수있는 경우. OnTimer는 현재 위치를 업데이트하고 DrawFrame을 호출합니다. OnPaint는 DrawFrame을 호출하지만 위치를 업데이트하지 않습니다 (마지막 프레임을 그리는 애니메이션을 중지하려는 경우).

DrawFrame은 배경을 지우고 (아마도 FillRect를 사용하여) 원을 새 위치에 그립니다. 톰이 더블 버퍼로 메모리 DC와 HBITMAP를 사용할 것을 제안 했으므로 큰 영역이 있다면 깜박입니다.

+0

ok 감사합니다.하지만 getDC를 사용하는 방법과 어떤 기능을 사용해야합니까? – Ramilol

+0

정말 쉽습니다.'HDC hDC = GetDC (hWnd)'check http://msdn.microsoft.com/en-us/library/dd144871(VS.85).aspx. OnTimer가 실행되면 애니메이션이 매끄럽게 업데이트됩니다. – Ismael

0

애니메이션의 여러 프레임을 한 번에 그리지 마십시오.

을 저장 변수 sf 곳, 그리고 OnPaint()에, sf를 증가 하나의 타원을 그리고 OnPaint() 다시 호출 할 트리거 Invalidate()

Invalidate 호출합니다.

이것은 작동해야하지만 매우 깜박입니다 :) 이중 버퍼링으로 깜박임을 해결할 수 있습니다.

+0

글쎄, 그 중 하나를 그리면 sf는 golabe varabile입니다. – Ramilol

-1

InvalidateRect은 창을 "유효하지 않은"것으로 표시하지만 지우기 및 다시 그리기가 즉시 수행되지는 않습니다. 지우기 및 페인팅은 메시지 펌프가 실행 중일 때만 발생합니다 (예 : GetMessageDispatchMessage의 루프). 메시지 대기열이 마를 때, GetMessage은 유효하지 않은 창에 대해 WM_ERASEBKGNDWM_PAINT 메시지를 합성합니다. 이러한 메시지가 창 프로 시저에 전달되면 창에 그릴 기회가 생깁니다.

onPaint 기능 만 그립니다. 지우지 않습니다. 그리고 루프가 종료되지 않기 때문에 메시지 펌프가 실행되지 않습니다.

간단한 애니메이션 인 경우 해결 방법은 SetTimer입니다. WM_TIMER 메시지에 대한 처리기에서 단일 프레임에 대한 변수를 업데이트하고 InvalidateRect으로 전화를 걸어 돌아 오면 메시지 펌프가 계속 실행됩니다. 지우기 및 그림 메시지가 나타나면 타이머가 다시 시작되고 다음 프레임이 표시됩니다.

+0

아무도 왜이 게시물 downvoted 있었는지 설명 할 수 있습니까?질문자가 예상 한대로 InvalidateRect가 작동하지 않는 이유를 설명합니다. –