可編輯列表控件
要實(shí)現(xiàn)ListCtrl編輯功能,其實(shí)也簡單,只需要在響應(yīng)一個(gè)開始編輯的消息時(shí)(比如:鼠標(biāo)左鍵雙擊控件時(shí))獲取當(dāng)前點(diǎn)擊的Item和SubItem的序號,獲得它的位置,然后在這個(gè)位置顯示一個(gè)CEdit控件就可以實(shí)現(xiàn)編輯功能。以下詳細(xì)介紹實(shí)現(xiàn):
//響應(yīng)鼠標(biāo)雙擊
void CEditListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CRect rcCtrl;
LVHITTESTINFO lvhti;
lvhti.pt = point;
int nItem = CListCtrl::SubItemHitTest(&lvhti);// 測試鼠標(biāo)當(dāng)前選中的ITEM和SUBITEM
if(nItem == -1)
return;
int nSubItem = lvhti.iSubItem;
CListCtrl::GetSubItemRect(nItem,nSubItem,LVIR_LABEL,rcCtrl);//獲取選中位置的區(qū)域
//顯示EDIT
ShowEdit(TRUE,nItem,nSubItem,rcCtrl);
要實(shí)現(xiàn)ListCtrl編輯功能,其實(shí)也簡單,只需要在響應(yīng)一個(gè)開始編輯的消息時(shí)(比如:鼠標(biāo)左鍵雙擊控件時(shí))獲取當(dāng)前點(diǎn)擊的Item和SubItem的序號,獲得它的位置,然后在這個(gè)位置顯示一個(gè)CEdit控件就可以實(shí)現(xiàn)編輯功能。以下詳細(xì)介紹實(shí)現(xiàn):
//響應(yīng)鼠標(biāo)雙擊
void CEditListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CRect rcCtrl;
LVHITTESTINFO lvhti;
lvhti.pt = point;
int nItem = CListCtrl::SubItemHitTest(&lvhti);// 測試鼠標(biāo)當(dāng)前選中的ITEM和SUBITEM
if(nItem == -1)
return;
int nSubItem = lvhti.iSubItem;
CListCtrl::GetSubItemRect(nItem,nSubItem,LVIR_LABEL,rcCtrl);//獲取選中位置的區(qū)域
//顯示EDIT
ShowEdit(TRUE,nItem,nSubItem,rcCtrl);
CListCtrl::OnLButtonDblClk(nFlags, point);
}
//顯示EDIT
void CEditListCtrl::ShowEdit(BOOL bShow,int nItem,int nIndex,CRect rcCtrl)
{
//只需要?jiǎng)?chuàng)建一次EDIT控件,如果控件沒有創(chuàng)建,就創(chuàng)建EDIT.如果控件已經(jīng)創(chuàng)建了,就控制是顯示還是隱藏
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);
}
}
//編輯停止的時(shí)候
/*
本例在實(shí)現(xiàn)的時(shí)候,子類化了一個(gè)EDIT類CListCtrlEdit。
當(dāng)EDIT控件失去焦點(diǎn)的時(shí)候,將發(fā)送一個(gè)WM_USER_EDIT_END消息到ListCtrl
ListCtrl的響應(yīng)函數(shù)如下
*/
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);
}