mfc_ListBox_Library - 8BitsCoding/RobotMentor GitHub Wiki

ListBox์˜ OwerDraw ํด๋ž˜์Šคํ™” ํ•˜๊ธฐ

OwnerDraw๋ฅผ ์ข€ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์จ๋ณด์ž.

ํ”„๋กœ์ ํŠธ -> ํด๋ž˜์Šค ๋งˆ๋ฒ•์‚ฌ (Ctrl+Shift+x) -> ํด๋ž˜์Šค ์ถ”๊ฐ€ -> MFC ํด๋ž˜์Šค ์ถ”๊ฐ€

์ด๋ฏธ์ง€

๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ CListBox๋กœ ์„ค์ • ํ›„ ์ƒ์„ฑ

์ด๋ฏธ์ง€

์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ์„ฑ ๋จ.

#pragma once

// TH_ListBox

class TH_ListBox : public CListBox
{
	DECLARE_DYNAMIC(TH_ListBox)

public:
	TH_ListBox();
	virtual ~TH_ListBox();

protected:
	DECLARE_MESSAGE_MAP()
};

๋‹ค์‹œ ํด๋ž˜์Šค ๋งˆ๋ฒ•์‚ฌ ์‹คํ–‰ (ํ”„๋กœ์ ํŠธ -> ํด๋ž˜์Šค ๋งˆ๋ฒ•์‚ฌ(Ctrl+Shit+x))

ํด๋ž˜์Šค ์ด๋ฆ„์„ TH_ListBox๋กœ ๋ณ€๊ฒฝ

์ด๋ฏธ์ง€

CTLCOLOR, DrawItem ๋ฉ”์‹œ์ง€ ์ถ”๊ฐ€

์ด๋ฏธ์ง€

HBRUSH TH_ListBox::CtlColor(CDC* /*pDC*/, UINT /*nCtlColor*/)
{
	// TODO:  ์—ฌ๊ธฐ์„œ DC์˜ ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

	// TODO:  ๋ถ€๋ชจ ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ Null์ด ์•„๋‹Œ ๋ธŒ๋Ÿฌ์‹œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
	return NULL;
}

void TH_ListBox::DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/)
{
	// TODO: ์—ฌ๊ธฐ์— ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๊ธฐ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
}

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

void TH_ListBox::DrawItem(LPDRAWITEMSTRUCT lpds)
{
	if (lpds->iTemID != 0xFFFFFFFF && lpds->itemID < GetCount()) {
		if ((lpds->itemAction & ODA_DRAWENTIRE) || (lpds->itemAction & ODA_FOCUS) ODA_SELECT(lpds->itemAction & ODA_SELECT))
		{
			CDC * p_dc = CDC::FromHandle(lpds->hDC);
			
			if (lpds->itemState & ODS_SELECTED) {
				if (lpds->itemState & ODS_FOCUS) p_dc->FillSolidRect(&lpds->rcItem, RGB(0, 200, 255));
                else p_dc->FillSolidRect(&lpds->rcItem, RGB(0, 100, 200)); 

                    p_dc->SetTextColor(RGB(255, 255, 0));
				}
			}
			else {
                p_dc->FillSolidRect(&lpds->rcItem, RGB(0, 0, 128));
                p_dc->SetTextColor(RGB(128, 128, 0));
            }

			CString str;
			GetText(lpds->itemID, str);
			p_dc->TextOut(lpds->rcItem.left + 5, lpds->rcItem.top + 6, str);
		}
}

์ฝ”๋“œ์„ค๋ช…

void TH_ListBox::DrawItem(LPDRAWITEMSTRUCT lpds) : LPDRAWITEMSTRUCT๊ฐ€ ์ฃผ์„์ฒ˜๋ฆฌ๋˜์–ด ์žˆ๋Š”๋ฐ ์‚ฌ์šฉ์„ ์œ„ํ•ด์„œ ์ฃผ์„์„ ํ‘ผ๋‹ค.

