2012-07-04 3 views
1

텍스트를 표시해야하는 mfc 응용 프로그램이 있습니다. 스크롤 막대를 사용할 때마다 OnDraw() 함수가 호출됩니다.mfc 응용 프로그램에서 텍스트 파일을 표시하는 동안 스크롤

CString fileText = pDoc->GetFileText(); //get text from file 
CRect rect; 
GetClientRect(&rect); 

pDC->DrawText(fileText.GetString(), &rect, DT_LEFT|DT_NOCLIP); 

이 스크롤 영원히 복용하기 때문에 비효율적 인 것 같다 : 이것은 내의 OnDraw() 함수입니다. 문제는 전체 텍스트 파일을 다시 칠하는 것입니다. GetClipBox 함수를 사용하여 필요한 것만 다시 그리기를 원합니다. 누구든지 진행 방법에 대한 제안을 할 수 있습니까?

감사합니다.

답변

1

여전히 전체 문자열을 오프 스크린 비트 맵에 그리기 때문에 이중 버퍼링이 도움이되지 않습니다. 당신이 원하는 것은 실제로 보여지고있는 문자열의 일부분만을 그리는 것입니다.

첫째, 각 줄의 높이가 같으면 10 배 쉽습니다 (인라인 이미지, 서식, 단락 간격 등과 같은 재미있는 요소가 없다고 가정합니다). 기본적으로 스크롤 막대의 총 줄 수까지의 길이를 구합니다 (예 : 1000 개의 줄이 있고 스크롤 막대가 50 %라고 가정하면 500 번째 줄부터 그리기 시작해야 함). 표시 할 수있는 텍스트의 줄 수 (각 줄의 높이로 컨트롤의 높이를 나눔으로써 쉽게 계산 됨).

그런 다음 문자열에서 해당 줄을 추출하면 DrawText()로만 전달됩니다. 이렇게하는 가장 쉬운 방법은 총 텍스트를 하나의 문자열이 아닌 문자열 벡터로 저장하는 것입니다.

끝까지 스크롤 할 때 표시 할 부분, 하프 라인을 표시 할 수있게 할 것인가 등의 세부 정보가 여전히 남아 있지만, 본질적으로 위의 내용은 그대로 유지됩니다. 아래로.

또한 각 OnDraw()의 파일에서 텍스트를 읽지 않기를 바랍니다. 혼자서 속도가 느려질 수 있기 때문입니다.

GetClipBox()는 실제로 관련이 없습니다. 1 픽셀 스크롤하는 경우에도 콘텐츠 창의 전체 콘텐츠를 다시 그리기를 원하기 때문입니다. 요점은 그려지는 화면의 크기를 제한하는 것이 아니라 DrawText()로 전달하는 것의 양을 줄이는 것입니다.

+0

전체 문자열을 다시 그릴 때 전체 문자열을 그릴 때 이중 버퍼링이 여전히 느려지는 것에 동의합니다. 그러나 스크롤링 만하면 문자열을 다시 그릴 필요가 없습니다. 메모리 비트 맵을 화면에 표시하면 꽤 빨라집니다. 나는 당신의 의견에 동의한다 - 전체 다시 그리기 속도를 높이려면 텍스트를 부분으로 나누고 그릴 필요가있는 부분을 찾아야한다. 어느 것이 까다 롭습니다. – Redeye

+0

글쎄, 내가 앞으로 줄을 텍스트를 분할하고 관련성이있는 것들만 그리는 것 같아요. 네가 말했듯이, 까다로울거야. 너의 대답을 고마워. – molu

0

귀하의 문제에 대한 최선의 해결책은 아마도 이중 버퍼링이라고 생각합니다. 기본적으로, 방금 화면의 업데이트 된 부분을 복사하고 상당히 성능을 향상해야하는

CRect rcUpdate; 
GetClipBox(rcUpdate); 
pDC->BitBlt(rcUpdate.left, rcUpdate.top, rcUpdate.Width(), rcUpdate.Height(), 
         m_pMemDC, rcUpdate.left, rcUpdate.top, SRCCOPY); 

를 호출하는 OnPaint()를 호출 한 후 때, 오프 스크린 비트 맵에 그림을한다.

나는 이전 질문 here의 이중 버퍼를 돕기 위해 몇 가지 코드를 게시했는데 도움이 될 것입니다. 여기에는 실제로 필요하지 않고 생략 할 수있는 GDI + 코드도 포함됩니다.

+0

답변 해 주셔서 감사합니다. 이중 버퍼링. 따르십시오 지시 [여기에서] (http://www.codeproject.com/Articles/33/Flicker-Free-Drawing-In-MFC). 작동하지 않습니다. 사실 더 심합니다. 저는 각각 약 10MB의 텍스트 파일로 작업하고 있습니다. GetClipBox() 유일한 방법 (내가 아는) 것 같다. 그러나 나는 그것에 대해 어떻게 해야할지 모른다. – molu

+1

이중 버퍼링 속도가 느리다는 것에 매우 놀랐습니다. 구현 어딘가에 문제가 있다고 가정 할 수 있습니다. 그러나 큰 텍스트 파일을 렌더링하는 데는 다른 접근 방식이 필요합니다. 아마도 GetClipBox()를 사용해야 할 것입니다.그런 다음 CRect에 대해 재 작성해야하는 텍스트를 확인하고 전체 문서가 아닌 화면에 그려야합니다. 그 문자열을 하위 문자열로 분해하고, 그 문자열을 작업하기 위해 그려지는 CRects의 목록을 유지해야한다고 생각합니다. 그러나 다른 누군가가 더 나은 접근법을 제안 할 수 있습니다. – Redeye

+0

또한 내가 언급 한 링크의 코드를 따라 가려고하면 그래픽에 오류가 발생합니다. VS2010에 알려지지 않은 식별자가 있습니다. 왜 그럴까요? – molu