• 编写可编辑的List控件


    编写可编辑的List控件

     今天由于项目的需要,要编写个能编辑的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++的继承真的很强大,间间单单的几行代码就可以实现比较复杂的功能,站在巨人的肩膀上很强大,不过也深感自己的渺小,还有很多的东西要学习。

      

     
     
    分类: vc++
  • 相关阅读:
    硬件的那些事
    seaJS学习资料参考
    nodejs前端自动化构建
    移动端开发的坑【持续更新...】
    【retina】手机上 1PX 边框
    【面试季之三】IE6兼容问题
    【面试季二】前端性能优化
    【面试季一】若干前端面试题
    【面试的坑】行内元素是否可以设置宽高
    Bootstrap和IE何时能相亲相爱啊~
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3201673.html
Copyright © 2020-2023  润新知