mfc_custom_color - 8BitsCoding/RobotMentor GitHub Wiki
์ฌ๊ฐํ ๋ค๋ชจ ๊ทธ๋ ค๋ณด๊ธฐ
// OnPatin()
CPaintDC dc(this);
if (IsIconic())
{
// ...
}
else
{
dc.FillSolidRect(10, 10, 100, 100, RGB(0, 0, 255));
// CDialogEx::OnPaint();
}
์ฌ๊ธฐ์ ๋ถํฐ ์ฌ์ฉ์๊ฐ ๊ทธ๋ฆผ์ ๋ณ๊ฒฝํ๊ฒ ๋ง๋ค๊ฒ ๋ค.
ํด๋ฆญ์ ํตํ ์ฌ๊ฐํ ๋ณ๊ฒฝ
ํด๋์ค๋ง๋ฒ์ฌ -> ๋ฉ์์ง -> WM_LButton Down
void CAboutDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: ์ฌ๊ธฐ์ ๋ฉ์์ง ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ฅผ ์ถ๊ฐ ๋ฐ/๋๋ ๊ธฐ๋ณธ๊ฐ์ ํธ์ถํฉ๋๋ค.
CRect r(10, 10, 110, 110);
if(r.PtInRect(point))
{
CColorDialog ins_dlg;
ins_dlg.m_cc_Flags |= CC_FULLOPEN | CC_RGBINIT;
ins_dlg.m_cc.rgbResult = m_user_color;
if(IDOK == ins_dlg.DoModal()) {
m_user_color = ins_dlg.GetColor(); // ์์ ๋ฐ๊ธฐ
InvalidateRect(r); // ์ง์ ํ๋ฉด๋ง ํ๋ฉด๊ฐฑ์
}
}
CDialogEx::OnLButtonDown(nFlags, point);
}
// Dlg.h
COLORREF m_user_color = RGB(0, 0, 255);
// OnPatin()
CPaintDC dc(this);
if (IsIconic())
{
// ...
}
else
{
dc.FillSolidRect(10, 10, 100, 100, m_user_color);
// CDialogEx::OnPaint();
}
์ฝ๋์ค๋ช
if(r.PtInRect(point))
: ํด๋ฆญํ ๋ง์ฐ์ค ํฌ์ธํฐ๊ฐ Rect๋ด์ ์๋์ง ํ์ธ
CColorDialog ins_dlg;
: ์์์ ํ ๋ํ์์๋ฅผ ์ถ๋ ฅํด๋ฌ๋ผ.
ins_dlg.m_cc_Flags |= CC_FULLOPEN;
: ์ปฌ๋ฌ ์ ํ ๋ํ์์ ํผ์น์ํ๋ก
CC_RGBINIT
: ์ปฌ๋ฌ ์ ํ ๋ํ์์์ ๊ธฐ๋ณธ์์์ ์ง์ ํ๊ฒ ๋ค.
ins_dlg.m_cc.rgbResult = m_user_color;
: ์ปฌ๋ฌ ์ ํ ๋ํ์์์ ๊ธฐ๋ณธ์์์ผ m_user_color๋ก ํ๊ฒ ๋ค.TIPs :
ins_dlg.DoModal();
: DoModal๋ก ์คํ ์ ์ถ๊ฐ ์์ฑ๋ ๋ํ์์๊ฐ ๋ซํ๊ธฐ ์ ์๋ ์ฝ๋๊ฐ ๋ค์ ๋ผ์ธ์ผ๋ก ๋์ด๊ฐ์ง ์๋๋ค.
Button์ ์์ ๋ณ๊ฒฝํ๊ธฐ
Button -> ์์ฑ -> Owner Draw -> True
ํด๋์ค ๋ง๋ฒ์ฌ(Ctrl + Shift + x) -> ๋ฉ์์ง -> DrawItem ์ถ๊ฐ
void CAboutDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpds)
{
if(nIDCtl == IDC_SELECTED_COLOR)
{
CDC *p_dc = CDC::FromHandle(lpds->hDC);
p_dc->FillSolidRect(&lpds->rcItem, RGB(228, 228, 228)); // ์์ ์ฑ์ฐ๊ธฐ
// 3d ํจ๊ณผ ์ฃผ๊ธฐ
if(lpds->itemState & ODS_SELECTED) {
p_dc->Draw3dRect(&lpds->rcItem, RGB(168, 168, 168), RGB(248, 248, 248));
}
else p_dc->Draw3dRect(&lpds->rcItem, RGB(248, 248, 248), RGB(168, 168, 168));
}
CDialogEx::OnDrawItem(nIDCtl, lpds);
}
๋ฒํผ ํ ๋๋ฆฌ์ ์์ ๋ฃ๊ธฐ
void CAboutDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpds)
{
if(nIDCtl == IDC_SELECTED_COLOR)
{
CDC *p_dc = CDC::FromHandle(lpds->hDC);
p_dc->FillSolidRect(&lpds->rcItem, RGB(228, 228, 228)); // ์์ ์ฑ์ฐ๊ธฐ
// 3d ํจ๊ณผ ์ฃผ๊ธฐ
if(lpds->itemState & ODS_SELECTED) {
p_dc->Draw3dRect(&lpds->rcItem, RGB(168, 168, 168), RGB(248, 248, 248));
}
else p_dc->Draw3dRect(&lpds->rcItem, RGB(248, 248, 248), RGB(168, 168, 168));
}
CRect r(lpds->rcItem.left + 3, lpds->rcItem.top + 3, lpds->rcItem.right - 3, lpds->rcItem.bottom - 3);
p_dc->Draw3dRect(r, m_user_color);
CDialogEx::OnDrawItem(nIDCtl, lpds);
}
Invalidate์ ํด์ค์ผํ๋ค.
void CAboutDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: ์ฌ๊ธฐ์ ๋ฉ์์ง ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ฅผ ์ถ๊ฐ ๋ฐ/๋๋ ๊ธฐ๋ณธ๊ฐ์ ํธ์ถํฉ๋๋ค.
CRect r(10, 10, 110, 110);
if(r.PtInRect(point))
{
CColorDialog ins_dlg;
ins_dlg.m_cc_Flags |= CC_FULLOPEN | CC_RGBINIT;
ins_dlg.m_cc.rgbResult = m_user_color;
if(IDOK == ins_dlg.DoModal()) {
m_user_color = ins_dlg.GetColor(); // ์์ ๋ฐ๊ธฐ
GetDlgItem(IDC_SELECTED_COLOR_BTN)->Invalidate();
InvalidateRect(r); // ์ง์ ํ๋ฉด๋ง ํ๋ฉด๊ฐฑ์
}
}
CDialogEx::OnLButtonDown(nFlags, point);
}
GetDlgItem(IDC_SELECTED_COLOR_BTN)->Invalidate();
: Invalidate Button
๋ฒํผ์ ๊ธ์ ๋ฃ๊ธฐ
void CAboutDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpds)
{
if(nIDCtl == IDC_SELECTED_COLOR)
{
CDC *p_dc = CDC::FromHandle(lpds->hDC);
p_dc->FillSolidRect(&lpds->rcItem, RGB(228, 228, 228)); // ์์ ์ฑ์ฐ๊ธฐ
CString str;
GetDlgItemText(IDC_SELECTED_COLOR_BTN, str);
// 3d ํจ๊ณผ ์ฃผ๊ธฐ
if(lpds->itemState & ODS_SELECTED) {
p_dc->Draw3dRect(&lpds->rcItem, RGB(168, 168, 168), RGB(248, 248, 248));
}
else p_dc->Draw3dRect(&lpds->rcItem, RGB(248, 248, 248), RGB(168, 168, 168));
}
p_dc->SetBkMode(TRANSPARENT);
p_dc->SetTextColor(m_user_color);
p_dc->DrawText(str, lpds->rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
CRect r(lpds->rcItem.left + 3, lpds->rcItem.top + 3, lpds->rcItem.right - 3, lpds->rcItem.bottom - 3);
p_dc->Draw3dRect(r, m_user_color);
CDialogEx::OnDrawItem(nIDCtl, lpds);
}
์ฝ๋์ค๋ช
GetDlgItemText(IDC_SELECTED_COLOR_BTN, str);
: ํ ์คํธ ๋ฐ๊ธฐ
p_dc->DrawText(str, lpds->rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
: ๊ธ์๋ฅผ ๊ทธ๋ฆฌ๊ณ ๊ฐ์ด๋ฐ ์ ๋ ฌ ์ต์ ๋ฃ๊ธฐ
๋ฒํผ์ ํด๋ฆญ ์ ๊ธ์/์ปฌ๋ฌ ํ ๋๋ฆฌ๋ฅผ ์กฐ๊ธ ์์ง์ฌ ๋ณด์.
void CAboutDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpds)
{
if(nIDCtl == IDC_SELECTED_COLOR)
{
CDC *p_dc = CDC::FromHandle(lpds->hDC);
p_dc->FillSolidRect(&lpds->rcItem, RGB(228, 228, 228)); // ์์ ์ฑ์ฐ๊ธฐ
CString str;
GetDlgItemText(IDC_SELECTED_COLOR_BTN, str);
CRect r(lpds->rcItem);
CRedt color_rect.SetRect(lpds->rcItem.left + 3, lpds->rcItem.top + 3, lpds->rcItem.right - 3, lpds->rcItem.bottom - 3);
// 3d ํจ๊ณผ ์ฃผ๊ธฐ
if(lpds->itemState & ODS_SELECTED) {
r -= CPoint(1, 1);
color_rect -= CPoint(1, 1);
p_dc->Draw3dRect(&lpds->rcItem, RGB(168, 168, 168), RGB(248, 248, 248));
}
else p_dc->Draw3dRect(&lpds->rcItem, RGB(248, 248, 248), RGB(168, 168, 168));
}
p_dc->SetBkMode(TRANSPARENT);
p_dc->SetTextColor(m_user_color);
p_dc->DrawText(str, lpds->rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
p_dc->Draw3dRect(color_rect, m_user_color);
CDialogEx::OnDrawItem(nIDCtl, lpds);
}
์ฝ๋์ค๋ช
r -= CPoint(1, 1);
: 1, 1๋งํผ Rect ์ด๋