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