今天由于项目的需要,要编写个能编辑的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. mysql5.7 密码策略

    查看现有的密码策略 mysql> SHOW VARIABLES LIKE 'validate_password%';+-------------------------------------- ...

  2. 设置UIButton或者UILabel显示文字的行数

    需要在UIButton的titleLabel或者UILabel的text 字符串里面添加换行符号 “\n”,并且设置 UILabel的numberOfLines属性 栗子:行数要和“\n”的个数对应, ...

  3. oracle 11g RAC public/virtual/SACN/private IP we need to know

    1.3.2.2 IP Address Requirements Before starting the installation, you must have at least two interfa ...

  4. docker on centos

    docker最好在centos7上安装,centos6.5上似乎麻烦不少 这里直接在centos7上安装,要提前装一下epel的repo yum install docker 安装就行 chkconf ...

  5. 对InvokeAction简略分析了解验证失败为什么Action还会继续执行

    一.前言 有些同学使用AuthorizationFilter来进行用户是否登录验证,如果未登录就跳到登录页. 很简单的一个场景,但是有些同学会发现虽然验证失败了,但是整个Action还会执行一遍. 于 ...

  6. dojo事件驱动编程之事件绑定

    什么是事件驱动? 事件驱动编程是以事件为第一驱动的编程模型,模块被动等待通知(notification),行为取决于外来的突发事件,是事件驱动的,符合事件驱动式编程(Event-Driven Prog ...

  7. Linux 文件描述符和重定向

    200 ? "200px" : this.width)!important;} --> 介绍 文件描述符是与文件输入.输出相关联的整数,在编写脚本时会经常使用标准的文件描述符 ...

  8. COM思想的背后

    最近看公司的一些新产品和框架 , 发现清一色的“COM思想架构 ”, 这里说的“COM思想架构”是指不完全是标准COM组件的方式,而是指在设计上用到了COM思想. COM组件技术大概在1993年产生, ...

  9. Java处理Radius access-challenge

    最近使用 RSA Authentication Manager, 并且与其自带的Radius server整合, RSA的Radius server 配置不太透明, 目前只配成功了PAP方式的验证,C ...

  10. 字符串正则替换replace第二个参数是函数的问题

    按照JS高程的说法,如下 replace()方法的第二个参数也可以是一个函数.在只有一个匹配项(即与模式匹配的字符串)的情况下,会向这个函数传递3个参数:模式的匹配项.模式匹配项在字符串中的位置和原始 ...