< »ö ¼±Åà ´ÙÀ̾ó·Î±× >

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

// atldlgs.h

class CColorDialog : public CColorDialogImpl<CColorDialog>

{

    ...

    ...

                      


¡¡WTL
ÀÇ CColorDialog Ŭ·¡½º´Â MFCÀÇ  µ¿¸íÀÇ Å¬·¡½º¿Í °ÅÀÇ °°Àº ¸â¹ö ÇÔ¼ö¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù. ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CColorDialogŬ·¡½º¸¦ »ç¿ëÇÏ´Â ¿¹ÀÔ´Ï´Ù.

 

CColorDialog dlg(RGB(255, 0, 0));

 

if(dlg.DoModal() == IDOK){

    CString strMsg;

    strMsg.Format(_T("R£º%d\nG£º%d\nB£º%d"),

        GetRValue(dlg.GetColor()),

        GetGValue(dlg.GetColor()),

        GetBValue(dlg.GetColor()));

    MessageBox(strMsg);

}

                      


CColorDialog Ŭ·¡½ºÀÇ constructor Àμö´Â ¸ðµÎ »ý·« ÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸,  ¿©±â¿¡¼­´Â Á¦1Àμö¿¡´Â Ãʱ⠻óÅ·Π¼±Åõǰí ÀÖ´Â »ö(»¡°­) À» ÁöÁ¤ÇØ ÀÖ½À´Ï´Ù.  ÀÌ ¿Ü Á¦2Àμö¿¡´Â Ç÷¡±×, Á¦3Àμö¿¡´Â ºÎ¸ð À©µµ¿ìÀÇ ÇÚµéÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.

»ö ¼±Åà ´ÙÀ̾ó·Î±×¸¦ Ç¥½ÃÇϱâ À§Çؼ­´Â DoModal()À» »ç¿ëÇÕ´Ï´Ù.  [OK] ¹öưÀ» ´­·¯ »ö ¼±Åà ´ÙÀ̾ó·Î±×¸¦ ´Ý¾ÒÀ» °æ¿ì´Â,  ¹Ýȯ °ªÀ¸·Î¼­ IDOK°¡  [ĵ½½]À» ´­·¯ ´Ý¾ÒÀ» °æ¿ì´ÂIDCANCELÀÌ µÇµ¹¾Æ ¿É´Ï´Ù.

IDOK°¡ ¹ÝȯµÈ °æ¿ì´Â GetColor()À» È£ÃâÇÏ´Â °Í¿¡ ÀÇÇØ ¼±ÅÃµÈ »öÀ» ÃëµæÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

CColorDialog Ŭ·¡½ºÀÇ base classÀÎ CColorDialogImplŬ·¡½º´Â ¸Þ¼¼Áö ¸ÊÀ» ÁغñÇØ ÀÖ½À´Ï´Ù.  À̰ÍÀº ::RegisterWindowMessage(COLOROKSTRING)¿¡ ÀÇÇØ µî·ÏµÈ »ö ¼±Åà ´ÙÀ̾ó·Î±× Àü¿ëÀÇ ¸Þ¼¼Áö¸¦ ¸ÅÇÎ ÇÕ´Ï´Ù.  CColorDialogImplŬ·¡½º´Â ÀÌ ¸Þ¼¼Áö ¸ÊÀ» ¹ÞÀ¸¸é °£Á¢ÀûÀ¸·Î OnColorOK()¶ó°í ÇÏ´Â ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. OnColorOK()´Â »ö ¼±Åà ´ÙÀ̾ó·Î±×ÀÇ [OK] ¹öưÀ» ´­·¶À» ¶§¿¡ ºÒ·ÁÁ® CColorDialogImplŬ·¡½ºÀÇ »ó¼Ó Ŭ·¡½º´Â ÀÌOnColorOK()¸¦ ¿À¹ö¶óÀ̵å(override) Çϰųª  ¸Þ¼¼Áö ¸ÊÀ» ÁغñÇÏ´Â °Í¿¡ ÀÇÇØ »ö ¼±Åà ´ÙÀ̾ó·Î±×ÀÇ µ¿ÀÛÀ» Ä¿½ºÅÒ¸¶ÀÌÁî ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº WM_INITDIALOG ¸Þ¼¼Áö Çڵ鷯¸¦ ÁغñÇØ µ¶ÀÚÀûÀÎ »ö ¼±Åà ´ÙÀ̾ó·Î±×¸¦ ÀÛ¼ºÇÏ´Â ¿¹ÀÔ´Ï´Ù.  ÀÌ »ö ¼±Åà ´ÙÀ̾ó·Î±×´Â Ãʱ⠻óÅ·Π[»öÀÇ ÀÛ¼º] ¿µ¿ªÀ» Ç¥½ÃÇØ ºÎ¸ð À©µµ¿ìÀÇ Áß¾Ó¿¡ Ç¥½ÃµË´Ï´Ù.  ±×¸®°í [OK]¹öưÀ» ´©¸¥ ÈÄ ´ÙÀ̾ó·Î±×¸¦ ´Ý¾Ò´ÂÁö ¾î¶²ÁöÀÇ È®ÀÎ ´ÙÀ̾ó·Î±×¸¦ Ç¥½ÃÇÕ´Ï´Ù. ÀÌ ¿¹¿¡¼­´Â CustomDlg.hÀ̶ó°í ÇÏ´Â Çì´õ ÆÄÀÏÀ» ÁغñÇÏ¿© °Å±â¿¡ CustomDlgŬ·¡½º¸¦ Á¤ÀÇÇϰí ÀÖ½À´Ï´Ù.

 

// CustomDlg.h

class CCustomDlg : public CColorDialogImpl<CCustomDlg>

{

public:

