RTF 문서를 보여주기 위해서 MFC에서 제공하는 리치에디터2.0 (RICHEDIT20A) 을 사용해보면 약간의 문제점이 생깁니다.

그런데 워드패드에서 사용하는 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");


이제 다 되었습니다.

컴파일 한 후 실행을 해보면 워드패드와 똑같이 나타나는 것을 확인할 수 있으며 링크를 클릭했을 때도 웹페이지가 잘 열리는 것을 확인할 수 있습니다.


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기