if (lpds->iTemID != 0xFFFFFFFF && lpds->itemID < GetCount()) { : lpds์—์„œ itemID๋ฅผ ํ™•์ธ, GetCountํ•จ์ˆ˜๋Š” ํ˜„์žฌ ํด๋ž˜์Šค๊ฐ€ ListBox์ด๊ธฐ์— ๊ทธ๋ƒฅ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

GetText(lpDrawItemStruct->itemID, str); : GetText์—ญ์‹œ ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ListBoxํด๋ž˜์Šค์ด๊ธฐ์— ๊ทธ๋ƒฅ ์“ฐ๋ฉด๋œ๋‹ค.

// TH_ListBox.h
private:
	CBrush m_list_box_bk_brush;
// TH_ListBox.cpp
TH_ListBox::TH_ListBox() : m_list_box_bk_brush(RGB(0, 0, 128))
{
}
HBRUSH TH_ListBox::CtlColor(CDC* /*pDC*/, UINT /*nCtlColor*/)
{
	return m_list_box_bk_brush;
}

์ฝ”๋“œ์„ค๋ช…

return m_list_box_bk_brush; :


์‚ฌ์šฉํ•˜๊ธฐ

// Dlg.h
#include "TH_ListBox.h"

// ...

TH_ListBox m_data_list;     // CListBox m_data_list;

// OwnerDraw, CtlColor ํ•จ์ˆ˜๋Š” Dlg์—์„œ ์‚ญ์ œํ•œ๋‹ค.
// OnInitDialog()
m_data_list.SubclassDlgItem(IDC_DATA_LIST, this);

๋‹ค์ด์–ผ๋กœ๊ทธ์˜ ListBox๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค

๋‹จ์ˆœํžˆ h / cppํŒŒ์ผ์„ ์˜ฎ๊ฒจ์„œ ๋‚˜๋งŒ์˜ ListBox๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌํ™” ํ•ด๋ณด์ž.

์ƒˆ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ -> Visual C++ -> Windows ๋ฐ์Šคํฌํ†ฑ -> Windows ๋ฐ์Šคํฌํ†ฑ ๋งˆ๋ฒ•์‚ฌ

์ด๋ฏธ์ง€

์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ + MFC ์„ ํƒ

์ด๋ฏธ์ง€

์œ„์—์„œ ์ž‘์„ฑํ–ˆ๋˜ TH_ListBox.h/cpp๋ฅผ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•œ๋‹ค.

๋นŒ๋“œ๋ฅผ ํ•ด๋ณธ๋‹ค. -> lib ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.


lib๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ๋‹ค.

์šฐ์„  ๊ธฐ์กด Dlg์—์„œ TH_ListBox.cppํŒŒ์ผ์„ ์‚ญ์ œํ•œ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด lib๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

// Dlg.cpp
#pragma comment(lib, "TH_ListBox.lib")

ํ—ค๋”ํŒŒ์ผ๊ณผ lib๋งŒ์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค ์ถ”๊ฐ€ (ListBox ์ƒ‰์ƒ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ)

// TH_ListBox.h
COLORREF m_select_color, m_focus_color, m_bk_color;

// ...

void SetItemColor(COLORREF a_select_color, COLORREF a_focus_color, COLORREF a_bk_color);
// TH_ListBox.cpp
TH_ListBox::TH_ListBox()
{
    m_select_color = RGB(0, 100, 200);
    m_focus_color = RGB(0, 200, 255);
    m_bk_color = RGB(0, 0, 128);
}

void TH_ListBox::SetItemColor(COLORREF a_select_color, COLORREF a_focus_color, COLORREF a_bk_color)
{
    m_select_color = a_select_color;
    m_focus_color = a_focus_color;
    m_bk_color = a_bk_color;

    m_list_box_bk_brush.DeleteObject();
    m_list_box_bk_brush.CreateSolidBrush(m_bk_color);
}

๋Œ€๋žต ์•„๋ž˜์™€ ๊ฐ™์€ ์‹์œผ๋กœ...

// DrawItemํ•จ์ˆ˜์— ์ƒ‰์ƒ์„ ๋ฐ˜์˜
void TH_ListBox::DrawItem(LPDRAWITEMSTRUCT lpds)
{
	if (lpds->iTemID != 0xFFFFFFFF && lpds->itemID < GetCount()) {
		if ((lpds->itemAction & ODA_DRAWENTIRE) || (lpds->itemAction & ODA_FOCUS) ODA_SELECT(lpds->itemAction & ODA_SELECT))
		{
			CDC * p_dc = CDC::FromHandle(lpds->hDC);
			
			if (lpds->itemState & ODS_SELECTED) {
				if (lpds->itemState & ODS_FOCUS) p_dc->FillSolidRect(&lpds->rcItem, a_select_color);
                else p_dc->FillSolidRect(&lpds->rcItem, a_focus_color); 

                    p_dc->SetTextColor(RGB(255, 255, 0));
				}
			}
			else {
                p_dc->FillSolidRect(&lpds->rcItem, a_bk_color);
                p_dc->SetTextColor(RGB(128, 128, 0));
            }

			CString str;
			GetText(lpds->itemID, str);
			p_dc->TextOut(lpds->rcItem.left + 5, lpds->rcItem.top + 6, str);
		}
}

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค ์ถ”๊ฐ€ (์˜ค๋ฒ„๋ผ๋”ฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ)

// TH_ListBox.h
virtual void DrawListItem(CDC *ap_dc, RECT *ap_rect, int a_index, void *ap_data, unsigned char a_select_flag, unsigned char a_focus_flag);
virtual void DrawUserItem(CDC *ap_dc, RECT *ap_rect, int a_index, void *ap_data, unsigned char a_select_flag, unsigned char a_focus_flag);
// TH_ListBox.cpp
void TH_ListBox::DrawUserItem(CDC *ap_dc, RECT *ap_rect, int a_index, void *ap_data, unsigned char a_select_flag, unsigned char a_focus_flag)
{
    if (a_select_flag) ap_dc->SetTextColor(RGB(255, 255, 0));
    else ap_dc->SetTextColor(RGB(128, 128, 0)); 

    CString str;
    GetText(a_index, str);
    p_dc->TextOut(ap_rect->left + 5, ap_rect->top + 6, str);
}

void TH_ListBox::DrawListItem(CDC *ap_dc, RECT *ap_rect, int a_index, void *ap_data, unsigned char a_select_flag, unsigned char a_focus_flag)
{
    if(a_select_flag) {
        if(a_focus_flag) ap_dc->FillSolidRect(ap_rect, m_focus_color);
        else ap_dc->FillSolidRect(ap_rect, m_select_color);
    }
    else {
        ap_dc->FillSolidRect(ap_rect, m_bk_color);
    }
    DrawUserItem(ap_dc, ap_rect, a_index, ap_data, a_select_flag, a_focus_flag);
}
void TH_ListBox::DrawItem(LPDRAWITEMSTRUCT lpds)
{
	if (lpds->iTemID != 0xFFFFFFFF && lpds->itemID < GetCount()) {
		if ((lpds->itemAction & ODA_DRAWENTIRE) || (lpds->itemAction & ODA_FOCUS) ODA_SELECT(lpds->itemAction & ODA_SELECT))
		{
			CDC * p_dc = CDC::FromHandle(lpds->hDC);
			DrawListItem(p_dc, &lpds->rcItem, lpds->itemID, (void*)lpds->itemData, lpds->itemState & ODS_SELECTED, lpds->itemState & ODS_FOCUS);

์ƒ์†๋ฐ›์•„์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด๋ณด์ž.

// Dlg.h
class MyListBox : public TH_ListBox
{
public:
    virtual void DrawListItem(CDC *ap_dc, RECT *ap_rect, int a_index, void *ap_data, unsigned char a_select_flag, unsigned char a_focus_flag);
}

๊ฟ€ ํŒ~

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ—ค๋”์— ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•จ์ˆ˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

// TH_ListBox.h

// #pragma comment (lib, "TW_ListBox.lib")
/*
void TH_ListBox::DrawUserItem(CDC *ap_dc, RECT *ap_rect, int a_index, void *ap_data, unsigned char a_select_flag, unsigned char a_focus_flag)
{
    if (a_select_flag) ap_dc->SetTextColor(RGB(255, 255, 0));
    else ap_dc->SetTextColor(RGB(128, 128, 0)); 

    CString str;
    GetText(a_index, str);
    p_dc->TextOut(ap_rect->left + 5, ap_rect->top + 6, str);
}
*/