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;
};
โš ๏ธ **GitHub.com Fallback** โš ๏ธ