< ¸®Ä¡ ¿¡µðÆ® >

WTL¿¡¼­´Â °ø¿ë ÄÁÆ®·ÑÀÇ ¸®Ä¡ ¿¡µðÆ® ÄÁÆ®·ÑÀ» CRichEditCtrlT À̶ó°í ÇÏ´Â ÅÛÇø´ Ŭ·¡½º¿¡¼­ ĸ½¶È­Çϰí ÀÖ½À´Ï´Ù. ÅÛÇø´ Àμö¿¡´Â Ŭ·¡½º¸¦ ÁöÁ¤ÇÕ´Ï´Ù¸¸  ±× Ŭ·¡½º´Â CRichEditCtrlTŬ·¡½ºÀÇ base class·Î¼­ »ç¿ëµË´Ï´Ù.  atlctrls.h Çì´õ¿¡¼­´Â typedef¿¡ ÀÇÇØ ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ°í ÀÖ½À´Ï´Ù.

// atlctrls.h

typedef CRichEditCtrlT<ATL::CWindow>   CRichEditCtrl;

                      


À̰ÍÀº CRichEditCtrl Ŭ·¡½º´Â CWindow Ŭ·¡½ºÀÇ »ó¼Ó Ŭ·¡½ºÀÎ °ÍÀ» ÀǹÌÇÕ´Ï´Ù.

¡¡WTL
ÀÇ CRichEditCtrlŬ·¡½º´Â MFCÀÇ µ¿¸íÀÇ Å¬·¡½º¿Í °ÅÀÇ °°Àº ¸â¹ö ÇÔ¼ö¸¦ ÁغñÇØ ÀÖ´Â °Í ¿Ü¿¡ ¸®Ä¡ ¿¡µðÆ® ÄÁÆ®·ÑÀÇ ¹öÁ¯2.0°ú 3.0¿ëÀÇ ¸â¹ö ÇÔ¼öµµ °®Ãß°í ÀÖ½À´Ï´Ù. ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CRichEditCtrlŬ·¡½º¸¦ »ç¿ëÇÏ´Â ¿¹ ÀÔ´Ï´Ù. ¸®Ä¡ ¿¡µðÆ® ÄÁÆ®·Ñ»ó¿¡¼­ ¿À¸¥ÂÊ Å¬¸¯ÇÏ¸é  pop-up menu°¡ Ç¥½ÃµÇ¾î [°­Á¶ ½ºÅ¸ÀÏ·Î ÇÏ´Â]À» ¼±ÅÃÇÏ¸é ¸®Ä¡ ¿¡µðÆ® ÄÁÆ®·Ñ »óÀÇ ¼±Åà ºÎºÐÀÌ ºÓÀº ±½Àº ±Û¾¾°¡ µË´Ï´Ù.

 

// stdafx.h

// ¸®Ä¡ ¿¡µðÆ® ÄÁÆ®·ÑÀÇ ¹öÁ¯1.0À» »ç¿ëÇÏ´Â °ÍÀ» Á¤ÀÇ

#define _RICHEDIT_VER  0x0100

 

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

#include <atlctrls.h>  // ÄÁÆ®·Ñ¿ë Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§ÇØ

                      

 

// maindlg.h

class CMainDlg : public CDialogImpl<CMainDlg>

{

public:

    enum { IDD = IDD_MAINDLG };

 

    CRichEditCtrl m_rich_emphasis;  // ¸®Ä¡ ¿¡µðÆ®

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        MSG_WM_CONTEXTMENU(OnContextMenu)

        COMMAND_ID_HANDLER_EX(ID_MENUITEM_DEFAULT, OnMenuDefault)

        COMMAND_ID_HANDLER_EX(ID_MENUITEM_EMPHASIS, OnMenuEmphasis)

