今天由于项目的需要,要编写个能编辑的List控件,即双击List控件的表项能修改其中的内容。由于MFC自带的List控件是不能编辑的,所以在网上找了下怎样编写可编辑的CListCtrl控件,基本上都是继承CListCtrl这个类,我叫它CEditListCtrl控件。

  具体方法:在继承的CListCtrl的类中响应鼠标双击的消息,根据鼠标双击的位置获取List控件中被选中的子表项。在获取的子表项位置上显示一个编辑框,并将编辑框中的内容设置为选中的子表项的内容,同时将焦点设置在编辑框上。当焦点离开编辑框的时候,则认为输入结束,并把编辑框中的内容重新设置为被选中子表项的内容。显示的效果如下图:

  继承的类主要是实现两个处理,一个是当鼠标双击时(貌似和我响应鼠标左键放开消息的效果一样),在鼠标双击的位置显示一个编辑框,把焦点设置在编辑框中。具体代码如下:

void CEditListCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bEdit)
{ //获取鼠标所在的list控件子表项
LVHITTESTINFO lvhti; //保存ListCtrl行列信息的结构
lvhti.pt = point;
m_item = CListCtrl::SubItemHitTest(&lvhti);
if (m_item == -)
return;
m_sub_item = lvhti.iSubItem;
if (m_edit_l != )
m_sub_item = m_edit_l;
     //用来显示编辑框
show_edit(m_item, m_sub_item);
}
CListCtrl::OnLButtonUp(nFlags, point);
} void CEditListCtrl::show_edit(int item, int sub_item)
{
CRect rect; m_item = item;
m_sub_item = sub_item;
CListCtrl::GetSubItemRect(item, sub_item, LVIR_LABEL, rect); //获取子表项的大小
if (m_edit.m_hWnd == NULL)
{ //创建编辑框和设置编辑框中的字体
m_edit.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(,,,),this,IDC_EDIT);
m_edit.ShowWindow(SW_HIDE); CFont tpFont;
tpFont.CreateStockObject(DEFAULT_GUI_FONT);
m_edit.SetFont(&tpFont);
tpFont.DeleteObject();
}
  //将编辑框移动到子表项所在的位置,并将焦点设置在编辑框中
CString strItem = CListCtrl::GetItemText(item, sub_item);
rect.top -= ; // 防止上边框被遮挡
m_edit.MoveWindow(&rect);
m_edit.ShowWindow(SW_SHOW);
m_edit.SetWindowText(strItem);//设置编辑框的内容为字表项的内容
m_edit.SetFocus();
m_edit.SetSel(-);
}

  第二个要处理的就是当编辑框失去焦点时,把编辑框中的内容设置为子表项的内容,将编辑框隐藏。由于要响应编辑框失去焦点这一事件,所以要让编辑框失去焦点后发一个消息给CEditListCtrl类,在CEditListCtrl类中响应这个消息即可。下面是响应编辑框发给CEditListCtrl类的消息代码:

LRESULT CEditListCtrl::OnEditEnd(WPARAM wParam,LPARAM lParam)
{
CString strText;
m_edit.GetWindowText(strText);
CListCtrl::SetItemText(m_item, m_sub_item, strText); //把编辑框中的内容设置为子表项的内容
m_edit.ShowWindow(SW_HIDE); //将编辑框隐藏
return ;
}

  继承的编辑框CMyEdit类中响应焦点离开的函数代码:

void CListCtrlEdit::OnKillFocus(CWnd* pNewWnd)
{
CEdit::OnKillFocus(pNewWnd); // TODO: 在此处添加消息处理程序代码
//向父窗口发消息
CWnd* pParent = this->GetParent();
::PostMessage(pParent->GetSafeHwnd(),WM_USER_EDIT_END,,);
}

  总结:发现C++的继承真的很强大,间间单单的几行代码就可以实现比较复杂的功能,站在巨人的肩膀上很强大,不过也深感自己的渺小,还有很多的东西要学习。

  

