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);
}
*/