< °Ë»ö ġȯ ´ÙÀ̾ó·Î±× >¡¡

WTL¿¡¼­  common dialogÀÇ °Ë»ö ´ÙÀ̾ó·Î±×¿Í ġȯ ´ÙÀ̾ó·Î±×¸¦  CFindReplaceDialogImplÀ̶ó°í ÇÏ´Â ÅÛÇø´ Ŭ·¡½º¿¡¼­ ĸ½¶È­Çϰí ÀÖ½À´Ï´Ù. ÀÌ Å¬·¡½º´Â ATLÀÇ CDialogImplŬ·¡½º¿Í °°ÀÌ  base class·Î¼­ÀÇ º¸°í »ç¿ëÇÕ´Ï´Ù.  atldlgs.h Çì´õ¿¡¼­´Â CFindReplaceDialogImplŬ·¡½ºÀÇ »ó¼Ó Ŭ·¡½º·Î¼­ CFindReplaceDialog Ŭ·¡½º°¡ Á¤Àǵǰí ÀÖ½À´Ï´Ù.

// atldlgs.h

class CFindReplaceDialog : public CFindReplaceDialogImpl<CFindReplaceDialog>

{

    ...

    ...

                      


¡¡WTL
ÀÇ CFindReplaceDialogŬ·¡½º´Â MFCÀÇ µ¿¸íÀÇ Å¬·¡½º¿Í °ÅÀÇ °°Àº ¸â¹ö ÇÔ¼ö¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù.  ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CFindReplaceDialog Ŭ·¡½º¸¦ »ç¿ëÇØ °Ë»ö ´ÙÀ̾ó·Î±×¿Í ġȯ ´ÙÀ̾ó·Î±×¸¦ ÀÛ¼ºÇÏ´Â ¿¹ÀÔ´Ï´Ù. ´ÙÀ̾ó·Î±×»óÀÇ ¿¡µðÆ® ÄÁÆ®·Ñ¿¡ ÀÔ·ÂµÈ Ä³¸¯ÅÍ ¶óÀο¡ ´ëÇØ °Ë»öÀ̳ª ġȯÀ» ½ÇÇàÇÕ´Ï´Ù.

 

 

// stdafx.h

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

#include <atlctrls.h>

#include <atldlgs.h>  // common dialog¸¦ »ç¿ëÇϱâ À§ÇØ(¶§¹®¿¡)

                      

 

// maindlg.h

class CMainDlg : public CDialogImpl<CMainDlg>

{

public:

    enum { IDD = IDD_MAINDLG };

 

    enum { MAX_LINE = 256};

    CEdit m_edit_line;

 

    bool m_bOpen;

 

    // constructor¡¡ ¡¡

    CMainDlg() : m_bOpen(false)

    {}

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MESSAGE_HANDLER_EX(CFindReplaceDialog::GetFindReplaceMsg(), OnFindReplace)

        MSG_WM_INITDIALOG(OnInitDialog)

        COMMAND_ID_HANDLER_EX(IDC_BUTTON_FINDDLG, OnButtonFindDlg)

        COMMAND_ID_HANDLER_EX(IDC_BUTTON_REPLACEDLG, OnButtonReplaceDlg)

        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_edit_line = GetDlgItem(IDC_EDIT_LINE);

 

        m_edit_line.LimitText(MAX_LINE - 1);

 

        return TRUE;

    }

 

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

