CONAN ZONE

你越挣扎我就越兴奋

BlogJava 首页 新随笔 联系 聚合 管理
  0 Posts :: 282 Stories :: 0 Comments :: 0 Trackbacks
可编辑列表控件

要实现ListCtrl编辑功能,其实也简单,只需要在响应一个开始编辑的消息时(比如:鼠标左键双击控件时)获取当前点击的Item和SubItem的序号,获得它的位置,然后在这个位置显示一个CEdit控件就可以实现编辑功能。以下详细介绍实现:

//响应鼠标双击

void   CEditListCtrl::OnLButtonDblClk(UINT   nFlags,   CPoint   point)  

      CRect   rcCtrl; 
      LVHITTESTINFO   lvhti; 
      lvhti.pt   =   point; 
      int   nItem   =   CListCtrl::SubItemHitTest(&lvhti);//   测试鼠标当前选中的ITEM和SUBITEM 
      if(nItem   ==   -1) 
          return; 
      int   nSubItem   =   lvhti.iSubItem; 
      CListCtrl::GetSubItemRect(nItem,nSubItem,LVIR_LABEL,rcCtrl);//获取选中位置的区域   

      //显示EDIT 

      ShowEdit(TRUE,nItem,nSubItem,rcCtrl); 

      CListCtrl::OnLButtonDblClk(nFlags,   point);
}

//显示EDIT

void   CEditListCtrl::ShowEdit(BOOL   bShow,int   nItem,int   nIndex,CRect   rcCtrl)
{

//只需要创建一次EDIT控件,如果控件没有创建,就创建EDIT.如果控件已经创建了,就控制是显示还是隐藏
    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();
    }
    if(bShow   ==   TRUE)
  {
        CString   strItem   =   CListCtrl::GetItemText(nItem,nIndex);
        m_edit.MoveWindow(rcCtrl);
        m_edit.ShowWindow(SW_SHOW);
        m_edit.SetWindowText(strItem);
        ::SetFocus(m_edit.GetSafeHwnd());
        m_edit.SetSel(-1);  
        m_edit.SetCtrlData(MAKEWPARAM(nIndex,nItem));  
      }
          else
                m_edit.ShowWindow(SW_HIDE);
  }



//编辑停止的时候

/*

本例在实现的时候,子类化了一个EDIT类CListCtrlEdit。

当EDIT控件失去焦点的时候,将发送一个WM_USER_EDIT_END消息到ListCtrl

ListCtrl的响应函数如下

*/

void   CEditListCtrl::OnEditEnd(WPARAM   wParam,LPARAM   lParam)
{
if(wParam   ==   TRUE)
{
CString   strText(_T( " "));
m_edit.GetWindowText(strText);
DWORD   dwData   =   m_edit.GetCtrlData();
int   nItem=   dwData> > 16;
int   nIndex   =   dwData&0x0000ffff;
CListCtrl::SetItemText(nItem,nIndex,strText);
}
else
{

}

if(lParam   ==   FALSE)
m_edit.ShowWindow(SW_HIDE);

posted on 2008-06-20 23:15 CONAN 阅读(218) 评论(0)  编辑  收藏 所属分类: Linux/Unix