BLOG main image
전체 (276)
[Computer] (42)
[Programming] (62)
[DBMS] (26)
[Operating System] (21)
[Study English] (8)
[For money] (28)
[Interest] (89)
«   2009/11   »
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          
77917 Visitors up to today!
Today 14 hit, Yesterday 95 hit
'리치에디트'에 해당되는 글 2건
[폭주기관차, 2007/11/07 17:41, [Programming]/Visual C++ API/MFC]
아래와 같은 코드를 View클래스의 OnCreate 함수에 아래와 같은 글꼴 변수 함수를 수행하도록 한다.

void ChangeFont(CString strFont, int iFontSize)
{
    CHARFORMAT2    cf;
    CRichEditCtrl &ctrlRich = GetRichEditCtrl();

    cf.cbSize          = sizeof(CHARFORMAT2);
    cf.dwMask          = //  CFM_CHARSET
                           CFM_FACE
                         | CFM_SIZE
                         | CFM_OFFSET
                         | CFM_COLOR
                         | CFM_PROTECTED
                         ;
    cf.dwEffects       = CFE_PROTECTED;
   
    // 데스크탑 모니터와 노트북 모니터의 픽셀 크기를 맞추기 위함
    cf.yHeight         = MulDiv( iFontSize,GetDeviceCaps(::GetDC(HWND_DESKTOP),LOGPIXELSY),72);
    cf.yHeight        *= (1440 / GetDeviceCaps(::GetDC(HWND_DESKTOP),LOGPIXELSY));

    cf.wWeight         = FW_NORMAL;
    cf.yOffset         = 0;
    cf.crTextColor     = RGB(255, 0, 0);
//    cf.bCharSet        = JOHAB_CHARSET;                       5시간 헤매게 한 코드
    cf.bPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
   
    strcpy( cf.szFaceName, strFont );   
       
    // 기본 폰트 변경
    ctrlRich.SetDefaultCharFormat  ( cf );
}


아마 이렇게 하면 한글은 제대로 나오는데 영문이 다른 글꼴(Arial), 혹은 영어/한글 모두 다른 글꼴로
나올 수도 있다.

그 이유는 RichEdit 2.0 이상부터는 자동으로 폰트를 변경해주는 옵션이 있기 때문이다.

아래와 같은 코드를 OnCreate맨위에 작성해주면 된다.

//////////////////////////////////////////////////////////////////////////
// 자동으로 영문 폰트 변경 방지
 ctrlRich.SendMessage( EM_SETLANGOPTIONS
                     , 0
                     , (LPARAM)(ctrlRich.SendMessage( EM_GETLANGOPTIONS, 0, 0 ) & ~IMF_AUTOFONT) );


이게 왜 디폴트로 설정되어있는지 -_-
아무튼 5시간 넘은 삽질 끝에 겨우 완성^^

출처 : 데브피아 답변

Trackback Address :: http://kongmks.cafe24.com/trackback/265
ccoder | 2009/03/09 22:23 | PERMALINK | EDIT/DEL | REPLY
더블로 감사합니다
BlogIcon 폭주기관차 | 2009/04/02 18:13 | PERMALINK | EDIT/DEL
도움 되셨길 바래요~^^
dokde | 2009/06/01 02:07 | PERMALINK | EDIT/DEL | REPLY
와 정말 감사합니다.
이것때문에 밤잠설치고 있었는데
한방에 해결햇네요
BlogIcon 폭주기관차 | 2009/09/14 16:18 | PERMALINK | EDIT/DEL
아 잘 해결 되었다니 다행이네요^^
Name
Password
Homepage
Secret
[폭주기관차, 2007/09/06 15:44, [Programming]/Visual C++ API/MFC]
리치에디트 콘트롤 2.0은 윈95부터 지원 되었지만,
왠일인지 마소는 2.0 콘트롤을 MFC 클래스나 VS 표준 콘트롤로 채용하지
않고 있습니다.
리치에디트 2.0은 undo/redo 기능도 있고, url 자동 감지 기능,
1.0 보다 텍스트에 훨씬 다양한 효과를 줄수도 있으며,
기타 1.0 보다 많은 풍부한 기능을 가지고 있습니다.

그래서, 단 몇 줄 만 추가하면 기존 MFC의 리치에디트 뷰나 콘트롤을
그대로 사용하면서도 리치에디트 2.0 콘트롤을 사용할 수 있는 방법을 알려드리겠습니다.
(다 이렇게 쓰고 있는지도 모르겠군요.^^)

어쨌든... 만약 RICH2View란 리치에디트 1.0 뷰를 상속한 뷰 클래스가 있다면 일단 그 클래스에

HINSTANCE m_hinstRichEdit2;


란 데이터 멤버를 추가합니다.

그런 후, 그 생성자에서 다음처럼 리치에디트 2.0 dll을 로드하고
앞서 추가한 멤버에 할당합니다.

RICH2View::RICH2View()
{
    // TODO: add construction code here

    m_hinstRichEdit2 = LoadLibraryA("RICHED20.DLL");
}


파괴자에서는 다음처럼 해제시키면 됩니다.

RICH2View::~RICH2View()
{
    if(m_hinstRichEdit2)
        FreeLibrary(m_hinstRichEdit2);
}


그런 후, PreCreateWindow(...) 에서 사용할 클래스 이름을 리치에디트 2.0 클래스로
바꿔치기 하는 겁니다. 다음처럼요.
BOOL RICH2View::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs
    
    AfxInitRichEdit();
        
    if(m_hinstRichEdit2)
    {
        #ifdef UNICODE
            m_strClass = "RichEdit20W";
        #else
            m_strClass = "RichEdit20A";
        #endif

        if(!CCtrlView::PreCreateWindow(cs))
            return FALSE;

        cs.lpszName = _T("");

        cs.cx = cs.cy = 100; // necessary to avoid bug with ES_SELECTIONBAR and zero for cx and cy

        cs.style |= WS_CLIPSIBLINGS;
      
        return TRUE;
    }
    else
    {
        AfxMessageBox(IDS_RICHEDIT2_LOAD_FAILED);

        return CRichEditView::PreCreateWindow(cs);
    }
}


그리고 마지막으로, OnDestroy() 에서 다음 내용을 코멘트 처리해주시면 됩니다.

 COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this);
 if (pActiveItem != NULL && pActiveItem->GetActiveView() == this)
 {
      pActiveItem->Deactivate();
      ASSERT(GetDocument()->GetInPlaceActiveItem(this) == NULL);
 }


확인은 스파이++로 찍어보시면 되겠죠.

출처 : 데브피아 조정환(chosmos)님의 글
Trackback Address :: http://kongmks.cafe24.com/trackback/248
Name
Password
Homepage
Secret
*1