본문 바로가기

old drawer/C, C++, MFC

[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함수) 그 끝을 캐리지리턴(\r\n)

교체 하는 것이다.

 

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

 

그리고 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("\r\n") );
        }
    }
  
    return CDialogEx::PreTranslateMessage(pMsg);
}