케이피 2008. 5. 20. 01:13

캐럿

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);