캐럿 '_'
캐럿
CWnd는 다음과 같이 7개의 캐럿 함수를 제공한다. 그리고 제공되지는 않지만 ::DestroyCaret 함수도 반드시 필요한 함수이다.
CreateCaret - 비트맵을 이용하여 캐럿을 만든다.
CreateSolidCaret - 실선 캐럿이나 블록 캐럿을 만든다.
CreateGrayCaret - 회색 선 캐럿이나 블록 캐럿을 만든다.
GetCaretPos - 캐럿의 위치를 얻는다.
SetCaretPos - 캐럿의 위치를 설정한다.
ShowCaret - 캐럿을 표시한다.
HideCaret - 캐럿을 감춘다.
** ::DestroyCaret 생성된 캐럿을 파괴한다.
캐럿은 동일한 스레드에서 실행되는 모든 창에 의해 공유되는 스레드 단위 자원이다.
캐럿을 사용하는 규칙은 다음과 같다.
1. 입력 포커스를 받을 때 캐럿을 만들어야 하고 입력 포커스를 잃을 때는 삭제해야 한다.
2. 캐럿이 만들어져 있다해도 ShowCaret를 해야 표시된다. HideCaret를 하면 숨길 수 있다.
HIdeCaret를 두번연속 했다면 ShowCaret도 두번해야 캐럿을 다시 볼 수 있다.
3. OnPaint 외부에서 캐럿을 포함하고 있는 창 영역을 그릴 때는 캐럿을 숨겨야 한다.
(안그러면 화면이 깨진다.)
OnPaint 안에서 캐럿을 숨기거나 다시 표시할 필요는 없다.
::BeginPain와 ::EndPaint가 알아서 해준다.
4. SetFocusPos로 캐럿을 이동시킬 수 있다.
즉, 윈도우가 자동으로 이동시켜주지 않는다. 프로그래머가 알아서 해야 한다.
캐럿의 폭을 찾 테두리의 폭에 맞추는 경우도 있다.
SM_CXBORDER 값과 함께 ::GetSystemMetrics를 호출하면 창 테두리의 폭을 알 수 있다.
고정폭 글꼴에서는 캐럿의 폭과 높이를 글자 하나의 크기와 같도록 할 수도 있다.
캐럿이동은 CWnd::SetCaretPos로 한다.
고정폭 글꼴은 문자의 위치에 한 문자의 폭을 곱하면 새로운 문자의 위치를 알 수 있다.
가변폭 글꼴은 CDC::GetTextExtent나 CDC::GetTabbedTextExtent 함수를 이용하여 논리적 단위로 가변폭 글꼴의 문자열 폭을 계산할 수 있다.
** CWnd나 CWnd를 상속받은 창에서 캐럿을 사용하려면 대단히 귀찮은 작업들을 많이 해줘야 한다. 따라서 웬만하면 CEdit와 같은 컨트롤로 해결하도록 한다.
그러나... CEdit와 같은 클래스로 할 수 없는 다양한 에디팅처리가 꼭 필요하다면 할수 없이 캐럿을 사용해야 한다.
RichEdit에서 캐럿을 포인트 단위로 보이게 할수는 있지만 실제로 위치 시킬순 없어!!!!!
변환 시키는 과정이 필요~!~!~!
CPoint ptCaret = m_richTest.GetCaretPos(); // 카렛의 위치를 구합니다.
int nChar;
// 카렛 위치에 해당하는 것이 몇 번째 글자인 지를 알아냅니다.
nChar = SendMessage(EM_CHARFROMPOS, 0, (LPARAM)&pt);
// 그 부분을 선택합니다. 시작과 끝이 같게 합니다.
GetRichEditCtrl().SetSel(nChar, nChar);