编写可编辑的List控件的更多相关文章

  1. 市委组织部考核项目——利用EasyUi中可编辑的DataGrid控件对多行数据进行编辑并提交

    http://blog.csdn.net/cjr15233661143/article/details/19041165 市委组织部考核项目中需要录入原始数据,拿开发区的数据录入举例说明,见下图,需要 ...

  2. 【VS开发】 自己编写一个简单的ActiveX控件——详尽教程

    最近开始学ActiveX控件编程,上手不太容易,上网想找相关教程也没合适的,最后还是在师哥的指导下完成了第一个简单控件的开发,现在把开发过程贴出来与大家分享一下~ (环境说明--平台:vs2005:语 ...

  3. MFC设置静态文本框,编辑框等控件背景和字体颜色

    在MFC类库提供了CWnd::OnCtlColor函数,在工作框架的子窗口被重画时将调用该成员函数.因此可以重载WM_CTLCOLOR消息的响应函数.此函数的原型:afx_msg HBRUSH OnC ...

  4. Qt编写自定义控件9-导航按钮控件

    前言 导航按钮控件,主要用于各种漂亮精美的导航条,我们经常在web中看到导航条都非常精美,都是html+css+js实现的,还自带动画过度效果,Qt提供的qss其实也是无敌的,支持基本上所有的CSS2 ...

  5. 【Android】10.0 UI开发——如何编写程序界面、常见控件的使用

    ************************ 转载请注明出处:https://www.cnblogs.com/xiaofu007/p/10331880.html ***************** ...

  6. Qt编写自定义控件48-面板窗体控件

    一.前言 很多时候需要有一个控件,能够替代容器控件,自动容纳多个widget,自适应宽高,然后提供滚动条功能,这就必然需要用到QScrollArea控件,可设置各个子面板的间距等,也在很多系统中用到, ...

  7. Qt编写自定义控件47-面板区域控件

    一.前言 在很多web网页上,经常可以看到一个设备对应一个面板,或者某种同等类型的信息全部放在一个面板上,该面板还可以拖来拖去的,这个控件首次用在智能访客管理平台中,比如身份证信息一个面板,访客信息一 ...

  8. Qt编写自定义控件45-柱状标尺控件

    一.前言 这个控件写了很久了,是最早期的一批控件中的一个,和温度计控件类似,都是垂直的进度条,可以设置不同的背景颜色,左侧的刻度也可以自由设定,还提供了动画效果,其实就是开启定时器慢慢的进度到设定的目 ...

  9. Qt编写自定义控件35-GIF录屏控件

    一.前言 在平时的写作过程中,经常需要将一些操作动作和效果图截图成gif格式,使得涵盖的信息更全面更生动,有时候可以将整个操作过程和运行效果录制成MP4,但是文件体积比较大,而且很多网站不便于上传,基 ...

随机推荐

  1. libev安装与示例程序编译运行

    Linux平台C网络编程,之前总是看各大名著(如UNIX环境高级编程和UNIX网络编程,还有TCP/IP详解 卷1:协议和深入理解计算机系统(原书第2版)),同时写点小程序练习.然而还是拿不出手. 参 ...

  2. 写字节流转换String 代码示例

    public void pushEmployee(EmpPushToTianFangRequest request){ try { StringWriter sw = new StringWriter ...

  3. Cookie与Session的区别-总结很好的文章

    Cookie与Session的区别-总结很好的文章 本文分别对Cookie与Session做一个介绍和总结,并分别对两个知识点进行对比分析,让大家对Cookie和Session有一个更深入的了解,并对 ...

  4. CUTE-WRV2.1+TCP core(COM5402)的TCP带宽测试

    问题的提出 测试TCP的带宽,硬件平台CUTE-WRV2.1,固件版本WRPCV3.0+COM5402. 代码.工具及实现 1. 在固件中,增加模块,收到TCP数据包后不断地往外发数: library ...

  5. 丹佛机场行李系统Postmortem

    丹佛机场行李系统做Postmortem总结 事情起因是因为丹佛市场承诺进行机场建设,因此此项目问题不可回避,必须完成,合作的双方都是富有经验的公司但是最后依然变成了不可控的项目,经过小组讨论后我们认为 ...

  6. linux-14基础命令之-复制(cp)移动(mv),删除(rm),拷贝文件(dd)

    1.cp 命令用于复制文件或者目录 格式为:cp[选项]源文件  目标文件 复制名录有三种情况: @1.目标文件是一个目录,将源复制到该目录下:  @2.目标文件是一个文件,将源文件覆盖该文件: @3 ...

  7. 从现在开始,使用简单优雅的validata.js

    表单验证,是后台开发中万年不变的话题,在经历许多实战之后发现 使用优雅便捷的validate.js实现验证实在是一件非常愉悦的事情 <form data-validate> Enter: ...

  8. 我的ORM之十三 -- 性能参数

    我的ORM索引 测试环境 台式机: 主板:映泰Z77 CPU:i5 3470(3.2GHz) 内存:DDR3 1600 8G(单条) 硬盘:创见 SSD 256G ORM从过程上,可以分两个大的部分: ...

  9. C#中的线程二(Cotrol.BeginInvoke和Control.Invoke)

    C#中的线程二(Cotrol.BeginInvoke和Control.Invoke) 原文地址:http://www.cnblogs.com/whssunboy/archive/2007/06/07/ ...

  10. 第二次作业:Github的使用

    Github的使用 一·注册:     要想使用github第一步当然是注册github账号了.之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称 ...