CListCtrl控件(2)可编辑单元格的CListCtrl控件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CListCtrl控件(2)可编辑单元格的CListCtrl控件
CListCtrl控件⽣成之后,⽆论你单击还是双击它的单元格,都没有任何反应,如果我们需要像EXCEL那样双击⼀个单元格后即可编辑该单元格的内容,那怎么办呢?⼀个⽅法就是双击单元格之后,在该单元格的地⽅⽣成⼀个编辑框,然后让输⼊焦点落在该编辑框上,我们即可对该编辑框进⾏⽂字编辑,当输⼊焦点从编辑框上消失时(通常是⽤户在编辑框外的地⽅单击,就像EXCEL当编辑完⼀个单元格的内容后⽤户在单元格外的地⽅单击⼀下以⽰确认输⼊完毕⼀样。
),就理解为编辑完毕,然后把编辑框的内容设置为该单元格的内容,最后隐藏或销毁编辑框。
1.从CListCtrl类继承,新建⼀个⾃⼰的列表框类,在这⾥我取名为CPage2ListCtrl,下⾯就要在CPage2ListCtrl 类实现双击单元格编辑功能。
上⾯也已经说道,双击单元格后要显⽰⼀个编辑框,我们把那个编辑框看做是CPage2ListCtrl 类的成员。
接下来就要为这个编辑框新建⼀个从CEdit继承的类,为什么不直接⽤CEdit类呢,以后就知道为什么的了。
这个从CEdit继承的编辑框类我取名为CListEdit。
2.为CPage2ListCtrl类添加成员变量和函数:
public:
void DisposeEdit(); //这个函数的作⽤是.....往下看就知道的了。
CListEdit m_edit; //这个就是双击单元格后显⽰的编辑框。
int row,col; //⽤来记录双击的单元格是第⼏⾏第⼏列。
3.重写CPage2ListCtrl类的PreSubclassWindow()虚函数,这个函数的作⽤是什么,这⾥就不说了,我们要在这个函数⾥设置
CPage2ListCtrl类的基本样式和扩展样式,还有创建m_edit成员变量的编辑框。
void CPage2ListCtrl::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
ModifyStyle(LVS_EDITLABELS,0);
ModifyStyle(0,LVS_REPORT);
ModifyStyle(0,LVS_SHOWSELALWAYS);
SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_edit.Create(WS_CHILD|WS_CLIPSIBLINGS|WS_EX_TOOLWINDOW|WS_BORDER,
CRect(0,40,10,50),this,1001);
CListCtrl::PreSubclassWindow();
}
4.对CPage2ListCtrl类添加消息处理,对双击事件进⾏响应,消息名称是WM_LBUTTONDBLCLK。
void CPage2ListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CListCtrl::OnLButtonDblClk(nFlags, point);
LVHITTESTINFO info;
info.pt=point;
info.flags=LVHT_ONITEMLABEL;
if(SubItemHitTest(&info)>=0) //SubItemHitTest进⾏点击测试,⽬的是确定双击的单元格是第⼏⾏第⼏列。
{
row=info.iItem; //⾏索引
col=info.iSubItem; //列索引
CRect rect;
GetSubItemRect(row,col,LVIR_LABEL,rect); //得到该单元格矩形的位置⼤⼩信息。
CString str;
str = GetItemText(row,col); //获取该单元格已存在的⽂本内容。
m_edit.MoveWindow(rect); //把编辑框移动到该单元格矩形上。
m_edit.SetWindowText(str); //把单元格原本的内容显⽰到编辑框上。
m_edit.ShowWindow(SW_SHOW); //显⽰编辑框。
m_edit.SetSel(0,-1); //全选编辑框的内容。
m_edit.SetFocus(); //设置输⼊焦点在编辑框上。
UpdateWindow();
}
}
5.当编辑框输⼊焦点消失时,就认为编辑完毕,然后把编辑框的内容设置到单元格上。
编辑框输⼊焦点消失时会产⽣WM_KILLFOCUS消
息,我们对该消息进⾏响应,这就是为什么上⾯要为编辑框新建⼀个类的原因了。
void CListEdit::OnKillFocus(CWnd* pNewWnd)
{
CEdit::OnKillFocus(pNewWnd);
CPage2ListCtrl * temp;
//这⾥新建了⼀个CPage2ListCtrl 类型的指针,所以在CListEdit的cpp⽂件前必须先添加#include "Page2ListCtrl.h" temp=(CPage2ListCtrl *)GetParent();
temp->DisposeEdit(); //调⽤⽗窗⼝的DisposeEdit()函数。
// TODO: Add your message handler code here
}
void CPage2ListCtrl::DisposeEdit()
{ CString sLabel;
m_edit.GetWindowText(sLabel);
this->SetItemText(row,col,sLabel);
m_edit.ShowWindow(SW_HIDE);
if(GetItemCount() == row+1) //如果编辑的这⾏是最后⼀⾏的话,就添加⼀⾏,在这⾥可以设置更多的判断。
InsertItem(row+1,0);
return ;
}。