본문 바로가기
컴퓨터/MFC_API

CRichEditCtrl 사용하기

by adnoctum 2012. 5. 14.



   CRichEditCtrl 을 MFC 내에서 사용할 때 몇 가지 고려사항에 대해 살펴 보자. (개인적으로 나중에 다시 MSDN 찾지 않기 위해 작성, ㅋ)



1. control을 손수 넣어 사용할 때 application 차원에서 호출해야 하는 함수 :  AfxInitRichEdit();

2. focus 를 가질 때 전체 선택이 되는 문제. 
3. LineIndex 와 LineLength
4. vertical scroll bar 가 보이지 않는 문제. 


1. control을 손수 넣어 사용할 때 application 차원에서 호출해야 하는 함수 :  AfxInitRichEdit();


   View를 CRichEditView를 상속받아 사용할 때는 default code 를 실행시켜도 아무 문제 없이 rich edit control의 기능을 사용할 수 있음에도 불구하고 dialog-based app.이나 코드로 CRichEditCtrl 을 집어 넣으려고 할 때, debug mode에서 실행시킬 때 memory leak 이 생기면서 프로그램이 곧바로 중단된다. 이 문제는, rich edit control의 기능을 사용하기 위해서는 AfxInitRichEdit() 를 호출해주면 해결할 수 있다. 즉, rich edit 의 여러 기능을 사용하기 위한 초기화라고 볼 수 있다.



2. focus 를 가질 때 전체 선택이 되는 문제. 

   수정. focus 를 가질 때 전체 내용이 선택되는 것은 Rich edit control의 option 중 ECO_SAVESEL 이 설정되어 있기 때문이다. 따라서 이 설정을 없애 주면 이렇게 작동하지 않는다. 즉, rich edit control이 focus 를 가질 때 전체 내용이 선택되지 않게 하기 위해서는 다음과 같이 한다.

    _recSourceText.SetOptions(ECOOP_XOR, ECO_SAVESEL);


위에서 [_recSourceText] 는 CRichEditCtrl 형 변수이다.






3. LineIndex 와 LineLength.


   LineIndex 는 parameter N 으로 호출이 되었을 때 N+1 번째 line 의 시작 글자의 위치를 반환한다. 이 때 '위치'란 rich edit control 내용 중 그 글자가 가장 처음부터 몇 번째 글자인가에 해당하는 index 이다. LineLength 는 parameter N 으로 주어지는 N+1 번째 글자가 속해 있는 줄(line)의 길이를 반환해 준다. LineLength 의 경우 N+1 번째 줄의 길이, 로 착각하기 쉬운데, 그것이 아니라 N+1번째 글자가 속한 줄의 길이이다. 약간 혼란스럽다. MSDN의 설명에는 정확히 이렇게 나와 있다. 

Specifies the character index of a character in the line whose length is to be retrieved. - MSDN





4. vertical scroll bar 가 보이지 않는 문제. 

   이것 역시 원인을 알 수 없지만, vertical scroll bar 가 보여야 할 때 보이지 않는 경우도 있다. 즉, WS_VSCROLL 이나 ES_VSCROLL, ES_AUTOVSCROLL 을 설정해 주었고 control 안의 내용이 control 안에서 한 번에 보이는 내용보다 많아서 vertical scroll bar 가 나타나야 하는 상황에도 나타나지 않는 경우도 있다. 지금 디버깅 중 엔터를 지속적으로 입력해서 scroll bar 가 나와야 할 상황에 나오지 않다가, 전체 선택을 해서 전부 지운 후 다시 똑같은 작업을 하면 scroll bar 가 나타나는 것을 경험했다. 두 경우 rich edit control 이 받는 메세지를 spy++ 로 확인해 보면 다음과 같다. 



scroll bar가 나타났을 때의 메세지scroll bar가 나타났을 때의 메세지



scroll bar가 나타나지 않았을 때의 메세지scroll bar가 나타나지 않았을 때의 메세지



두 경우에 있어, 회색으로 선택된 부분부터 메세지가 차이가 나기 시작한다. 왜 이런 현상이 발생했는지를 잘 모르겠고, 여하튼, 이런 문제를 해결하기 위해서는 ShowScrollBar로 강제로 scroll bar 를 보여주거나, Disable No Scroll 속성을 true; 로 주어 항상 scroll bar 가 보이도록 한다.