mfc实现可编辑的列表控件,输入功能,求助 15
我已经用如下代码实现了基本功能,即双击item就用一个edit框接收输入,单击其他行的item就显示到列表控件中。我现在想改进,因为每次输入都要双击很不方便,如果能用键盘...
我已经用如下代码实现了基本功能,即双击item就用一个edit框接收输入,单击其他行的item就显示到列表控件中。
我现在想改进,因为每次输入都要双击很不方便,如果能用键盘上下键切换行就能直接输入就好多了,估计要涉及到响应键盘上下键的消息,行选中与不选中的消息,需要添加一些函数,新手不知应该怎么实现,求助各位大神。
我已经写好的代码是在消息NM_DBLCLK、NM_CLICK添加成员函数:
void XXView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
if(isEdit==true)
{
CListCtrl &listControl = GetListCtrl();
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast < LPNMITEMACTIVATE > (pNMHDR);
LVHITTESTINFO info;
info.pt = pNMItemActivate -> ptAction;//获取point信息
if (listControl.SubItemHitTest(&info)!=-1)
{
hitRow = info.iItem; //得到双击的行
hitCol = info.iSubItem; //得到双击的列
if (editItem.m_hWnd == NULL) //editItem为一输入框控件,
{
RECT rect;
rect.left=0 ;
rect.top=0 ;
rect.bottom=15 ;
rect.right=200 ;
editItem .Create(WS_CHILD | ES_LEFT | WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN | ES_MULTILINE, rect, this , 101 );
editItem.SetFont( this -> GetFont(), FALSE);
}
CRect rect;
listControl.GetSubItemRect(info.iItem, info.iSubItem, LVIR_BOUNDS, rect);
editItem.SetWindowText(listControl.GetItemText( info .iItem, info .iSubItem));
editItem.MoveWindow( & rect, TRUE);
editItem.ShowWindow( 1 );
editItem.SetFocus();
}
}
*pResult = 0;
}
void XXView::OnLClick(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
if(isEdit==true)
{
CListCtrl &listControl = GetListCtrl();
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast < LPNMITEMACTIVATE > (pNMHDR);
if (editItem.m_hWnd != NULL)
{
editItem.ShowWindow( 0 );//点击其他行时,原来的编辑框要消失
if (hitRow != - 1 )//点击的是否在Listctrl控件内
{
CString text;
editItem.GetWindowText(text);
listControl.SetItemText(hitRow, hitCol, text);//把编辑框的字符复制到listctrl格子中
hitCol = hitRow = - 1 ;
}
*pResult = 0;
} 展开
我现在想改进,因为每次输入都要双击很不方便,如果能用键盘上下键切换行就能直接输入就好多了,估计要涉及到响应键盘上下键的消息,行选中与不选中的消息,需要添加一些函数,新手不知应该怎么实现,求助各位大神。
我已经写好的代码是在消息NM_DBLCLK、NM_CLICK添加成员函数:
void XXView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
if(isEdit==true)
{
CListCtrl &listControl = GetListCtrl();
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast < LPNMITEMACTIVATE > (pNMHDR);
LVHITTESTINFO info;
info.pt = pNMItemActivate -> ptAction;//获取point信息
if (listControl.SubItemHitTest(&info)!=-1)
{
hitRow = info.iItem; //得到双击的行
hitCol = info.iSubItem; //得到双击的列
if (editItem.m_hWnd == NULL) //editItem为一输入框控件,
{
RECT rect;
rect.left=0 ;
rect.top=0 ;
rect.bottom=15 ;
rect.right=200 ;
editItem .Create(WS_CHILD | ES_LEFT | WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN | ES_MULTILINE, rect, this , 101 );
editItem.SetFont( this -> GetFont(), FALSE);
}
CRect rect;
listControl.GetSubItemRect(info.iItem, info.iSubItem, LVIR_BOUNDS, rect);
editItem.SetWindowText(listControl.GetItemText( info .iItem, info .iSubItem));
editItem.MoveWindow( & rect, TRUE);
editItem.ShowWindow( 1 );
editItem.SetFocus();
}
}
*pResult = 0;
}
void XXView::OnLClick(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
if(isEdit==true)
{
CListCtrl &listControl = GetListCtrl();
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast < LPNMITEMACTIVATE > (pNMHDR);
if (editItem.m_hWnd != NULL)
{
editItem.ShowWindow( 0 );//点击其他行时,原来的编辑框要消失
if (hitRow != - 1 )//点击的是否在Listctrl控件内
{
CString text;
editItem.GetWindowText(text);
listControl.SetItemText(hitRow, hitCol, text);//把编辑框的字符复制到listctrl格子中
hitCol = hitRow = - 1 ;
}
*pResult = 0;
} 展开
2个回答
展开全部
ON_NOTIFY_REFLECT(LVN_KEYDOWN.........................)
int icrusel =m_listctrl->GetNextItem(-1,LVIS_SELECTED|LVNI_ALL);
if (pLVKeyDow->wVKey == VK_UP && icrusel!=0)
{
m_listctrl->SetItemState(-1,0,LVIS_SELECTED);//在此处进行需要的操作
m_listctrl->SetItemState(icrusel-1,LVIS_SELECTED,LVIS_SELECTED);//在此处进行需要的操作
//OnNMClick(0,0);
}
else if (pLVKeyDow->wVKey == VK_DOWN && icrusel != ncount-1)
{
m_listctrl->SetItemState(-1,0,LVIS_SELECTED);//在此处进行需要的操作
m_listctrl->SetItemState(icrusel+1,LVIS_SELECTED,LVIS_SELECTED);//在此处进行需要的操作
//OnNMClick(0,0);
}
int icrusel =m_listctrl->GetNextItem(-1,LVIS_SELECTED|LVNI_ALL);
if (pLVKeyDow->wVKey == VK_UP && icrusel!=0)
{
m_listctrl->SetItemState(-1,0,LVIS_SELECTED);//在此处进行需要的操作
m_listctrl->SetItemState(icrusel-1,LVIS_SELECTED,LVIS_SELECTED);//在此处进行需要的操作
//OnNMClick(0,0);
}
else if (pLVKeyDow->wVKey == VK_DOWN && icrusel != ncount-1)
{
m_listctrl->SetItemState(-1,0,LVIS_SELECTED);//在此处进行需要的操作
m_listctrl->SetItemState(icrusel+1,LVIS_SELECTED,LVIS_SELECTED);//在此处进行需要的操作
//OnNMClick(0,0);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询