xref: /MusicPlayer2/MusicPlayer2/CListBoxEnhanced.cpp (revision 0fe263bcec7b837e3db61f539bec42e4a5a1be50)
1877f5f92SZhongYang #include "stdafx.h"
2b4946bd8SZhong Yang #include "CListBoxEnhanced.h"
3b4946bd8SZhong Yang #include "MusicPlayer2.h"
4b4946bd8SZhong Yang 
5b4946bd8SZhong Yang 
CListBoxEnhanced()6b4946bd8SZhong Yang CListBoxEnhanced::CListBoxEnhanced()
7b4946bd8SZhong Yang 	: CListCtrlEx()
8b4946bd8SZhong Yang {
9b4946bd8SZhong Yang }
10b4946bd8SZhong Yang 
11b4946bd8SZhong Yang 
~CListBoxEnhanced()12b4946bd8SZhong Yang CListBoxEnhanced::~CListBoxEnhanced()
13b4946bd8SZhong Yang {
14b4946bd8SZhong Yang }
15b4946bd8SZhong Yang 
AddString(LPCTSTR str)16b4946bd8SZhong Yang void CListBoxEnhanced::AddString(LPCTSTR str)
17b4946bd8SZhong Yang {
18b4946bd8SZhong Yang 	int cnt = GetItemCount();
19b4946bd8SZhong Yang 	InsertItem(cnt, str);
20b4946bd8SZhong Yang }
21b4946bd8SZhong Yang 
GetItemText(int index)2259ef618bSZhong Yang CString CListBoxEnhanced::GetItemText(int index)
2359ef618bSZhong Yang {
2459ef618bSZhong Yang     return CListCtrlEx::GetItemText(index, 0);
2559ef618bSZhong Yang }
2659ef618bSZhong Yang 
DeleteItem(int nItem)27b55021a5SZhong Yang bool CListBoxEnhanced::DeleteItem(int nItem)
28b55021a5SZhong Yang {
29b55021a5SZhong Yang     bool selected_item_deleted = (nItem == GetCurSel());
30b55021a5SZhong Yang     bool rtn = CListCtrlEx::DeleteItem(nItem);
31b55021a5SZhong Yang     //如果删除的是选中的条目,则更新选中状态并通知父窗口
32b55021a5SZhong Yang     if (selected_item_deleted)
33b55021a5SZhong Yang     {
34b55021a5SZhong Yang         SetCurSel(-1);
35b55021a5SZhong Yang         CWnd* pParent{ GetParent() };
36b55021a5SZhong Yang         if (pParent != nullptr)
37b55021a5SZhong Yang             pParent->SendMessage(WM_LISTBOX_SEL_CHANGED, (WPARAM)this, (LPARAM)-1);
38b55021a5SZhong Yang     }
39b55021a5SZhong Yang     return rtn;
40b55021a5SZhong Yang }
41b55021a5SZhong Yang 
PreSubclassWindow()42b4946bd8SZhong Yang void CListBoxEnhanced::PreSubclassWindow()
43b4946bd8SZhong Yang {
44877f5f92SZhongYang 	// TODO: 在此添加专用代码和/或调用基类
45e6aa5f8bSZhong Yang     SetExtendedStyle(GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_INFOTIP);
46b4946bd8SZhong Yang 	ModifyStyle(0, LVS_NOCOLUMNHEADER);
47b4946bd8SZhong Yang 
48b60a26ecSZhong Yang 	InsertColumn(0, _T("text"), LVCFMT_LEFT, CalculateColumnWidth());
49b4946bd8SZhong Yang 
50b4946bd8SZhong Yang 	CListCtrlEx::PreSubclassWindow();
51b4946bd8SZhong Yang }
52b60a26ecSZhong Yang 
CalculateColumnWidth()53b60a26ecSZhong Yang int CListBoxEnhanced::CalculateColumnWidth()
54b60a26ecSZhong Yang {
55b60a26ecSZhong Yang     CRect rect;
56b60a26ecSZhong Yang     GetWindowRect(rect);
57e2a78e69SZhong Yang     return rect.Width() - theApp.DPI(20);
58b60a26ecSZhong Yang }
59b60a26ecSZhong Yang 
BEGIN_MESSAGE_MAP(CListBoxEnhanced,CListCtrlEx)60b4946bd8SZhong Yang BEGIN_MESSAGE_MAP(CListBoxEnhanced, CListCtrlEx)
61b4946bd8SZhong Yang 	ON_NOTIFY_REFLECT(NM_CLICK, &CListBoxEnhanced::OnNMClick)
62*0fe263bcSZhong Yang     ON_NOTIFY_REFLECT_EX(NM_RCLICK, &CListBoxEnhanced::OnNMRClick)
63b60a26ecSZhong Yang     ON_WM_SIZE()
64b4946bd8SZhong Yang END_MESSAGE_MAP()
65b4946bd8SZhong Yang 
66b4946bd8SZhong Yang 
67b4946bd8SZhong Yang void CListBoxEnhanced::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
68b4946bd8SZhong Yang {
69b4946bd8SZhong Yang 	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
70877f5f92SZhongYang 	// TODO: 在此添加控件通知处理程序代码
7159ef618bSZhong Yang     CWnd* pParent{ GetParent() };
7259ef618bSZhong Yang     if (pParent != nullptr)
7359ef618bSZhong Yang     {
74a8512480SZhong Yang         CRect check_rect;
75a8512480SZhong Yang         GetItemRect(pNMItemActivate->iItem, check_rect, LVIR_LABEL);		//获取选中项目文本的矩形区域(以列表控件左上角为原点)
76a8512480SZhong Yang         if (check_rect.PtInRect(pNMItemActivate->ptAction))                 //如果点击的
77b4946bd8SZhong Yang             pParent->SendMessage(WM_LISTBOX_SEL_CHANGED, (WPARAM)this, (LPARAM)pNMItemActivate->iItem);
7859ef618bSZhong Yang         else
7959ef618bSZhong Yang             pParent->SendMessage(WM_LISTBOX_SEL_CHANGED, (WPARAM)this, (LPARAM)-1);
80a8512480SZhong Yang     }
81b4946bd8SZhong Yang 
82b4946bd8SZhong Yang 	*pResult = 0;
83b4946bd8SZhong Yang }
84b4946bd8SZhong Yang 
85b4946bd8SZhong Yang 
OnNMRClick(NMHDR * pNMHDR,LRESULT * pResult)86*0fe263bcSZhong Yang BOOL CListBoxEnhanced::OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult)
87b4946bd8SZhong Yang {
88b4946bd8SZhong Yang 	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
89877f5f92SZhongYang 	// TODO: 在此添加控件通知处理程序代码
90b4946bd8SZhong Yang 	CWnd* pParent{ GetParent() };
91b4946bd8SZhong Yang 	if (pParent != nullptr)
92b4946bd8SZhong Yang 		pParent->SendMessage(WM_LISTBOX_SEL_CHANGED, (WPARAM)this, (LPARAM)pNMItemActivate->iItem);
93b4946bd8SZhong Yang 
94b4946bd8SZhong Yang 	*pResult = 0;
95*0fe263bcSZhong Yang     return FALSE;
96b4946bd8SZhong Yang }
97b60a26ecSZhong Yang 
98b60a26ecSZhong Yang 
OnSize(UINT nType,int cx,int cy)99b60a26ecSZhong Yang void CListBoxEnhanced::OnSize(UINT nType, int cx, int cy)
100b60a26ecSZhong Yang {
101b60a26ecSZhong Yang     CListCtrlEx::OnSize(nType, cx, cy);
102b60a26ecSZhong Yang 
103877f5f92SZhongYang     // TODO: 在此处添加消息处理程序代码
104b60a26ecSZhong Yang     SetColumnWidth(0, CalculateColumnWidth());
105b60a26ecSZhong Yang     ShowScrollBar(SB_HORZ, FALSE);
106b60a26ecSZhong Yang }
107