공지사항»

최근 보관함»

« 2009/07 »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

RICHEDIT50W 를 사용해보자

프로그래밍/비쥬얼 C++ | 2009/06/25 01:51 | Posted by zextor
스폰서
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");


이제 다 되었습니다.

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


저작자 표시 비영리 변경 금지
이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License

TRACKBACK ADDRESS : http://zextor.tistory.com/trackback/2670069 관련글 쓰기

댓글을 달아 주세요

  1. BlogIcon Gungume 2009/06/26 13:02  댓글주소  수정/삭제  댓글쓰기

    아...글 좀만 일찍 올려주시지;;;
    저번에 물어봤던 TSF 때문에 RichEdit 최신버전 사용법 알아내느라 고생했었는데요 ㅎㅎ

    • BlogIcon zextor 2009/06/26 13:59  댓글주소  수정/삭제

      헐.. tsf 말구 richedit 문제도 있는지 몰랐네요..;;
      저도 포스팅전날에 회사프로젝트에 rtf 넣어야 되는데 링크가 나와서 이래저래 뻘짓거리하다가 찾은 방법이라..ㅎㅎ
      그나저나 richedit 최신버전 사용하는 방법은 뭔래요?
      (이번 포스팅껀 이게 최신버전인 건지도 모르겟고.. 그냥 링크주소없앨려고 한거라.. -_ㅡ;; )

  2. BlogIcon Gungume 2009/06/26 23:49  댓글주소  수정/삭제  댓글쓰기

    흠...최신버전이라는 표현이 애매했나요;;; 그냥 RichEdit 4.1 이상 버전을 말한거였는데요 ㅡㅡ;;;
    TSF 자료 찾다보니 RichEdit 4.1 이상에서는 기본적으로 TSF가 지원된다고 하길래 자료 좀 찾아보고 win32 api로 샘플 만들어봤거든요...그냥 MFC로 만들면 2.0으로 되는것 같길래요...
    근데 제가 쓴것이 4.1 버전인지 다른 버전인지 잘 모르겠네요...LM으로 찍어보면 RICHEDIT50W로 나오던데요...SDK 6.0인가 6.1에 들어있는거로 썼었어요;;;

    http://msdn.microsoft.com/ko-kr/magazine/cc187238.aspx
    심심하실 때 위의 주소 가보세요...TSF 지원 프로그램 만드는거에 대한 기사인데 중간에 RichEdit에 SendMessage 날려서 지원되게 하는 방법도 나와요 ㅎㅎ

    • BlogIcon zextor 2009/06/29 12:04  댓글주소  수정/삭제

      옹.. 그렇네요~;;
      4.1버전은 본적이 없는데..
      아마도 클래스이름이 richedit41w 일듯한데.. ㅎㅎ

      win32로 하면 용량이 확 줄어드니~ 더 좋은거죠..^^;;
      mfc는 개발할 때만 유리하다눙.. -_ㅡ;