2011-03-14 6 views
1

저는 win32 응용 프로그램이 있고 마우스를 끌어서 선을 그립니다. 이중 버퍼링도 사용하지만 문제는 마우스 경로에 여러 줄을 그립니다. 여기 내 그리기 코드입니다 : 내가 선을 그리기 전에 버퍼로 배경을 복사하지 않고 또한 시도C++ win32 프로젝트 이중 버퍼링

hdc = BeginPaint(hWnd, &ps); 
hdcBack = CreateCompatibleDC(hdc); 
GetClientRect(hWnd, &windowRect); 
backBuffer = CreateCompatibleBitmap(hdc, windowRect.right, windowRect.bottom); 
SelectObject(hdcBack, backBuffer); 
FloodFill(hdcBack, 0, 0, RGB(255, 255, 255)); 
BitBlt(hdcBack,0,0,windowRect.right,windowRect.bottom,hdc,0,0,SRCCOPY); 
color = RGB(rand() % 255, rand() % 255, rand() % 255); 
hBrush = CreateSolidBrush(color); 
SelectObject (hdcBack, hBrush); 

MoveToEx(hdcBack,x1,y1,NULL); //x1,y1,x2,y2 are the initial click point and the current position of the mouse when keeping the left button down and dragging 
LineTo(hdcBack,x2,y2); 
BitBlt(hdc, 0, 0, windowRect.right, windowRect.bottom, hdcBack, 0, 0, SRCCOPY); 

DeleteObject(hBrush); 
DeleteDC(hdcBack); 
DeleteObject(backBuffer); 
EndPaint(hWnd, &ps); 

그것은 정확하게 선을 그립니다하지만 난 새로운 라인을 그릴 때 이전에 그려진 선이 사라집니다. 그럼 어떻게하면 이중 버퍼링을 사용하여 여러 줄을 그리고 이전에 그려진 줄을 유지할 수 있습니까?

답변

1

요구 사항을 올바르게 이해하면 디자인에 문제가 있습니다. 버퍼에에

첫 번째 BitBlt() 복사 이전 내용은, 당신은 선을 그린 다음 당신은 당신이 설명하는 정확한 결과를 제공 화면에 변경 사항을 적용합니다. 이 방법은 대체하기보다는 그래픽 만 추가하는 것이므로 하나가 아닌 여러 줄이 표시됩니다.

마우스로 드래그되는 선을 표시하려면 먼저 마음에 든 배경 (백 프레임을 으로 지정하고 상수 데이터)을 백 버퍼에 채워 넣고 관련 그래픽 (변경 데이터)마다 마우스가 움직입니다. 어쨌든, 나는 그 첫 번째 BitBlt() 그 트릭을해야한다고 의견을 믿습니다.

또한, 당신은 를 사용하는 선 기능을 호출하기 전에 브러시을 선택하고 있습니다. FloodFill()에 전화하기 전에 전화를해야하지 않습니까?

편집 :

를 사용하여 당신에 대한 내 댓글에 제안 가장 최근의 데이터를 보유하는 세 번째 버퍼입니다. "마우스 업"처리기에서 마지막으로 새 줄을 에 그려야 버퍼가됩니다.
그래서 마우스 이동 핸들러와 페인트 핸들러에서 해당 버퍼의을 읽고 사용자가 마침내 자신의 선을 그리는 방법을 확신하면 마우스 업 핸들러에서 이라고 입력하여이라고 입력하십시오.

+0

내 질문에 약간 불명 한 점 사과드립니다. 첫 번째 BitBlt 주석 경우 단일 선 그리기 작동합니다. 하지만 여러 줄을 그려야 겠어. 그러나 다음 줄을 그리기 시작하면 이전 줄이 사라집니다. 나는 그것이 남아 있기를 바란다.어떻게 든 배경을 저장하고 싶지만 선이 완전히 그려 졌을 때만. 그리고 그 브러시는 다른 목적을 위해 사용되었습니다. 내가 그것을 제거해야하지만 그것은 내 코드에 영향을 미치지 않습니다. – Paul

+0

그럴 경우, 마우스 이동 핸들러의 범위를 벗어나서 가장 최근의 _applied_ 변경 사항을 포함하는 다른 버퍼가 필요하며 드래그 된 선을 그리기 전에 'hdc'대신 데이터를 복사해야합니다. 이 문제를 해결하기 바랍니다. –

0

backbuffer를 사용하지 않고 이것을 설계하는 한 가지 방법은 매번 그릴 때마다 동적 인 라인 목록을 유지하는 것입니다. , WM_LBUTTONDOWN

  • 시작으로 현재 위치와 함께 목록에 새 행을 추가

    귀하의 메시지 시저는 다음과 같이 볼 수 있었다.

  • WM_MOUSEMOVE (왼쪽 버튼이 눌린 상태)에서 목록의 최신 줄의 끝 위치를 현재 마우스 위치로 변경하십시오.

각 다시 그리기에서 목록을 반복하고 각 선을 그립니다.

+0

네, 맞습니다. 그런 목록은 사용할 수 없습니다. 요구 사항은 어떻게 든 세 번째 버퍼를 사용하여 특정 시간에만 배경을 저장하는 것이고, 언제 알아 내려고합니다. – Paul

+0

OK, 마우스를 놓을 때마다 동일한 원리와 BitBlt를 백 버퍼에 사용할 수 있습니다. 그런 다음, 처음 BitBlt를 백 버퍼에서 프론트 버퍼로 가져온 다음 현재 줄을 앞으로 당깁니다. –

관련 문제