        OpenFindReplaceDlg(TRUE);

    }

 

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

        OpenFindReplaceDlg(FALSE);

    }

 

    void OpenFindReplaceDlg(BOOL bFind){

        if(m_bOpen)

            return;

        m_bOpen = true;

 

        CFindReplaceDialog* pDlg = new CFindReplaceDialog;

        pDlg->Create(bFind, NULL, NULL,

            FR_HIDEWHOLEWORD | FR_HIDEMATCHCASE | FR_HIDEUPDOWN);

        pDlg->ShowWindow(SW_SHOW);

    }

 

    LRESULT OnFindReplace(UINT uMsg, WPARAM wParam, LPARAM lParam){

        CFindReplaceDialog* pDlg = CFindReplaceDialog::GetNotifier(lParam);

 

        // ´ÙÀ̾ó·Î±×°¡ ´ÝÇôÁ³À» °æ¿ì

        if(pDlg->IsTerminating()){

            m_bOpen = false;

            return 0;

        }

 

        TCHAR szLine[MAX_LINE];

        m_edit_line.GetWindowText(szLine, sizeof(szLine)/sizeof(TCHAR));

        const CString strLine = szLine;

 

        const CString strFind = pDlg->GetFindString();

        const CString strReplace = pDlg->GetReplaceString();

 

        if(pDlg->FindNext()){

            int nStartPos, nEndPos;

            nStartPos = nEndPos = 0;

            m_edit_line.GetSel(nStartPos, nEndPos);

 

            int nFindPos = strLine.Find(strFind, nEndPos);

            if(nFindPos != -1)

                m_edit_line.SetSel(nFindPos, nFindPos + strFind.GetLength());

        }else if(pDlg->ReplaceCurrent()){

            int nStartPos, nEndPos;

            nStartPos = nEndPos = 0;

            m_edit_line.GetSel(nStartPos, nEndPos);

 

            int nGap = 0;

            if((nEndPos - nStartPos) > 0){

                m_edit_line.ReplaceSel(strReplace);

                nGap = strReplace.GetLength() - strFind.GetLength();

            }

 

            int nFindPos = strLine.Find(strFind, nEndPos);

            if(nFindPos != -1){

                m_edit_line.SetSel(nFindPos + nGap,

                    nFindPos + strFind.GetLength() + nGap);

            }

        }else if(pDlg->ReplaceAll()){

            int nFindPos = 0;

            int nFindCount = 0;

            const int nGap = strReplace.GetLength() - strFind.GetLength();

            while((nFindPos = strLine.Find(strFind, nFindPos)) != -1){   

                m_edit_line.SetSel(nFindPos + nGap * nFindCount,

                    nFindPos + strFind.GetLength() + nGap * nFindCount);

                m_edit_line.ReplaceSel(strReplace);

                nFindCount++;

                nFindPos += strFind.GetLength();

            }

        }

 

        return 0;

    }

 

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

        EndDialog(nID);

    }

 

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

        EndDialog(nID);

    }

};

                      

 

// CommDlg.cpp

#include "stdafx.h"

 

#include "resource.h"

 

#include "maindlg.h"

 

CAppModule _Module;

 

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

{

    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();

 

    return nRet;

}

                      


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

ÄÁÆ®·Ñ¸í

¸®¼Ò½º ID

Ǫ½¬ ¹öư

IDC_BUTTON_FINDDLG

Ǫ½¬ ¹öư

IDC_BUTTON_REPLACEDLG

¿¡µðÆ®

IDC_EDIT_LINE


¡¡
´ÙÀ½¿¡ stdafx.h ¿¡¼­´Â atlctrls.h Çì´õ¿Í atldlgs.h Çì´õ¸¦ ÀÎŬ·çµå ÇÕ´Ï´Ù.

