. OnPaint 수정

OnPaint는 화면출력을 담당하는 중요한 일을 하고 있는데 지금까지의 코드로는 문서 전체를 출력하도록 되어 있다. 이렇게 하더라도 화면 바깥으로 출력이 나가지는 않기 때문에 당장 눈에 띄는 문제점은 없으나 보이지도 않는 줄을 위해 루프를 도는 낭비를 하고 있으므로 실행 시간은 분명히 낭비된다. 문서 전체를 다 출력할 필요없이 화면에 보여질 부분만 출력하면 된다. 다음과 같이 OnPaint를 수정하도록 하자.

 

void OnPaint(HWND hWnd)

{

     HDC hdc;

     PAINTSTRUCT ps;

     int l;

    RECT crt;

    int s,e;

 

     hdc=BeginPaint(hWnd,&ps);

 

    GetClientRect(hWnd,&crt);

    s=yPos/LineHeight;

    e=s+crt.bottom/LineHeight;

 

    for (l=s;l<=e;l++) {

          if (DrawLine(hdc,l) == 0)

               break;

     }

     EndPaint(hWnd,&ps);

}

 

s,e 변수는 각각 출력 시작줄과 끝줄이다. s는 화면상의 첫 줄의 번호인데 현재 y스크롤 값인 yPos를 줄간으로 나누면 간단하게 구할 수 있다. e는 화면상의 끝줄인데 s에 작업영역의 높이를 줄간으로 나눈 값을 더한다. 이렇게 되면 e는 화면 아래쪽에 반쯤 걸쳐 있는 줄의 번호가 되는데 조금이라도 보이는 줄은 설사 일부분뿐일지라도 다 출력해야 한다.

출력 범위를 구한 후 s~e까지 루프를 돌며 각 줄을 출력하는데 이때 e 줄도 출력 대상이므로 e까지 출력해야 한다. , 화면의 길이와 상관없이 루프 중간에서 문서의 끝을 만날 수 있으므로 DrawLine의 리턴값은 계속 점검해야 한다. 당장 출력해야 할 필요가 있는 줄에 대해서만 DrawLine을 호출하므로 화면을 다시 그리는 속도가 향상될 것이다.

하지만 이 차이는 현재로서는 극히 미미하다. 왜냐하면 출력 시간의 대부분을 차지하는 TextOut 함수는 클리핑영역 바깥일 경우 아무것도 하지 않고 그냥 리턴하기 때문이다. 하지만 문서 길이가 길어질수록 더 많은 시간을 허비하게 될 것이며 단순한 출력 외에 문법강조 등의 기능이 들어가면 쓸데없는 내부 동작에 많은 시간을 뺏기게 된다.