[MFC] CEdit 에서 Enter를 통한 줄바꿈 적용

<출처> http://mainia.tistory.com/599

CEdit 컨트롤을 사용해 한줄이 아닌 여러줄의 멀티라인 글을 쓸수 있도록

설정해야 할 때가 있다. Properties  에서 Mutility Line 으로 변경한다고

해서 설정이 끝나는 것은 아니다. 아래의 내용을 참고 하기 바란다.

 

CEdit 박스에 Enter 키를 눌렀을때 줄바꿈을 적용하기 위해서는 우선

PreTranslateMessage 를 overriding 해야한다.  MSG 값중

WM_KEYDOWN 와 VK_RETURN 이 Enter 에 해당한다.

그리고 Edit 박스에 Focus 가 있는지 판단해서 줄바꿈을 적용한다.

BOOL CHelloDlg::PreTranslateMessage(MSG* pMsg) 
{
    if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
    {      
        if (GetDlgItem(IDC_EDIT1) == GetFocus())
        {
            //작업
        }
    }
}

그리고 작업이라고 쓰여진 주석에 아래 코드를 넣는다.

edit 에 들어간 문자열의 길이를 알아낸후 시작과 끝 문자값을 같은

값으로 선택한다(SetSel함수) 그 끝을 캐리지리턴(rn) 로

교체 하는 것이다.

CEdit* edit = (CEdit*)GetDlgItem(IDC_EDT_SPECIFIC);
int nLen = edit->GetWindowTextLength();
edit->SetSel( nLen, nLen );
edit->ReplaceSel( _T("rn") );

그리고 enter 를 계속 누르다가 edit 의 영역을 벗어날때 스크롤이 생기게

할려면 Auto VScroll 속성값을 True 로 변경한다.

 

그리고 스크롤이 보이게 할려면 Vertical Scroll 속성을 True로 변경해야한다

전체 소스는 다음과 같다

BOOL Dlg_ConfigBad::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
    {      
        if (GetDlgItem(IDC_EDT_SPECIFIC) == GetFocus())
        {
            CEdit* edit = (CEdit*)GetDlgItem(IDC_EDT_SPECIFIC);
            int nLen = edit->GetWindowTextLength();
            edit->SetSel( nLen, nLen );
            edit->ReplaceSel( _T("rn") );
        }
    }
 
    return CDialogEx::PreTranslateMessage(pMsg);
}