¡¡
CMainDlgŬ·¡½º¿¡¼­´Â ¿ì¼± enum¿¡ ÀÇÇØ ¿¡µðÆ® ÄÁÆ®·ÑÀÇ ÃÖ´ë ¹®ÀÚ¼ö¸¦ MAX_LINEÀ̶ó°í Á¤ÀÇÇÕ´Ï´Ù. ´ÙÀ½¿¡ ¿¡µðÆ® ÄÁÆ®·Ñ¿ëÀ¸·Î CEdit Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¸â¹ö º¯¼ö·Î¼­ ¼±¾ðÇÕ´Ï´Ù.  À̰͵éÀ» »ç¿ëÇϱâ À§Çؼ­´Â WM_INITDIALOG ¸Þ¼¼Áö Çڵ鷯·Î ÄÁÆ®·ÑÀÇ ÇÚµéÀ» ´ëÀÔÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ±×¸®°í °Ë»ö ¶Ç´Â ġȯ ´ÙÀ̾ó·Î±×°¡ ÇöÀç ¿­·Á ÀÖ´ÂÁö ¾î¶²Áö¸¦ ³ªÅ¸³»´Â Ç÷¡±× m_bOpen¸¦ ¼±¾ðÇÕ´Ï´Ù.  À̰ÍÀº constructor¿¡ ÀÇÇØ false ÃʱâÈ­ÇÕ´Ï´Ù.

¡¡
´ÙÀ½¿¡ WM_INITDIALOG ¸Þ¼¼Áö Çڵ鷯·Î  LimitText()¿¡ ÀÇÇØ ¿¡µðÆ® ÄÁÆ®·ÑÀÇ ÃÖ´ë ¹®ÀÚ¼ö¸¦ ¼³Á¤ÇÕ´Ï´Ù.

¡¡
´ÙÀ½¿¡ 2°³ÀÇ ¹öư ÄÁÆ®·Ñ¿ë Ä¿¸àµå ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ¸Þ¼¼Áö Çڵ鷯´Â ¾çÂÊ ¸ðµÎ OpenFindReplaceDlg()¶ó°í ÇÏ´Â µ¶ÀÚÀûÀÎ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. OpenFindReplaceDlg()´Â °Ë»ö ¶Ç´Â ġȯ ´ÙÀ̾ó·Î±×¸¦ ¿©´Â ÇÔ¼ö·Î Àμö¿¡BOOL°ªÀ» ¹Þ¾Æ TRUE¶ó¸é °Ë»ö ´ÙÀ̾ó·Î±×¸¦ FALSE À̶ó¸é ġȯ ´ÙÀ̾ó·Î±×¸¦ ¿±´Ï´Ù. µ¡ºÙ¿© ¹ú½á ¾î´À ÂÊÀΰ¡ÀÇ ´ÙÀ̾ó·Î±×°¡ ¿­·Á ÀÖ´Â °æ¿ì´Â ±»ÀÌ ÇÏÁö ¾Ê°í ¸®ÅÏ ÇÕ´Ï´Ù.

¡¡
°Ë»ö ¶Ç´Â ġȯ ´ÙÀ̾ó·Î±×´Â ¸ð´Þ¸®½º ´ÙÀ̾ó·Î±×ÀÔ´Ï´Ù.  ÀÌ ¶§¹®¿¡ CFindReplaceDialog Ŭ·¡½ºÀÇ ¿ÀºêÁ§Æ®´Â new¿¡ ÀÇÇØ  heap»ó¿¡ ÀÛ¼ºÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. (±×·¸°Ô ÇÏÁö ¾ÊÀ¸¸é OpenFindReplaceDlg() ÇÔ¼öÀÇ ½ºÄÚÇÁ¸¦ ºüÁ³À» ¶§¿¡ CFindReplaceDialogŬ·¡½ºÀÇ ¿ÀºêÁ§Æ®µµ ÆÄ±âµÇ¾î ¹ö¸³´Ï´Ù. )  °Ë»ö ¶Ç´Â ġȯ ´ÙÀ̾ó·Î±×¸¦ ÀÛ¼ºÇϱâ À§Çؼ­´Â Create()À» È£ÃâÇÕ´Ï´Ù.  Á¦1Àμö´Â BOOL °ªÀ¸·Î TRUE¶ó¸é °Ë»ö ´ÙÀ̾ó·Î±×¸¦ FALSE À̶ó¸é ġȯ ´ÙÀ̾ó·Î±×¸¦ ÀÛ¼ºÇÕ´Ï´Ù.  Á¦2Àμö¿¡´Â °Ë»öÇϴ ij¸¯ÅÍ ¶óÀÎ Á¦3Àμö¿¡´Â ġȯ ÈÄÀÇ Ä³¸¯ÅÍ ¶óÀÎ ,  Á¦4Àμö¿¡´Â Ç÷¡±× ,  Á¦5Àμö¿¡´Â ºÎ¸ð À©µµ¿ìÀÇ ÇÚµéÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ¾î Á¦3Àμö ÀÌÈÄ´Â »ý·« °¡´ÉÇÕ´Ï´Ù. µ¡ºÙ¿© À̹ø ¿¹¿¡¼­´Â ¿¹¸¦ ´Ü¼øÈ­ Çϱâ À§ÇÑ Ç÷¡±×¿¡ FR_HIDEWHOLEWORD, FR_HIDEMATCHCASE,  FR_HIDEUPDOWN¸¦ ÁöÁ¤Çß½À´Ï´Ù.

