MFC求助,listctrl控件的一些问题

listctrl实现可编辑的一些问题,不是很难q我吧798667612可以继续追加分数... listctrl实现可编辑的一些问题,不是很难
q我吧 798667612可以继续追加分数
展开
 我来答
匿名用户
2011-05-12
展开全部
第一种方法:
ON_NOTIFY处理listControl消息
列表控件的消息映射同样使用ON_NOTIFY宏,形式如同:ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode为通知代码,id为产生该消息的窗口ID,memberFxn为处理函数,函数的原型如同void OnXXXList(NMHDR* pNMHDR, LRESULT* pResult),其中pNMHDR为一数据结构,在具体使用时需要转换成其他类型的结构。对于列表控件可能取值和对应的数据结构为:

·LVN_BEGINLABELEDIT 在开始某项编辑字符时发送,所用结构:NMLVDISPINFO
·LVN_ENDLABELEDIT 在结束某项编辑字符时发送,所用结构:NMLVDISPINFO
·LVN_GETDISPINFO 在需要得到某项信息时发送,(如得到某项的显示字符)所用结构:NMLVDISPINFO
============= 以上理论转载,应用范例如下=================
范例:双击list item实现item重命名
//映射响应鼠标双击和label编辑结束事件
BEGIN_MESSAGE_MAP(CPage, CDialog)
ON_NOTIFY(NM_DBLCLK, IDC_LIST, &CPage::OnNMDblclkList)
ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST, &CPage::OnLvnEndlabeleditList)
END_MESSAGE_MAP()
-------------------------------------------------------------------------------
void CPage::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
{
//双击事件产生edit控件,EditLabel会先确定list是否setFocus
*pResult = 0;
POSITION pos = m_List_Tip.GetFirstSelectedItemPosition();
int tIndex = m_List_Tip.GetNextSelectedItem(pos);

if ( tIndex >= 0 )
{
m_List_Tip.SetFocus();
CEdit* pEdit = m_List_Tip.EditLabel( tIndex );
}
}
---------------------------------------------------------------------
void CTipTrapPage::OnLvnEndlabeleditListTip(NMHDR *pNMHDR, LRESULT *pResult)
{
//edit编辑结束事件参数NMHDR *pNMHDR强制转换为对应结构体NMLVDISPINFO
//可以得到当前list item的下标和edit的字符
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
*pResult = 0;
CString pName = pDispInfo->item.pszText;
int tIndex = pDispInfo->item.iItem;
m_List.SetFocus();

if( ( ! pName.IsEmpty() ) && tIndex >= 0 )
{
m_List.SetItemText( tIndex, 0, pName);
}
}
最后别忘了勾上属性:list控件->属性->Styles->Edit labels;

第二种方法:

要实现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消息到ListCtrlListCtrl的响应函数如下*/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);}

参考资料: 这是我以前搜集的资料,忘记出处了

xfgaojd
2011-05-12 · TA获得超过1009个赞
知道小有建树答主
回答量:774
采纳率:0%
帮助的人:0
展开全部
如果你可以确定要跳到那行,可以试试下面的代码
m_ListCtrl.SetItemState(m_ListCtrl.GetSelectionMark(), 0 ,LVIS_SELECTED);
m_ListCtrl.SetItemState(Find, LVIS_SELECTED ,LVIS_SELECTED);
m_ListCtrl.SetSelectionMark(Find);
m_ListCtrl.EnsureVisible(Find,TRUE);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
uuieu
2011-05-11
知道答主
回答量:7
采纳率:0%
帮助的人:0
展开全部
你要实现什么功能,和listview(listctrl一般用于view形式)交互数据还是单纯罗列数据
追问
report形式,里面有动态生成的edititem
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shuye2050
2011-05-12
知道答主
回答量:19
采纳率:0%
帮助的人:7.8万
展开全部
我最近也在做listctrl的相关工作,有问题一起探讨一下吧,我的qq442931431
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-05-13
展开全部
联系你了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式