        COMMAND_ID_HANDLER_EX(IDOK, OnOK)

        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)

    END_MSG_MAP()

 

    LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){

        // ½ºÅ©¸°ÀÇ Áß¾Ó¿¡ ¹èÄ¡

        CenterWindow();

 

        // Å« ¾ÆÀÌÄÜ ¼³Á¤

        HICON hIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,

            ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON));

        SetIcon(hIcon, TRUE);

       

        // ÀÛÀº ¾ÆÀÌÄÜ ¼³Á¤

        HICON hIconSmall = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,

            ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON));

        SetIcon(hIconSmall, FALSE);

 

        // ÄÁÆ®·Ñ ¼³Á¤

        m_rich_emphasis = GetDlgItem(IDC_RICHEDIT_EMPHASIS);

 

        return TRUE;

    }

 

    void OnContextMenu(HWND hWnd, CPoint pt){

        // [Shift]+[F10]۰¡ ¹Ð·ÈÀ» °æ¿ì´Â ÁÂÇ¥¸¦ ¼±Åà ij¸¯ÅÍ ¶óÀÎÀÇ ¸¶Áö¸·¿¡ ¼³Á¤

        if(pt.x == -1 && pt.y == -1){

            LONG start, end;

            m_rich_emphasis.GetSel(start, end);

            pt = m_rich_emphasis.PosFromChar(end);

            m_rich_emphasis.ClientToScreen(&pt);

        }

 

        // ÁÂÇ¥°¡ ¸®Ä¡ ¿¡µðÆ® ÄÁÆ®·Ñ³»ÀÇ °æ¿ì¸¸ pop-up menu¸¦ Ç¥½Ã

        CRect rc;

        m_rich_emphasis.GetClientRect(&rc);

        m_rich_emphasis.ClientToScreen(&rc);

        if(rc.PtInRect(pt)){

            CMenu menuPopup;

            menuPopup.LoadMenu(IDR_MENU_POPUP);

            menuPopup.GetSubMenu(0).TrackPopupMenu(

                TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON, pt.x, pt.y, m_hWnd);

        }else{

            SetMsgHandled(false);

        }

    }

 

    void OnMenuDefault(UINT uNotifyCode, int nID, HWND hWndCtl){

        CString strText;

        if(m_rich_emphasis.GetSelText(strText) != 0){

            CHARFORMAT cf = {sizeof(CHARFORMAT)};

            m_rich_emphasis.GetDefaultCharFormat(cf);

            m_rich_emphasis.SetSelectionCharFormat(cf);

        }

    }

 

    void OnMenuEmphasis(UINT uNotifyCode, int nID, HWND hWndCtl){

        CString strText;

        if(m_rich_emphasis.GetSelText(strText) != 0){

            CHARFORMAT cf = {sizeof(CHARFORMAT)};

            cf.dwMask = CFM_COLOR | CFM_BOLD;

            cf.dwEffects = CFE_BOLD;

            cf.crTextColor = RGB(255, 0, 0);

            m_rich_emphasis.SetSelectionCharFormat(cf);

        }

    }

 

    void OnOK(UINT uNotifyCode, int nID, HWND hWndCtl){

        EndDialog(nID);

    }

 

    void OnCancel(UINT uNotifyCode, int nID, HWND hWndCtl){

        EndDialog(nID);

    }

};

                      

 

// Control.cpp

#include "stdafx.h"

 

#include "resource.h"

 

#include "maindlg.h"

 

CAppModule _Module;

 

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int nCmdShow)

