xref: /MusicPlayer2/MusicPlayer2/EditableListBox.cpp (revision 59ef618b8fe01617e17786d44e79fd61f7f3984b)
1 #include "stdafx.h"
2 #include "Common.h"
3 #include "EditableListBox.h"
4 
5 #define IDC_ITEM_EDITBOX 1991
6 
IMPLEMENT_DYNAMIC(CEditableListBox,CListBoxEnhanced)7 IMPLEMENT_DYNAMIC(CEditableListBox, CListBoxEnhanced)
8 
9 CEditableListBox::CEditableListBox()
10 {
11 }
12 
13 
~CEditableListBox()14 CEditableListBox::~CEditableListBox()
15 {
16 }
17 
Edit(int row)18 void CEditableListBox::Edit(int row)
19 {
20     CString last_row_text = GetItemText(GetItemCount() - 1);
21     if (row < 0)    //如果编辑的行超出了范围
22     {
23         if (!last_row_text.IsEmpty())       //最后一行不为空,则直接添加一个新行
24             AddString(_T(""));
25         row = GetItemCount() - 1;
26     }
27     EnsureVisible(row, FALSE);				//编辑一行时确保该行可见
28     m_editing = true;
29 
30     m_edit_row = row;
31     CRect item_rect;
32     GetSubItemRect(row, 0, LVIR_LABEL, item_rect);	//取得子项的矩形
33 
34     CString text = GetItemText(row);		//取得子项的内容
35 
36     m_item_edit.SetWindowText(text);		//将子项的内容显示到编辑框中
37     m_item_edit.ShowWindow(SW_SHOW);		//显示编辑框
38     m_item_edit.MoveWindow(item_rect);		//将编辑框移动到子项上面,覆盖在子项上
39     m_item_edit.SetFocus();					//使编辑框取得焦点
40     m_item_edit.SetSel(0, -1);
41 }
42 
BEGIN_MESSAGE_MAP(CEditableListBox,CListBoxEnhanced)43 BEGIN_MESSAGE_MAP(CEditableListBox, CListBoxEnhanced)
44     ON_EN_KILLFOCUS(IDC_ITEM_EDITBOX, &CEditableListBox::OnEnKillfocusEdit1)
45     ON_NOTIFY_REFLECT(NM_DBLCLK, &CEditableListBox::OnNMDblclk)
46     ON_NOTIFY_REFLECT(LVN_BEGINSCROLL, &CEditableListBox::OnLvnBeginScroll)
47 END_MESSAGE_MAP()
48 
49 
50 
51 void CEditableListBox::EndEdit()
52 {
53     if (m_editing)
54     {
55         if (m_edit_row >= 0 && m_edit_row < GetItemCount())
56         {
57             CString str;
58             m_item_edit.GetWindowText(str);	//取得编辑框的内容
59             SetItemText(m_edit_row, 0, str);	//将该内容更新到CListBoxEnhanced中
60         }
61         m_item_edit.ShowWindow(SW_HIDE);//隐藏编辑框
62         m_editing = false;
63     }
64 }
65 
PreSubclassWindow()66 void CEditableListBox::PreSubclassWindow()
67 {
68     m_item_edit.Create(WS_BORDER | ES_AUTOHSCROLL, CRect(), this, IDC_ITEM_EDITBOX);
69     m_item_edit.SetFont(GetFont());
70 
71     CListBoxEnhanced::PreSubclassWindow();
72 }
73 
OnEnKillfocusEdit1()74 void CEditableListBox::OnEnKillfocusEdit1()
75 {
76     //当文本编辑控件控件失去焦点时响应
77     EndEdit();
78 }
79 
80 
OnNMDblclk(NMHDR * pNMHDR,LRESULT * pResult)81 void CEditableListBox::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
82 {
83     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
84     // TODO: 在此添加控件通知处理程序代码
85 
86     //双击第一列时编辑名称
87     if(pNMItemActivate->iSubItem == 0)
88         Edit(pNMItemActivate->iItem);
89 
90     *pResult = 0;
91 }
92 
93 
OnLvnBeginScroll(NMHDR * pNMHDR,LRESULT * pResult)94 void CEditableListBox::OnLvnBeginScroll(NMHDR *pNMHDR, LRESULT *pResult)
95 {
96     // 此功能要求 Internet Explorer 5.5 或更高版本。
97     // 符号 _WIN32_IE 必须是 >= 0x0560。
98     LPNMLVSCROLL pStateChanged = reinterpret_cast<LPNMLVSCROLL>(pNMHDR);
99     // TODO: 在此添加控件通知处理程序代码
100     EndEdit();
101 
102     *pResult = 0;
103 }
104