¡¡
´ÙÀ½¿¡  ¸Þ¼¼Áö ¸Ê¿¡ ´ÙÀ½°ú °°Àº ¿£Æ®¸®¸¦ Ãß°¡ÇÕ´Ï´Ù.

BEGIN_MSG_MAP_EX(CMainDlg)

    MESSAGE_HANDLER_EX(CFindReplaceDialog::GetFindReplaceMsg(), OnFindReplace)

    ...

    ...

                      


CFindReplaceDialog::GetFindReplaceMsg()´Â °Ë»ö ¶Ç´Â ġȯ ´ÙÀ̾ó·Î±×¿ëÀÇ ¸Þ¼¼Áö¸¦ µî·ÏÇØ ±× ¸Þ½ÃÁö ID¸¦ µ¹·ÁÁÝ´Ï´Ù.  ¸Þ¼¼Áö ¸Ê¿¡ ÀÇÇØ ÀÌ ¸Þ½ÃÁö ID¿Í OnFindReplace()¸¦ ¹­´Â °Í¿¡ ÀÇÇØ °Ë»ö ¶Ç´Â ġȯ ´ÙÀ̾ó·Î±×·ÎºÎÅÍ ¸Þ¼¼Áö°¡ ¹ß»ýÇϸé OnFindReplace()°¡ ºÒ·Á °¡°Ô µË´Ï´Ù.  ´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº ¸Þ¼¼Áö°¡ ¹ß»ýÇϴ ŸÀ̹ÖÀ̶ó°í  ¸Þ¼¼ÁöÀÇ Á¾·ù¸¦ ƯÁ¤ÇÏ´Â ¸â¹ö ÇÔ¼öÀÇ ´ëÀÀÇ¥ÀÔ´Ï´Ù.

ŸÀ̹Ö

¸â¹ö ÇÔ¼ö¸í

[´ÙÀ½À» °Ë»ö]¹öưÀ» ´­·¶À» ¶§

FindNext

[Ä¡È¯ÇØ ´ÙÀ½¿¡]¹öưÀ» ´­·¶À» ¶§

ReplaceCurrent

[¸ðµÎ ġȯ]¹öưÀ» ´­·¶À» ¶§

ReplaceAll

°Ë»ö ¶Ç´Â ġȯ ´ÙÀ̾ó·Î±×¸¦ ´Ù¹°¾úÀ» ¶§

IsTerminating


OnFindReplace() µ¿¾ÈÀ¸·Î´Â ÀÌ·¯ÇÑ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °Í¿¡ ÀÇÇØ ¾î´À ŸÀֿ̹¡ OnFindReplace()°¡ ºÒ·Á °¬´ÂÁö¸¦ ÆÇÁ¤ÇØ °¢°¢ÀÇ Å¸Àֿ̹¡ ÀÀÇÑ Ã³¸®¸¦ ½Ç½ÃÇϰí ÀÖ½À´Ï´Ù.