{

    // ¸®Ä¡ ¿¡µðÆ® ÄÁÆ®·Ñ ÃʱâÈ­

    HINSTANCE hRich = LoadLibrary(CRichEditCtrl::GetLibraryName());

    if(hRich == NULL){

        AtlMessageBox(NULL, _T("¸®Ä¡ ¿¡µðÆ® ÄÁÆ®·Ñ ÃʱâÈ­ ½ÇÆÐ"),

            _T("¿¡·¯"), MB_OK | MB_ICONERROR);

        return 0;

    }

 

    HRESULT hRes = ::CoInitialize(NULL);

    ATLASSERT(SUCCEEDED(hRes));

 

    ::DefWindowProc(NULL, 0, 0, 0L);

 

    AtlInitCommonControls(ICC_COOL_CLASSES | ICC_WIN95_CLASSES);

 

    hRes = _Module.Init(NULL, hInstance);

    ATLASSERT(SUCCEEDED(hRes));

 

    int nRet = 0;

    // BLOCK: ¾îÇø®ÄÉÀÌ¼Ç ½ÇÇà

    {

        CMainDlg dlgMain;

        nRet = dlgMain.DoModal();

    }

 

    _Module.Term();

    ::CoUninitialize();

 

    FreeLibrary(hRich);

 

    return nRet;

}

                      


¡¡
¿ì¼±  ¸®¼Ò½º¸¦ ÀÛ¼ºÇÕ´Ï´Ù. ´ÙÀ̾ó·Î±×¿¡ ¸®Ä¡ ¿¡µðÆ® ÄÁÆ®·ÑÀ» ¹èÄ¡ÇØ  ¸®¼Ò½º ID¸¦ ´ÙÀ½°ú °°ÀÌ ÁöÁ¤ÇÕ´Ï´Ù. µ¡ºÙ¿© ¸®Ä¡ ¿¡µðÆ® ÄÁÆ®·ÑÀÇ [½ºÅ¸ÀÏ]¿¡¼­´Â µðÆúÆ®¿¡ [º¹¼öÇà], [¼öÆò ½ºÅ©·Ñ ¹Ù], [¼öÁ÷ ½ºÅ©·Ñ ¹Ù], [¼öÁ÷ ¿ÀÅä ½ºÅ©·Ñ], [°³ÇàÀ» Çã°¡]¿¡ üũ¸¦ ³Ö½À´Ï´Ù.

ÄÁÆ®·Ñ¸í

¸®¼Ò½ºID

¸®Ä¡ ¿¡µðÆ®

IDC_RICHEDIT_EMPHASIS


°Ô´Ù°¡ pop-up menu¸¦ À§ÇÑ ¸Þ´º ÀÚ¿øÀ» ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡ÇÕ´Ï´Ù. ¸Þ´º ¸®¼Ò½º ID´Â IDR_MENU_POPUPÀ¸·Î Çϸç Åé ·¹º§¿¡ [index0]¸¦  ±× ¾Æ·¡¿¡ [µðÆúÆ® ½ºÅ¸ÀÏ¿¡ µÇµ¹¸®´Â] ¸Þ´º ¾ÆÀÌÅÛ°ú [°­Á¶ ½ºÅ¸ÀÏ·Î ÇÏ´Â] ¸Þ´º ¾ÆÀÌÅÛÀ» Ãß°¡ÇÕ´Ï´Ù. ¾ÆÀÌÅÛ¿¡´Â °¢°¢ ID_MENUITEM_DEFAULTID_MENUITEM_EMPHASIS¶ó°í ÇÏ´Â ID¸¦ ¼³Á¤ÇÕ´Ï´Ù.



¡¡
´ÙÀ½¿¡ stdafx.h¿¡¼­´Â CRichEditCtrl Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ­ atlctrls.h Çì´õ¸¦ Æ÷ÇÔ ÇÕ´Ï´Ù. ±×¸®°í  À̹ø ¿¹ ¿¡¼­´Â ¹öÁ¯1.0ÀÇ ¸®Ä¡ ¿¡µðÆ® ÄÁÆ®·ÑÀ» »ç¿ëÇϹǷΠ _RICHEDIT_VER ¸¦  0x0100 ¿¡ Á¤ÀÇÇÕ´Ï´Ù. µ¡ºÙ¿© À̰ÍÀº AppWizardÀ» »ç¿ëÇÏ¸é µðÆúÆ®·Î Á¤Àǵǰí ÀÖ½À´Ï´Ù.