    // constructor¡¡ ¡¡

    CCustomDlg(COLORREF clrInit = 0, DWORD dwFlags = 0)

        : CColorDialogImpl<CCustomDlg>(clrInit, dwFlags, NULL)

    {

        m_cc.Flags |= CC_FULLOPEN;

    }

 

    BEGIN_MSG_MAP_EX(CCustomDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        CHAIN_MSG_MAP(CColorDialogImpl<CCustomDlg>)

    END_MSG_MAP()

 

    LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){

        CenterWindow();

 

        return TRUE;

    }

 

    BOOL OnColorOK(){

        int nRet = MessageBox(_T("»ö ¼±Åà ´ÙÀ̾ó·Î±×¸¦ ´Ù¹°¾îµµ ÁÁ½À´Ï±î? "),

            _T("È®ÀÎ"), MB_YESNO | MB_ICONQUESTION);

 

        // FALSE£º´Ù¹«´Â ,TRUE£º±×´ë·Î

        return (nRet == IDYES) ? FALSE : TRUE;

    }

};

                      


CCustomDlg ·¡½ºÀÇ  constructorÀμö´Â CColorDialogŬ·¡½ºÀÇ  constructor Àμö¸¦ Âü°í·Î Çϰí ÀÖ½À´Ï´Ù.  constructor ³»¿¡¼­´Â Ãʱ⠻óÅ·Π[»öÀÇ ÀÛ¼º] ¿µ¿ªÀ» Ç¥½ÃÇϱâ À§Çؼ­ CC_FULLOPEN Ç÷¡±×¸¦ Ãß°¡ÇÕ´Ï´Ù.   OnInitDialog()¿¡¼­ CenterWindow()¿¡ ÀÇÇØ ´ÙÀ̾ó·Î±×¸¦ Áß¾Ó¿¡ Ç¥½ÃÇϰí ÀÖ½À´Ï´Ù.  OnColorOK()Àº  [OK] ¹öưÀ» ´­·¶À» ¶§¿¡ ºÒ·Á Áý´Ï´Ù.  ¿©±â¿¡¼­´Â È®ÀÎ¿ë ¸Þ½ÃÁö ¹Ú½º·Î Ç¥½ÃÇØ [³×]°¡ ¼±ÅõǾúÀ» °æ¿ì¿¡ »ö ¼±Åà ´ÙÀ̾ó·Î±×¸¦ ´Ýµå·Ï Çϰí ÀÖ½À´Ï´Ù.

¡¡
´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº CCustomDlgŬ·¡½º¸¦ »ç¿ëÇÏ´Â ¿¹ÀÔ´Ï´Ù.

// stdafx.h

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

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

                      

 

// maindlg.h

class CMainDlg : public CDialogImpl<CMainDlg>

{

public:

    enum { IDD = IDD_MAINDLG };

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        COMMAND_ID_HANDLER_EX(IDC_BUTTON_OPENDLG, OnButtonOpenDlg)

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

 

        return TRUE;

    }

 

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

        CCustomDlg dlg(RGB(255, 0, 0));

 

        if(dlg.DoModal() == IDOK){

            CString strMsg;

            strMsg.Format(_T("R£º%d\nG£º%d\nB£º%d"),

                GetRValue(dlg.GetColor()),

                GetGValue(dlg.GetColor()),

                GetBValue(dlg.GetColor()));

            MessageBox(strMsg);

        }

    }

 

    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;

}

                      


¡¡
¿ì¼± ¸®¼Ò½º¸¦ ÀÛ¼ºÇÕ´Ï´Ù. ´ÙÀ̾ó·Î±×¿¡ ¹öư ÄÁÆ®·ÑÀ» ¹èÄ¡ÇØ ¸®¼Ò½º ID¸¦ ´ÙÀ½°ú °°ÀÌ ÁöÁ¤ÇÕ´Ï´Ù.

ÄÁÆ®·Ñ¸í

¸®¼Ò½º ID

Ǫ½¬ ¹öư

IDC_BUTTON_OPENDLG


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

¡¡
CMainDlg Ŭ·¡½º¿¡¼­´Â  ¹öư¿ëÀÇ Ä¿¸àµå ¸Þ¼¼Áö Çڵ鷯 OnButtonOpenDlg()¸¦ Ãß°¡ÇÏ¿© °Å±â¼­ CCustomDlg Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ÀÛ¼ºÇØ  DoModal()¿¡ ÀÇÇØ µ¶ÀÚÀûÀÎ »ö ¼±Åà ´ÙÀ̾ó·Î±×¸¦ Ç¥½ÃÇÕ´Ï´Ù.

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