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