博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编写可编辑的List控件
阅读量:5816 次
发布时间:2019-06-18

本文共 2425 字,大约阅读时间需要 8 分钟。

  今天由于项目的需要,要编写个能编辑的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 == -1)             return;        m_sub_item = lvhti.iSubItem;        if (m_edit_l != 1)            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(0,0,0,0),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 -= 2;    // 防止上边框被遮挡    m_edit.MoveWindow(&rect);    m_edit.ShowWindow(SW_SHOW);    m_edit.SetWindowText(strItem);//设置编辑框的内容为字表项的内容    m_edit.SetFocus();    m_edit.SetSel(-1); }

  第二个要处理的就是当编辑框失去焦点时,把编辑框中的内容设置为子表项的内容,将编辑框隐藏。由于要响应编辑框失去焦点这一事件,所以要让编辑框失去焦点后发一个消息给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 0;}

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

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

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

  

转载地址:http://wumbx.baihongyu.com/

你可能感兴趣的文章
编玩边学获数千万元A轮融资,投资方为君联资本
查看>>
蓝图(Blueprint)详解
查看>>
Spark之SQL解析(源码阅读十)
查看>>
Android图片添加水印图片并把图片保存到文件存储
查看>>
比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第二部分:代码实现(C语言)...
查看>>
海贼王十大悲催人物
查看>>
BigDecimal 舍入模式(Rounding mode)介绍
查看>>
开源 免费 java CMS - FreeCMS1.2-标签 infoSign
查看>>
开源 免费 java CMS - FreeCMS1.9 移动APP生成栏目列表数据
查看>>
git reset 三种用法总结
查看>>
虚拟机新增加硬盘,不用重启读到新加的硬盘
查看>>
Java IO流详尽解析
查看>>
邮件服务系列之四基于虚拟用户的虚拟域的邮件系统(安装courier-authlib以及部分配置方法)...
查看>>
Linux VSFTP服务器
查看>>
DHCP中继数据包互联网周游记
查看>>
Squid 反向代理服务器配置
查看>>
Java I/O操作
查看>>
Tomcat性能调优
查看>>
项目管理心得
查看>>
Android自学--一篇文章基本掌握所有的常用View组件
查看>>