< °Ë»ö ġȯ ´ÙÀ̾ó·Î±× >¡¡
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 Çì´õ¸¦ ÀÎŬ·çµå ÇÕ´Ï´Ù.