¡¡
±×·±µ¥ À§ÀÇ ¿¹¿¡¼­´Â CFindReplaceDialog Ŭ·¡½ºÀÇ ¿ÀºêÁ§Æ®´Â new¿¡ ÀÇÇØ ÀÛ¼ºÇÕ´Ï´Ù¸¸  delete¿¡ ÀÇÇØ ¿ÀºêÁ§Æ®¸¦ »èÁ¦Çϰí ÀÖ´Â Äڵ尡 ´«¿¡ ¶çÁö ¾Ê½À´Ï´Ù. À̰ÍÀº CFindReplaceDialog Ŭ·¡½ºÀÇ ¿ÀºêÁ§Æ®´Â °Ë»ö ¶Ç´Â ġȯ ´ÙÀ̾ó·Î±×¸¦ ´Ý¾ÒÀ» ¶§¿¡ ½º½º·Î¸¦ »èÁ¦Çϱ⠶§¹®ÀÔ´Ï´Ù.

CFindReplaceDialogImplŬ·¡½ºÀÇ »ó¼Ó Ŭ·¡½º¿¡ ¸Þ¼¼Áö ¸ÊÀ» ÁغñÇÏ´Â °Í¿¡ ÀÇÇØ °Ë»ö ġȯ ´ÙÀ̾ó·Î±×ÀÇ µ¿ÀÛÀ» Ä¿½ºÅÒ¸¶ÀÌÁî ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº WM_INITDIALOG ¸Þ¼¼Áö Çڵ鷯¿Í  GetFindReplaceMsg()¿¡ ÀÇÇÑ °Ë»ö ¶Ç´Â ġȯ ´ÙÀ̾ó·Î±× Àü¿ë ¸Þ¼¼Áö Çڵ鷯¸¦ ÁغñÇØ °Ë»ö ¶Ç´Â ġȯ 󸮸¦ ĸ½¶È­ÇÏ´Â µ¶ÀÚÀûÀÎ °Ë»ö ġȯ ´ÙÀ̾ó·Î±×¸¦ ÀÛ¼ºÇÏ´Â ¿¹ÀÔ´Ï´Ù.  ÀÌ °Ë»ö ġȯ ´ÙÀ̾ó·Î±×´Â ºÎ¸ð À©µµ¿ìÀÇ Áß¾Ó¿¡ Ç¥½ÃµË´Ï´Ù.  ÀÌ ¿¹¿¡¼­´Â CustomDlg.hÀ̶ó°í ÇÏ´Â Çì´õ ÆÄÀÏÀ» ÁغñÇØ °Å±â¿¡ CCustomDlg Ŭ·¡½º¸¦ Á¤ÀÇÇϰí ÀÖ½À´Ï´Ù.

// CustomDlg.h

class CCustomDlg : public CFindReplaceDialogImpl<CCustomDlg>

{

    static bool m_bOpenDlg;

    CEdit& m_edit;

 

public:

    // constructor¡¡ ¡¡

    CCustomDlg(CEdit& edit) : m_edit(edit){

        m_fr.Flags = m_fr.Flags | FR_HIDEWHOLEWORD | FR_HIDEMATCHCASE | FR_HIDEUPDOWN;

    }

 

    BEGIN_MSG_MAP_EX(CCustomDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        MESSAGE_HANDLER_EX(GetFindReplaceMsg(), OnFindReplace)

    END_MSG_MAP()

 

    LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){

        CenterWindow();

 

        m_bOpenDlg = true;

        m_fr.hwndOwner = m_hWnd;

 

        return TRUE;

    }

 