¡¡
CMainDlgŬ·¡½º¿¡¼­´Â ¸®Ä¡ ¿¡µðÆ® ÄÁÆ®·Ñ¿ëÀ¸·Î CRichEditCtrl Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¸â¹ö º¯¼ö·Î¼­ ¼±¾ðÇÕ´Ï´Ù. À̰ÍÀ» »ç¿ëÇϱâ À§Çؼ­´Â WM_INITDIALOG¸Þ¼¼Áö Çڵ鷯·Î ÄÁÆ®·ÑÀÇ ÇÚµéÀ» ´ëÀÔÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.

¡¡
´ÙÀ½¿¡ WM_CONTEXTMENU ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. ¿©±â¿¡¼­´Â ÁÂÇ¥°¡ ¸®Ä¡ ¿¡µðÆ® ÄÁÆ®·Ñ ³»ÀÎÁö ¾î¶²Áö¸¦ È®ÀÎÇØ  pop-up menu¸¦ Ç¥½ÃÇϰí ÀÖ½À´Ï´Ù.

¡¡
´ÙÀ½¿¡  pop-up menuÀÇ ¾ÆÀÌÅÛÀ» ¼±ÅÃÇßÀ» ¶§ÀÇ Ä¿¸àµå ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. [µðÆúÆ® ½ºÅ¸ÀÏ¿¡ µÇµ¹¸®´Â] (ID£ºID_MENUITEM_DEFAULT) ÀÇ Ä¿¸àµå ¸Þ¼¼Áö Çڵ鷯 OnMenuDefault()¿¡¼­´Â  GetDefaultCharFormat()¿¡ ÀÇÇØ µðÆúÆ®ÀÇ ¹®ÀÚ Æ÷¸ËÀ» ÃëµæÇØ  SetSelectionCharFormat()¿¡ ÀÇÇØ ¼±Åà ºÎºÐ¿¡ ±× Æ÷¸ËÀ» Àû¿ëÇϰí ÀÖ½À´Ï´Ù.

[
°­Á¶ ½ºÅ¸ÀÏ·Î ÇÏ´Â](ID£ºID_MENUITEM_EMPHASIS) ÀÇ Ä¿¸àµå ¸Þ¼¼Áö Çڵ鷯OnMenuEmphasis()¿¡¼­´Â , ºÓÀº ±½Àº ±Û¾¾¸¦ Ç¥½ÃÇϱâ À§ÇÑCHARFORMAT±¸Á¶Ã¼¸¦ ÀÛ¼ºÇØ , SetSelectionCharFormat()¿¡ ÀÇÇØ ¼±Åà ºÎºÐ¿¡ ±× Æ÷¸ËÀ» Àû¿ëÇϰí ÀÖ½À´Ï´Ù.

¸¶Áö¸·À¸·Î _tWinMain()¿¡¼­ ¸®Ä¡ ¿¡µðÆ® ÄÁÆ®·ÑÀ» ÃʱâÈ­ÇÕ´Ï´Ù. CRichEditCtrl::GetLibraryName()´Â _RICHEDIT_VER ÀÌ 0x0100ÀÇ °æ¿ì´Â_T("RICHED32.DLL")¸¦ ¸®ÅÏÇϸç 0x0200 ÀÌ»óÀÇ °æ¿ì´Â_T("RICHED20.DLL")À» ¸®ÅÏ ÇÕ´Ï´Ù.

¡¡
ÀÌ¿Í °°ÀÌ ¸®Ä¡ ¿¡µðÆ® ÄÁÆ®·ÑÀ» »ç¿ëÇÏ´Â °æ¿ì´Â _RICHEDIT_VERÀÇ °ª¿¡ »ç¿ëÇÏ´Â ¿¡µðÆ® ÄÁÆ®·ÑÀÇ ¹öÁ¯À» ÁöÁ¤ÇØ  LoadLibrary()¸¦ È£ÃâÇÏ´Â °Í¿¡ ÀÇÇØ ÃʱâÈ­¸¦ ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.