RTF 문서를 보여주기 위해서 MFC에서 제공하는 리치에디터2.0 (RICHEDIT20A) 을 사용해보면 약간의 문제점이 생깁니다.
그런데 워드패드에서 사용하는 RICHEDIT50W 는 그런 문제점이 생기지 않죠.
본 포스팅에서는 워드패드에서 사용하고 있는 RICHEDIT50W를 MFC 프로젝트에 적용하는 방법을 알아봅니다.
그런데 워드패드에서 사용하는 RICHEDIT50W 는 그런 문제점이 생기지 않죠.
본 포스팅에서는 워드패드에서 사용하고 있는 RICHEDIT50W를 MFC 프로젝트에 적용하는 방법을 알아봅니다.
먼저, MS 워드에서 아래와 같이 하이퍼링크를 삽입한 RTF 문서를 만듭니다.
문서를 만들었으면 C:\ 에 help.rtf 라고 저장을 합니다.
그리고 MFC 다이얼로그 베이스로 프로젝트를 하나 만든 후, rich edit 2.0 을 넣고 help.rtf 문서를 불러봅니다.
그럼 위와 같이 링크가 함께 노출되는 것을 알 수 있습니다. 왜 이럴까요..
워드패드에서 불러보면 아래와 같이 MS 워드에서 작성한 것과 같이 나옵니다.
일단, 두 리치에디터가 어떤 종류로 구성된 것인지 클래스를 살펴보겠습니다.
워드패드의 리치에디터
MFC의 리치에디터
레이아웃메니저로, 각 리치에디터의 클래스이름을 보니 워드패드는 RICHEDIT50W 를 사용하고 있고, MFC 에서 사용하는 RichEdit20A 를 사용하고 있습니다.
따라서 워드패드와 같이 제대로 링크를 출력하려면 모르긴 몰라도 워드패드에서 사용하고 있는 RICHEDIT50W로 바꾸면 될 듯 합니다.
자, 이제 본격적으로 실습을 한번 해보겠습니다.
MFC 프로젝트를 만든 후 다이얼로그에 rich edit 2.0 을 가져다 놓습니다.
MFC 에서 rich edit control 을 사용하기 위해서는 프로그램 초반에 아래의 초기화 코드를 추가합니다.
48 AfxInitRichEdit2();
위의 코드는 단순히 rich edit 2.0 을 사용하기 위해 RICHED20.DLL 을 로드하는 역활을 합니다.
그리고 링크 부분에 마우스를 올릴 때 손 모양 아이콘으로 보여주기 위해서는 아래의 코드를 추가합니다.
107 m_rich.SetAutoURLDetect(TRUE);
마지막으로 클릭했을 때 링크 URL 로 이동하기 위해서는 아래의 코드와 이벤트 핸들러를 하나 추가합니다.
109 m_rich.SetEventMask( m_rich.GetEventMask() | ENM_LINK);
이벤트 핸들러가 만들어 졌으면 마우스업 메세지 일때 URL 을 오픈하는 코드를 살포시 넣어주세요.
170 void CRichEdit50WDlg::OnEnLinkRichEdt(NMHDR *pNMHDR, LRESULT *pResult)
171 {
172 ENLINK *pEnLink = reinterpret_cast<ENLINK *>(pNMHDR);
173
174 if ( pEnLink->msg == WM_LBUTTONUP )
175 {
176 CString url;
177 m_rich.GetTextRange(pEnLink->chrg.cpMin, pEnLink->chrg.cpMax, url);
178 ShellExecute(m_hWnd, L"Open", url, NULL, NULL, SW_MAXIMIZE);
179 }
180
181 *pResult = 0;
182 }
자, 이것으로 일단 MFC에서 제공하는 rich edit 2.0 을 사용한 프로그램은 완성하였습니다. 그러면 이제 RICHEDIT50W 로 바꾸는 일만 남았군요.
제일 먼저 해야 할 일은 다이얼로그에 있는 rich edit 2.0 의 ID 값을 복사한 후, 삭제합니다. 그리고 그 자리에 커스텀 컨트롤을 올려놓습니다.
그리고 속성란에는 아래와 같이 수정합니다.
ID 는 아까 복사해뒀던 것을 그대로 붙혀넣기 하고, Class 는 RICHEDIT50W 로 Style 은 0x540081c4, Extended Style 은 0x00000210 으로 수정합니다.
(만약 rich edit 가 클라이언트 전체화면이라면 Style 을 0x550081c4 로 해야 합니다.)
그리고 리치에디터 초기화 코드로 삽입했던 AfxInitRichEdit2() 를 삭제하고 msftedit.dll 을 로딩합니다.
로드할 때 반환된 핸들을 가지고 있을 필요는 없습니다. 단순히 RICHEDIT50W 윈도우를 생성하기 위해 필요한 DLL 이기 때문에 로드만 시키면 됩니다.
48 // AfxInitRichEdit2();
49 LoadLibraryW(L"msftedit.dll");
이제 다 되었습니다.
컴파일 한 후 실행을 해보면 워드패드와 똑같이 나타나는 것을 확인할 수 있으며 링크를 클릭했을 때도 웹페이지가 잘 열리는 것을 확인할 수 있습니다.
최근 댓글