    LRESULT OnFindReplace(UINT uMsg, WPARAM wParam, LPARAM lParam){

        // ´ÙÀ̾ó·Î±×°¡ ´ÝÇôÁ³À» °æ¿ì

        if(IsTerminating()){

            m_bOpenDlg = false;

            return 0;

        }

 

        TCHAR* pLine = new TCHAR[m_edit.LineLength() + 1];

        m_edit.GetWindowText(pLine, m_edit.LineLength() + 1);

        const CString strLine = pLine;

        delete [] pLine;

 

        const CString strFind = GetFindString();

        const CString strReplace = GetReplaceString();

 

        if(FindNext()){

            int nStartPos, nEndPos;

            nStartPos = nEndPos = 0;

            m_edit.GetSel(nStartPos, nEndPos);

 

            int nFindPos = strLine.Find(strFind, nEndPos);

            if(nFindPos != -1)

                m_edit.SetSel(nFindPos, nFindPos + strFind.GetLength());

        }else if(ReplaceCurrent()){

            int nStartPos, nEndPos;

            nStartPos = nEndPos = 0;

            m_edit.GetSel(nStartPos, nEndPos);

 

            int nGap = 0;

            if((nEndPos - nStartPos) > 0){

                m_edit.ReplaceSel(strReplace);

                nGap = strReplace.GetLength() - strFind.GetLength();

            }

 

            int nFindPos = strLine.Find(strFind, nEndPos);

            if(nFindPos != -1)

                m_edit.SetSel(nFindPos + nGap, nFindPos + strFind.GetLength() + nGap);

        }else if(ReplaceAll()){

            int nFindPos = 0;

            int nFindCount = 0;

            const int nGap = strReplace.GetLength() - strFind.GetLength();

            while((nFindPos = strLine.Find(strFind, nFindPos)) != -1){   

                m_edit.SetSel(nFindPos + nGap * nFindCount,

                    nFindPos + strFind.GetLength() + nGap * nFindCount);

                m_edit.ReplaceSel(strReplace);

                nFindCount++;

                nFindPos += strFind.GetLength();

            }

        }

 

        return 0;

    }

 

    static bool IsOpen(){

        return m_bOpenDlg;

    }

};

 

bool CCustomDlg::m_bOpenDlg = false;

                      


CCustomDlgŬ·¡½ºÀÇ  constructorÀÇ Àμö¿¡´Â CEdit¿ÀºêÁ§Æ®ÀÇ ÂüÁ¶¸¦ ÁöÁ¤ÇÕ´Ï´Ù.  CCustomDlgŬ·¡½º´Â ¿©±â¼­ ÁöÁ¤ÇÑ ¿¡µðÆ® ÄÁÆ®·Ñ¿¡ ´ëÇØ¼­ °Ë»öÀ̳ª ġȯ 󸮸¦ ½Ç½ÃÇÕ´Ï´Ù.  OnInitDialog()¿¡¼­ m_bOpenDlgÀ̶ó°í ÇÏ´Â Á¤Àû ¸â¹ö º¯¼ö¿¡ true¸¦  ´ëÀÔÇÕ´Ï´Ù. ÀÌ º¯¼ö´Â °Ë»ö ¶Ç´Â ġȯ ´ÙÀ̾ó·Î±×°¡ ¿­·Á ÀÖ´ÂÁö ¾î¶²Áö¸¦ ³ªÅ¸³»´Â Ç÷¡±×ÀÔ´Ï´Ù.  ¿ÜºÎ·ÎºÎÅÍIsOpen()¸¦ È£ÃâÇÏ´Â °Í¿¡ ÀÇÇØ ÀÌ Ç÷¡±×ÀÇ °ªÀ» ÃëµæÇÒ ¼ö ÀÖ½À´Ï´Ù.  ±×¸®°í OnInitDialog()¿¡¼­ m_fr.hwndOwner¿¡ ÀÚ½ÅÀÇ ÇÚµéÀ» ´ëÀÔÇϰí ÀÖ½À´Ï´Ù.  À̰Ϳ¡ ÀÇÇØ °Ë»ö ¶Ç´Â ġȯ ´ÙÀ̾ó·Î±× Àü¿ëÀÇ ¸Þ¼¼Áö°¡ ÀÚ±â Àڽſ¡°Ô º¸³»Á® ¿É´Ï´Ù.  ¸Þ¼¼Áö°¡ º¸³»Á® ¿À¸é OnFindReplace()°¡ ºÒ·Á Áý´Ï´Ù.  ÀÌ ÇÔ¼ö¿¡¼­´Â constructorÀμö·Î ÁöÁ¤µÈ ¿¡µðÆ® ÄÁÆ®·Ñ¿¡ ´ëÇØ¼­ °Ë»öÀ̳ª ġȯ 󸮸¦ ½Ç½ÃÇÕ´Ï´Ù.

