. 현재행 숨기기

bHideCurLine 옵션은 포커스를 잃었을 때 현재행 표시를 어떻게 할 것인가를 지정한다. bHideSelType 변수가 포커스가 없을 때 선택영역을 어떻게 처리할 것인가를 지정하는 것처럼 말이다. 현재행을 보여주는 반전막대나 사각 프레임은 문서를 편집하고 있을 때만 사용되는 참고 정보이므로 포커스가 없을 때는 숨기는 것이 더 깔끔해보인다. 이 옵션은 포커스를 잃었을 때의 현재행 처리 방식을 지정하므로 현재행 표시를 어떤 방식으로 보여줄 것인지를 지정하는 nShowCurLine과는 다르다. 현재행 표시를 출력하는 DrawLine 함수에서 이 옵션을 다음과 같이 적용한다.

 

int CApiEdit::DrawLine(HDC hdc, int Line)

{

     ....

     if (bComp) {

          toff=off-2;

     } else {

          toff=off;

     }

     GetRCFromOff(toff,r,c);

    if (r==Line && (bHideCurLine==FALSE || GetFocus()==hWnd)) {

          bCurLine=TRUE;

     }

 

현재행 표시가 출력되려면 일단 지금 출력하는 줄이 현재 오프셋이 있는 줄, 즉 현재줄이어야 한다. 그리고 현재행 숨기기 옵션이 선택되어 있지 않거나 아니면 포커스를 가지고 있어야 한다. 그 외의 경우 즉, bHideCurLine TRUE이고 현재 포커스를 가지고 있지 않으면 비록 현재행을 그리고 있는 중이더라도 현재행이 아닌 것처럼 만든다. 이 옵션에 따라 bCurLine 지역변수만 조작하면 DrawLine의 나머지 코드들이 현재줄이 아닌 것으로 속아서 현재행을 표시하지 않게 된다.

이 옵션이 들어감에 따라 현재행 표시도 선택 블록처럼 포커스 변화가 있을 때 다시 그려 주도록 해야 한다. 포커스를 읽으면 현재행을 숨기고 다시 포커스를 얻으면 현재행 표시를 출력하도록 한다. 다음 두 함수에 코드를 작성한다.

 

void CApiEdit::OnSetFocus(HWND hWnd, HWND hwndOldFocus)

{

     SetCaret(FALSE);

 

     SelFore=GetSysColor(COLOR_HIGHLIGHTTEXT);

     SelBack=GetSysColor(COLOR_HIGHLIGHT);

 

     if ((HideSelType != 2 && SelStart != SelEnd) ||

        (bHideCurLine == TRUE && nShowCurLine != 0)) {

          Invalidate(-1);

     }

}

 

void CApiEdit::OnKillFocus(HWND hWnd, HWND hwndNewFocus)

{

     DestroyCaret();

 

     if (HideSelType != 2) {

          SelFore=RGB(0,0,0);

          SelBack=RGB(192,192,192);

     }

     if ((HideSelType != 2 && SelStart != SelEnd) ||

        (bHideCurLine == TRUE && nShowCurLine != 0)) {

          Invalidate(-1);

     }

}

 

선택영역의 색상 외에 현재행 보기 상태에도 변화가 있으면 화면 전체를 다시 그리도록 하였다. 단 현재행이 아예 표시되지 않는 상태이거나 현재행 숨기기 옵션이 선택되어 있지 않다면 다시 그릴 필요가 없다.