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 ์ด๋™