¡¡
´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº Àü¼úÀÇ CFindReplaceDialog Ŭ·¡½º¸¦ »ç¿ëÇÑ ÇÁ·Î±×·¥À» CCustomDlg Ŭ·¡½º¸¦ »ç¿ëÇØ °íÃÄ ¾²´Â ¿¹ÀÔ´Ï´Ù.

// stdafx.h

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

#include <atlctrls.h>

#include <atldlgs.h>  // common dialog¸¦ »ç¿ëÇϱâ À§ÇØ(¶§¹®¿¡)

                      

 

// maindlg.h

class CMainDlg : public CDialogImpl<CMainDlg>

{

public:

    enum { IDD = IDD_MAINDLG };

 

    enum { MAX_LINE = 256};

    CEdit m_edit_line;

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        COMMAND_ID_HANDLER_EX(IDC_BUTTON_FINDDLG, OnButtonFindDlg)

        COMMAND_ID_HANDLER_EX(IDC_BUTTON_REPLACEDLG, OnButtonReplaceDlg)

        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_edit_line = GetDlgItem(IDC_EDIT_LINE);

 

        m_edit_line.LimitText(MAX_LINE - 1);

 

        return TRUE;

    }

 

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

        OpenFindReplaceDlg(TRUE);

    }

 

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

        OpenFindReplaceDlg(FALSE);

    }

 

    void OpenFindReplaceDlg(BOOL bFind){

        if(CCustomDlg::IsOpen())

            return;

 

        CCustomDlg* pDlg = new CCustomDlg(m_edit_line);

        pDlg->Create(bFind, NULL);

        pDlg->ShowWindow(SW_SHOW);

    }

 

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

        EndDialog(nID);

    }

 

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

        EndDialog(nID);

    }

};

                      

 

// CommDlg.cpp

#include "stdafx.h"

 

#include "resource.h"

 

#include "CustomDlg.h"

#include "maindlg.h"

 

CAppModule _Module;

 

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

{

    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();

 

    return nRet;

}

                      


¡¡
OpenFindReplaceDlg() ¾È¿¡¼­ µ¶ÀÚÀûÀÎ °Ë»ö ġȯ ´ÙÀ̾ó·Î±×¸¦ ¿±´Ï´Ù.  ¿ì¼± CCustomDlg::IsOpen()¿¡ ÀÇÇØ ¹ú½á °Ë»ö ¶Ç´Â ġȯ ´ÙÀ̾ó·Î±×°¡ ¿­·Á ÀÖ´ÂÁö ¾î¶²Áö Ã¼Å©ÇØ ¿­·Á ÀÖÁö ¾ÊÀ¸¸é CCustomDlg Ŭ·¡½ºÀÇ ¿ÀºêÁ§Æ®¸¦ ÀÛ¼ºÇÕ´Ï´Ù.

¡¡
¸¶Áö¸·À¸·Î CommDlg.cpp ¾È¿¡¼­ maindlg.h Çì´õÀÇ ¾Õ¿¡ CustomDlg.h Çì´õ¸¦ ÀÎŬ·çµå ÇÕ´Ï´Ù.