mfc_calculator_3 - 8BitsCoding/RobotMentor GitHub Wiki


ํด๋์ค ๋ง๋ฒ์ฌ -> MFC ํด๋์ค ์ถ๊ฐ -> CCheckListBox์ MyListBox์ถ๊ฐ
// Dlg.h
//CCheckListBox m_item_list;
MyListBox m_item_list;
//CListBox m_count_list;
void CalcTotalPrice();
//void ChangeText(CListBox * ap_list_box, int a_index, const wchar_t *ap_string);
CRect m_spin_rect;
CSpinButtonCtrl m_count_spin;
CFont m_my_font;
BOOL CMFCApplication1Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// ์ด ๋ํ ์์์ ์์ด์ฝ์ ์ค์ ํฉ๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฃผ ์ฐฝ์ด ๋ํ ์์๊ฐ ์๋ ๊ฒฝ์ฐ์๋
// ํ๋ ์์ํฌ๊ฐ ์ด ์์
์ ์๋์ผ๋ก ์ํํฉ๋๋ค.
SetIcon(m_hIcon, TRUE); // ํฐ ์์ด์ฝ์ ์ค์ ํฉ๋๋ค.
SetIcon(m_hIcon, FALSE); // ์์ ์์ด์ฝ์ ์ค์ ํฉ๋๋ค.
// TODO: ์ฌ๊ธฐ์ ์ถ๊ฐ ์ด๊ธฐํ ์์
์ ์ถ๊ฐํฉ๋๋ค.
wchar_t * p_item_name[MAX_ITEM_COUNT] = {
L"์๋ฉ๋ฆฌ์นด๋
ธ 1900์",
L"์นดํ๋ผ๋ผ 2500์",
L"์นดํ๋ชจ์นด 2800์",
L"์นด๋ผ๋ฉ๋ง๋ผ์๋3200์",
L"์์คํ๋ ์ 1800์",
L"๋ฐ๋๋ผ๋ผ๋ผ 3500์",
L"์นดํธ์น๋
ธ 3300์",
L"๋น์๋ 3500์"
};
int price[8] = {1900, 2500, 2800, 3200, 1800, 3500, 3300, 3500};
m_item_list.SubclassDlgItem(IDC_ITEM_LIST, this);
m_my_font.CreatePointFont(96, L"๊ตด๋ฆผ์ฒด");
m_item_list.SetFont(&m_my_font);
// SetItemHeight ๋ณด๋ค ๋จผ์ ์ ์ธ์ด ๋์ด์ผ ํ๋ค.
m_item_list.SetItemHeight(0, 24);
//m_count_list.SetItemHeight(0, 24);
ItemInfo* p;
for (int i = 0; i < MAX_ITEM_COUNT; i++) {
m_item_list.InsertString(i, p_item_name[i]);
p = new ItemInfo;
p->price = price[i];
p->count = 0;
m_item_list.SetItemDataPtr(i, p);
//m_count_list.InsertString(i, L"0");
}
m_count_spin.GetWindowRect(m_spin_rect);
ScreenToClient(&m_spin_rect);
return TRUE; // ํฌ์ปค์ค๋ฅผ ์ปจํธ๋กค์ ์ค์ ํ์ง ์์ผ๋ฉด TRUE๋ฅผ ๋ฐํํฉ๋๋ค.
}
void CMFCApplication1Dlg::OnLbnSelchangeItemList()
{
int index = m_item_list.GetCurSel();
ItemInfo* p = (ItemInfo*)m_item_list.GetItemDataPtr(index);
if (m_item_list.GetCheck(index)) {
if (p->count == 0) {
p->count = 1;
}
}
else {
if (p->count != 0) {
p->count = 0;
}
}
m_item_list.SetCurSel(index);// ํญ๋ชฉ์ ์๋ก ๊ทธ๋ฆฌ๊ธฐ ์ํด์
m_count_spin.SetWindowPos(NULL, m_spin_rect.left, m_spin_rect.top + index * 24, 0, 0, SWP_NOSIZE);;
CalcTotalPrice();
}
void CMFCApplication1Dlg::CalcTotalPrice()
{
int count = m_item_list.GetCount();
int total_price = 0;
ItemInfo* p;
for (int i = 0; i < count; i++) {
if (m_item_list.GetCheck(i)) {
p = (ItemInfo*)m_item_list.GetItemDataPtr(i);
total_price += p->price * p->count;
}
}
SetDlgItemInt(IDC_TOTAL_PRICE_EDIT, total_price);
}
void CMFCApplication1Dlg::OnDeltaposCountSpin(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
*pResult = 0;
int index = m_item_list.GetCurSel();
if (LB_ERR != index && m_item_list.GetCheck(index)) {
ItemInfo* p = (ItemInfo*)m_item_list.GetItemDataPtr(index);
if (pNMUpDown->iDelta < 0) {
// ์ค๋ฅธ์ชฝ ํด๋ฆญ
if (p->count < 100)p->count++;
}
else {
// ์ผ์ชฝ ํด๋ฆญ
if(p->count > 1) p->count--;
}
m_item_list.SetCurSel(index);
CalcTotalPrice();
}
}
void CMFCApplication1Dlg::OnDestroy()
{
CDialogEx::OnDestroy();
int count = m_item_list.GetCount();
ItemInfo* p;
for (int i = 0; i < count; i++) {
p = (ItemInfo*)m_item_list.GetItemDataPtr(i);
delete p;
}
m_item_list.ResetContent();
}
class MyListBox : public CCheckListBox
{
DECLARE_DYNAMIC(MyListBox)
public:
MyListBox();
virtual ~MyListBox();
protected:
DECLARE_MESSAGE_MAP()
public:
virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
};
void MyListBox::DrawItem(LPDRAWITEMSTRUCT lpds)
{
CCheckListBox::DrawItem(lpds);
// ๊ทธ๋ฆฌ๊ณ ์ถ์ ๋ด์ฉ
CDC * p_dc = CDC::FromHandle(lpds->hDC);
CString str;
//ItemInfo * p = (ItemInfo*)GetItemDataPtr(lpds->itemID);
ItemInfo * p = (ItemInfo*)lpds->itemData;
if (p->count > 1) {
str.Format(L"%d๊ฐ(%d)", p->count, p->price);
}
else {
str.Format(L"%d๊ฐ", p->count);
}
p_dc->SetBkMode(TRANSPARENT);
if(lpds->itemState & ODS_SELECTED)p_dc->SetTextColor(RGB(255, 255, 0));
p_dc->DrawText(str, &lpds->rcItem, DT_RIGHT|DT_VCENTER|DT_SINGLELINE);
}
void MyListBox::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CCheckListBox::OnKeyDown(nChar, nRepCnt, nFlags);
GetParent()->SendMessage(WM_COMMAND,MAKEWPARAM(GetDlgCtrlID(), LBN_SELCHANGE) , (LPARAM)m_hWnd);
}
// stdafx.h
struct ItemInfo {
int price;
int count;
};