关于MFC中CListCtrl 编辑某项的显示字符 的菜鸟问题

来源:百度知道 编辑:UC知道 时间:2024/06/03 12:26:14
关于编辑某项的显示字符:(在报表风格中只对第一列有效)首先需要设置列表控件的 LVS_EDITLABELS风格,在开始编辑时该控件将会发送LVN_BEGINLABELEDIT,你可以通过在处理函数中返回TRUE来取消接下来的编辑,在编辑完成后会发送LVN_ENDLABELEDIT,在处理该消息时需要将参数pNMHDR转换为LPNMLVDISPINFO,然后通过其中的item.pszText得到编辑后的字符,并重置显示字符。如果编辑在中途中取消该变量为NULL。下面的代码说明如何处理这些消息:

//处理消息 LVN_BEGINLABELEDITvoid CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult){ LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR; if(pLVDI->item.iItem==0);//判断是否取消该操作 *pResult = 1; else *pResult = 0;}//处理消息 LVN_BEGINLABELEDITvoid CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult){ LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR; if(pLVDI->item.pszText==NULL);//判断是否已经取消取消编辑 m_list.SetItemText(pLVDI->item.iItem,0,pLVDI->pszText);//重置显示字符 *pResult = 0;}

以上是一个教程的片段 我根本看不懂 什么叫做编辑某项 而且前面要选入一个标记“LVS_EDITLABELS”

而且我查了MSND 关于LV_DISPINFO结构 根本没有pszText这一项 那上面那个教程的最后那个“pLVDI->pszText”不是误人子弟吗? 根本是错的啊

高手指教 我会追加分的 帮我分析下

MSDN上关于 LVS_EDITLABELS 说明如下:
Item text can be edited in place. The parent window must process the LVN_ENDLABELEDIT notification message.
项目文字可以被修改,父窗口必须处理消息LVN_ENDLABELEDIT

关于LVN_BEGINLABELEDIT说明如下:
This message notifies a list-view control parent window about the start of label editing for an item. It is sent in the form of a WM_NOTIFY message.
这个消息通知被修改的项目的起始编号, 它以WM_NOTIFY的形式被发送

先解释一下教程:
在OnBeginEditList中先判断ListCtrl中要修改的的Item个数,如果为0则设置*pResult为了1, 表示不修改, 如果不为0 则设置*pResult为0,表示进行修改

第二个OnBeginEditList是不是笔误, 应为OnEndlabeleditList, 功能为如果没有修改,将文字还原,即你单击一下某个选项,进入编辑状态,但是你没有输入,又单击了别的地方,此时将由于编辑状态清除的文字还原.

加标记LVS_EDITLABELS就是在ListCtrl中勾选edit labels属性

至于pLVDI->pszTex, 是教程笔误,应为pLVDI->item.pszText,即用该item原来的文字替换显示

关于更详细的CListCtrl的用法可以参考一下这里:
http://blog.csdn.net/bwmwm/archive