Color Picker (SDI¿¡¼ Dialog ·Î ³ªÅ¸³½ °Í)

À§ÀÇ ±×¸²Àº Ä÷¯ ¼±ÅÃÀ» À§ÇÑ ¼¿ÇÁ µå·ÎÀ× ÄÁÆ®·ÑÀÔ´Ï´Ù. CodeGuru¿¡µµ ÀÖ±¸, ºñÁÖ¾ó C++ 6 ¿Ïº®°¡À̵å Ã¥¿¡µµ ³ª¿ÍÀÖ´õ±º¿ä. °Å±ä ´ÙÀ̾ó·Î±× º£À̽º·Î ¸¸µé¾îÁ® ÀÖ¾ú´Âµ¥ ±×°É SDI¿¡¼ ¸ð´Þ ´ÙÀ̾ó·Î±× ¹Ú½º·Î Ãâ·ÂµÇ°Ô ¸¸µé¾î º¸¾Ò½À´Ï´Ù. ¹¹ °°Àº °Å´Ï±î ¹Ù²Ù´Â °Ç °£´ÜÇÏÁö¿ä..
1. ¿ì¼± ¼Ò½º¸¦ ¹Þ½À´Ï´Ù. ¿¹Á¦ ¼Ò½ºµµ ÀÖ¾î¿ä.. ColorPicker.h / cpp, ColorPopup.h / cpp ÀÌ·¸°Ô 4°³ÀÇ ÆÄÀÏÀÌ µé¾îÀÖ½À´Ï´Ù. ±×¸®°í´Â º¹»çÇØ ³ÖÀº ´ÙÀ½¿¡ ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡...
2. Ä÷¯ ¼±ÅÃÀ» ÇÒ ´ÙÀ̾ó·Î±×¸¦ Çϳª ¸¸µì´Ï´Ù. ´ÙÀ̾ó·Î±× ID ´Â IDD_COLORDLG ·Î Çϱâ·Î ÇÏÁÒ.
3. À§ÀÇ ±×¸²Ã³·³ ´ÙÀ̾ó·Î±× À§¿¡´Ù ÄÁÆ®·ÑµéÀ» ¹èÄ¡ÇÕ´Ï´Ù.
°£´ÜÈ÷ ¼³¸íÇÏÀÚ¸é ¿ì¼± Á¦ÀÏ À§¿¡ Static Text ÄÁÆ®·ÑÀÌ À§Ä¡Çϰí, ±× ¿À¸¥ÂÊ¿¡
¼¿ÇÁ µå·ÎÀ× ÄÁÆ®·Ñ·Î µÐ°©ÇÒ ¹öư ÄÁÆ®·ÑÀ» Çϳª µÓ´Ï´Ù. º¸À̱⿣ ÄÞº¸¹Ú½º ºñ½º¹«·¹ÇϰÔ
º¸ÀÌÁö¸¸ ¹öưÀÌ µÐ°©ÇÑ °Ì´Ï´Ù. ¾Æ·¡¸¦ Group Box·Î °¨½Î°í ±× ¾È ¿ÞÂÊ¿¡´Â picture
ÄÁÆ®·ÑÀ» ³õ°í, ¿À¸¥ÂÊ¿¡´Â RGB¸¦ Ç¥½ÃÇÒ Static Text¿Í Edit Box¸¦ 3°³¾¿ ³õ½À´Ï´Ù.
Button Control - ID : IDC_COLORPICK ĸ¼Ç
: Ä÷¯ ¼±ÅÃ
Group Box - ID : IDC_STATIC
ĸ¼Ç : ¼±ÅÃµÈ Ä÷¯
Picture Control - ID : IDC_FRAME
Static Control -
ID : IDC_STATIC ĸ¼Ç
: RED :
ID
: IDC_STATIC ĸ¼Ç
: GREEN:
ID
: IDC_STATIC ĸ¼Ç
: BLUE:
Edit Box - ID
: IDC_RED , IDC_GREEN , IDC_BLUE
4. ÄÁÆ®·ÑµéÀ» ´Ù ¿Ã·Á³õ¾ÒÀ¸¸é ÀÌ ´ÙÀ̾ó·Î±× ¹Ú½º¿¡ ¿¬°áµÉ Ŭ·¡½º¸¦ ¸¸µì´Ï´Ù. Ŭ·¡½º À̸§Àº CColorPickerDlg ¶ó°í ÇÏÁÒ. ±×¸®°í´Â ´ÙÀ̾ó·Î±× Çì´õÆÄÀÏÀÇ À§¿¡ #include "ColorPicker.h" ¸¦ ½á³Ö¾î ÁÝ´Ï´Ù.
5. Ŭ·¡½º À§Àúµå¸¦ »ç¿ëÇØ¼ ÄÁÆ®·ÑµéÀ» º¯¼ö¿Í ¿¬°á½ÃÄÑ ÁÝ´Ï´Ù. Edit BoxµéÀº °¢°¢ int Çü m_nRed, m_nGreen, m_nBlue ·Î Á¤ÇØÁØ ÈÄ, ÃÖ¼Ò°ª 0, ÃÖ´ë°ª 255·Î Á¤ÇØÁÝ´Ï´Ù. ±×·± ´ÙÀ½ ¹öư ÄÁÆ®·ÑÀº ¿ì¼± CButton ÇüÀ¸·Î Çϰí, m_ctrlColorPicker ¶ó´Â º¯¼öÀ̸§À» ÁÖÁÒ. ±×¸®°í´Â ColorPickerDlg.h ÆÄÀÏÀ» ¿¾î
CButton m_ctrlColorPicker; ---> CColorPicker m_ctrlColorPicker
·Î ¹Ù²Ù¾î ÁÝ´Ï´Ù. ¿©±â±îÁö¸¸ Çϰí ÄÄÆÄÀÏÇϸé Ä÷¯ ¼±Åà ÄÁÆ®·ÑÀ» º¼ ¼ö ÀÖ½À´Ï´Ù. ¹°·Ð CView °°Àº ´Ù¸¥ Ŭ·¡½º¿¡¼ ÀÌ ´ÙÀ̾ó·Î±×¸¦ DoModal() °°Àº ÇÔ¼ö¸¦ ½á¼ ºÒ·¯ ÁÖ¾î¾ß¸¸ ÇϰÚÁö¿ä..
6. ÄÁÆ®·Ñ ÃʱâÈ
Ä÷¯ ¼±Åà ÄÁÆ®·Ñ¿¡´Â SetDefaultText, SetCustomText ¶ó´Â ÇÔ¼ö°¡ Àִµ¥, ÀÌ°Ç Ä÷¯ ¼±Åà ÄÁÆ®·ÑÀÇ ¾Æ·¡À§·Î Ãâ·ÂµÉ ¹®ÀÚ¿À» ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
Ŭ·¡½º À§Àúµå¿¡¼ CColorPickerDlg Ŭ·¡½ºÀÇ WM_INITDIALOG ¸Þ½ÃÁö¸¦ ¿À¹ö¶óÀ̵ù ÇÕ´Ï´Ù.
BOOL CColorPickerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization
here
m_ctrlColorPicker.SetDefaultText("ÀÚµ¿");
m_ctrlColorPicker.SetCustomText("´Ù¸¥
»ö");
return TRUE; //
return TRUE unless you set the focus to a control
//
EXCEPTION: OCX Property Pages should return FALSE
}
7. Ä÷¯ ¼±Åà ÄÁÆ®·Ñ¿¡ ÀÔ·ÂµÈ °ªÀ» ¾ò¾î³»±â À§ÇØ CColorPickerDlg Ŭ·¡½º¿¡ COLORREF Çü m_crColor º¯¼ö¸¦ ¼±¾ðÇÕ´Ï´Ù.
8. ColorPickerDlg ÇÔ¼öÀÇ ´ÙÀ½ ºÎºÐÀ» °íĨ´Ï´Ù. Ä÷¯ °ª ÃʱâÈ¿Í Ä÷¯ ¼±Åà ÄÜÆ®·Ñ°úÀÇ ¿¬°áÀ» À§ÇÑ ÄÚµåÀÔ´Ï´Ù. DDX_ColorPicker ÇÔ¼ö´Â MFC¿¡¼ Áö¿øÇÏ´Â ÇÔ¼ö°¡ ¾Æ´Ï°í, µû·Î ¸¸µé¾îÁØ ÇÔ¼öÀÔ´Ï´Ù.
CColorPickerDlg::CColorPickerDlg(CWnd* pParent /*=NULL*/)
: CDialog(CColorPickerDlg::IDD,
pParent)
{
//{{AFX_DATA_INIT(CColorPickerDlg)
m_nRed = 255;
m_nGreen = 255;
m_nBlue = 0;
//}}AFX_DATA_INIT
m_crColor = RGB(m_nRed,
m_nGreen, m_nBlue);
}
void CColorPickerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CColorPickerDlg)
DDX_Control(pDX, IDC_COLORPICK,
m_ctrlColorPicker);
DDX_Text(pDX, IDC_RED, m_nRed);
DDV_MinMaxInt(pDX, m_nRed,
0, 255);
DDX_Text(pDX, IDC_GREEN,
m_nGreen);
DDV_MinMaxInt(pDX, m_nGreen,
0, 255);
DDX_Text(pDX, IDC_BLUE,
m_nBlue);
//}}AFX_DATA_MAP
DDX_ColorPicker(pDX,
IDC_COLORPICK, m_crColor);
}
9. Ä÷¯ ¼±Åà ÄÁÆ®·ÑÀº »óȲ¿¡ µû¶ó ´ÙÀ½°ú °°Àº ÅëÁö ¸Þ½ÃÁö¸¦ ¹ß»ý½Ãŵ´Ï´Ù.
CPN_SELCHANGE : ¼±Åà Ä÷¯°¡ ¹Ù²ð ¶§
CPN_DROPDOWN : µå·Ó ´Ù¿î À©µµ¿ì°¡ Ãâ·ÂµÉ ¶§
CPN_CLOSEUP : µå·Ó ´Ù¿î À©µµ¿ì°¡ ´ÝÈú ¶§
CPN_SELENDOK : »õ·Î¿î Ä÷¯°¡ ¼±ÅõǾúÀ» ¶§
CPN_SELENDCANCEL : Ä÷¯ ¼±ÅÃÀÌ Ãë¼ÒµÇ¾úÀ» ¶§
¿©±â¼´Â Ä÷¯ ¼±Åà ÄÁÆ®·Ñ°ú ¿¡µðÆ® ¹Ú½ºÀÇ °ªÀÌ ¹Ù²î¾úÀ» ¶§ ¼·Î¼·Î °ªÀ» ¹Ù²Ù¾î ÁÖ±â À§ÇØ ÅëÁö ¸Þ½ÃÁö¸¦ ó¸®ÇÕ´Ï´Ù. ¿¡µðÆ® ¹Ú½ºÀÇ ÅëÁö¸Þ½ÃÁö´Â Ŭ·¡½º À§Àúµå¿¡¼ ó¸®ÇÒ ¼ö ÀÖÁö¸¸ Ä÷¯ ¼±Åà ÄÁÆ®·ÑÀº Ŭ·¡½º À§Àúµå¿¡¼ Áö¿øÇÏÁö ¾ÊÀ¸¹Ç·Î Á÷Á¢ Äڵ带 ½á ÁÖ¾î¾ß ÇÕ´Ï´Ù.
Ŭ·¡½º À§Àúµå¸¦ ¿¾î ¿¡µðÆ® ¹Ú½º 3°³(IDC_RED, IDC_GREEN, IDC_BLUE)ÀÇ EN_CHANGE ¸Þ½ÃÁö¸¦ ó¸®Çϰí, Ä÷¯ ¼±Åà ÄÁÆ®·ÑÀ» ó¸®ÇÑ ÄÚµå´Â ¿ì¼± ´ÙÀ½°ú °°½À´Ï´Ù.
<ColorPickerDlg.h ¿¡¼>
...................
// Implementation
protected:
// Generated message
map functions
//{{AFX_MSG(CColorPickerDlg)
virtual BOOL OnInitDialog();
afx_msg void OnChangeRed();
afx_msg void OnChangeGreen();
afx_msg void OnChangeBlue();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
....................
<ColorPickerDlg.cpp ¿¡¼>
.............
BEGIN_MESSAGE_MAP(CColorPickerDlg, CDialog)
//{{AFX_MSG_MAP(CColorPickerDlg)
ON_EN_CHANGE(IDC_RED,
OnChangeRed)
ON_EN_CHANGE(IDC_GREEN,
OnChangeGreen)
ON_EN_CHANGE(IDC_BLUE, OnChangeBlue)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
..............
ÀÌ Äڵ带 ´ÙÀ½°ú °°ÀÌ °íĨ´Ï´Ù.
<ColorPickerDlg.h ¿¡¼>
...................
// Implementation
protected:
// Generated message
map functions
//{{AFX_MSG(CColorPickerDlg)
virtual BOOL OnInitDialog();
afx_msg void OnChangeEdit();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
....................
<ColorPickerDlg.cpp ¿¡¼>
.............
BEGIN_MESSAGE_MAP(CColorPickerDlg, CDialog)
//{{AFX_MSG_MAP(CColorPickerDlg)
ON_EN_CHANGE(IDC_RED, OnChangeEdit)
ON_EN_CHANGE(IDC_GREEN,
OnChangeEdit)
ON_EN_CHANGE(IDC_BLUE, OnChangeEdit)
//}}AFX_MSG_MAP
ON_MESSAGE(CPN_SELENDOK,
OnSelChange)
// Á÷Á¢ Ãß°¡ÇÑ ºÎºÐ
END_MESSAGE_MAP()
..............
10. Á÷Á¢ Ãß°¡ÇÑ ON_MESSAGEÀÇ Çڵ鷯¸¦ CColorPickerDlg Ŭ·¡½ºÀÇ ¸â¹öÇÔ¼öó·³ Ãß°¡ÇÕ´Ï´Ù. --> LRESULT OnSelChange(WPARAM wParam, LPARAM lParam)
OnChangeEditÀÇ Çڵ鷯µµ ÀÔ·ÂÇϱ¸¿ä.
±×¸®°í CColorPickerDlg Ŭ·¡½º¿¡ UpdateSelColor() ÇÔ¼ö¸¦ Ãß°¡Çϰí, Ŭ·¡½º À§Àúµå¸¦ »ç¿ëÇÏ¿© WM_PAINT ¸Þ½ÃÁö¸¦ ¿À¹ö¶óÀ̵ùÇÕ´Ï´Ù. ÄÚµå´Â ´ÙÀ½°ú °°½À´Ï´Ù.
// ÆíÁý ¹Ú½º ÄÁÆ®·ÑÀÇ ³»¿ëÀÌ ¹Ù²ï °æ¿ì
void CColorPickerDlg::OnChangeEdit()
{
// ÆíÁý ¹Ú½º ÄÁÆ®·Ñ¿¡ ¼³Á¤µÈ
°ª ¾ò±â
if(UpdateData()) {
//
Ä÷¯ ¼±Åà ÄÁÆ®·Ñ¿¡ °ª ¼³Á¤
m_crColor
= RGB(m_nRed, m_nGreen, m_nBlue);
//
È¸é °»½Å
UpdateData(FALSE);
UpdateSelColor();
}
}
// Ä÷¯ ¼±Åà ÄÁÆ®·Ñ¿¡ ¼³Á¤µÈ °ªÀÌ ¹Ù²ï °æ¿ì
LRESULT CColorPickerDlg::OnSelChange(WPARAM wParam, LPARAM lParam)
{
// Ä÷¯ ¼±Åà ÄÁÆ®·Ñ¿¡ ¼³Á¤µÈ
°ª ¾ò±â
UpdateData();
m_nRed = GetRValue(m_crColor);
m_nGreen = GetGValue(m_crColor);
m_nBlue = GetBValue(m_crColor);
// È¸é °»½Å
UpdateData(FALSE);
UpdateSelColor();
return 0L;
}
void CColorPickerDlg::UpdateSelColor()
{
CRect rect;
GetDlgItem(IDC_FRAME)->GetWindowRect(&rect);
ScreenToClient(&rect);
InvalidateRect(rect, FALSE);
}
void CColorPickerDlg::OnPaint()
{
CPaintDC dc(this); // device
context for painting
// TODO: Add your message
handler code here
CRect rect;
GetDlgItem(IDC_FRAME)->GetWindowRect(&rect);
ScreenToClient(&rect);
CBrush brush;
brush.CreateSolidBrush(m_crColor);
dc.FillRect(&rect, &brush);
// Do not call CDialog::OnPaint()
for painting messages
}
11. ºä¿¡¼ DoModal ÇÔ¼ö¸¦ ºÒ·¯¼ ½ÇÇà½ÃŰ°Å³ª Çϸç Àß ¶ã °Ì´Ï´Ù. ÇÊ¿äÇÏ´Ù¸é ¿©±â¼ CColorPicker, CCoorPopup, CColorPickerDlg Ŭ·¡½º¸¦ °¶·¯¸®¿¡ Ãß°¡ÇØ ³Ö°í ÇÊ¿äÇÒ ¶§¸¶´Ù Ãß°¡ÇØ ½áµµ ÆíÇϰÚÁÒ..