MFC实现CListCtrl子项可编辑的简便操作
2011-05-06 10:49
267 查看
相信很多人用过MFC的新手都知道,MFC虽然封装了一些常用的控件,但不少控件真正使用起来,与个人的要求可能会有一些差别,总有一些功能不是很方便就能实现的,例如CTabCtrl(Tab控件)的颜色(涉及到自绘、头大)/CListCtrl的子项编辑。
这两天用列表控件做东西,需要编辑列表控件的子项,尝试了一通MFC提供的功能,觉得不是很好用,我需要的是报表风格的列表控件,估计不少人都知道,报表风格的列表控件,在资源里设置了“可就地编辑”的属性,子项虽然能够编辑,但编辑框是出现在第一列的,即不管你选择修改的项是在第几列,编辑框总是出现在相应行的第一列位置,很麻烦,而且经过我的尝试,编辑完后的文本保存,也是需要自己实现的。
总之来说,就是clistctrl控件用的不太爽,于是我就想自己定制一个!在网上搜了一下相关的资料,发现大多数的人都是自己派生一个子类实现,建立一个CEdit对象,然后将该对象的大小设置到与空间的格子一样大小,当双击或者单击(看个人实现)时候,将该CEdit编辑框show出来,实现编辑功能,响应CEdit编辑框失去焦点消息,将编辑框的文本SetItemText到列表控件中。
这种实现我觉得很不错,不过就是要派生自己的类,同时还要处理一些定位的消息,这里面就设计到一个讨厌的函数int (CPoint pt,UINT* pFlags=NULL) const,该函数还有一个重载版本的(参数忘了,具体查查MSDN或者百度吧),这个函数返回列表控件相应的行数,不知道为什么,我自己在实现的时候总是返回-1,就算用了ScreenToClient转换了都用,比较头大,看来是不行了,百度啊百度,然后我就看到另外一个办法!以下具体讲讲我的实现吧!
为了简便实现,我没有派生子类,直接在对话框上拖入一个CListCtrl列表控件,设置后属性,风格(报表-report),在对话框初始化函数里加入列表控件的一些初始化操作,这些就跳过了!下来是实现子项编辑的关键部分。
资源里拖入一个CEdit Box控件,关联control变量m_SubItemEdit,关联value变量CString cstrItemTextEdit,在对话框初始化函数OnInitDialog()里将编辑框隐藏起来:m_SubItemEdit.ShowWindow(SW_HIDE);
响应CListCtrl控件的NM_DBLCLK(指示用户在控件内双击了鼠标左键),以下是响应函数的处理,实现子项的可编辑化。
//响应CEdit控件的EN_KILLFOCUS函数
到这里,就是CListCtrl控件的子项编辑化实现的全部内容了,用的是我自己的代码,磕磕碰碰的,体会到了新手的难处,觉得还是写出来分享一下的好,如果有更好更简便的实现方法,高手们请多多指点!
顺便看看我的效果吧,嘻嘻!
这两天用列表控件做东西,需要编辑列表控件的子项,尝试了一通MFC提供的功能,觉得不是很好用,我需要的是报表风格的列表控件,估计不少人都知道,报表风格的列表控件,在资源里设置了“可就地编辑”的属性,子项虽然能够编辑,但编辑框是出现在第一列的,即不管你选择修改的项是在第几列,编辑框总是出现在相应行的第一列位置,很麻烦,而且经过我的尝试,编辑完后的文本保存,也是需要自己实现的。
总之来说,就是clistctrl控件用的不太爽,于是我就想自己定制一个!在网上搜了一下相关的资料,发现大多数的人都是自己派生一个子类实现,建立一个CEdit对象,然后将该对象的大小设置到与空间的格子一样大小,当双击或者单击(看个人实现)时候,将该CEdit编辑框show出来,实现编辑功能,响应CEdit编辑框失去焦点消息,将编辑框的文本SetItemText到列表控件中。
这种实现我觉得很不错,不过就是要派生自己的类,同时还要处理一些定位的消息,这里面就设计到一个讨厌的函数int (CPoint pt,UINT* pFlags=NULL) const,该函数还有一个重载版本的(参数忘了,具体查查MSDN或者百度吧),这个函数返回列表控件相应的行数,不知道为什么,我自己在实现的时候总是返回-1,就算用了ScreenToClient转换了都用,比较头大,看来是不行了,百度啊百度,然后我就看到另外一个办法!以下具体讲讲我的实现吧!
为了简便实现,我没有派生子类,直接在对话框上拖入一个CListCtrl列表控件,设置后属性,风格(报表-report),在对话框初始化函数里加入列表控件的一些初始化操作,这些就跳过了!下来是实现子项编辑的关键部分。
资源里拖入一个CEdit Box控件,关联control变量m_SubItemEdit,关联value变量CString cstrItemTextEdit,在对话框初始化函数OnInitDialog()里将编辑框隐藏起来:m_SubItemEdit.ShowWindow(SW_HIDE);
响应CListCtrl控件的NM_DBLCLK(指示用户在控件内双击了鼠标左键),以下是响应函数的处理,实现子项的可编辑化。
void CPetDialog::SetListItemText(void) { UpdateData(TRUE); //AfxMessageBox(cstrItemTextEdit); if(listSelFlag[0] == 2)//出售列表 { //此处的cstrItemTextEdit是CEdit控件的字符串关联变量 m_ListCtrlNotSell.SetItemText(listSelFlag[1],listSelFlag[2],cstrItemTextEdit); //重置编辑框文本 m_SubItemEdit.SetWindowText(L""); //隐藏编辑框 m_SubItemEdit.ShowWindow(SW_HIDE); } if(listSelFlag[0] == 1)//购买列表 { m_ListCtrlBuy.SetItemText(listSelFlag[1],listSelFlag[2],cstrItemTextEdit); m_SubItemEdit.SetWindowText(L""); m_SubItemEdit.ShowWindow(SW_HIDE); } //强制刷新列表控件(否则视觉上有感觉有点不爽,可以试试^_^) m_ListCtrlNotSell.Invalidate(); }
//响应CEdit控件的EN_KILLFOCUS函数
BOOL CPetDialog::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 if ( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN ) { if( GetFocus()->GetDlgCtrlID() == IDC_EDIT2) { if(listSelFlag[0] == 1) m_ListCtrlBuy.SetFocus();//使列表控件获得焦点,则CEdit会自动失去焦点,触发EN_KILLFOCUS消息 if(listSelFlag[0] == 2) m_ListCtrlNotSell.SetFocus(); } return TRUE; } return CDialog::PreTranslateMessage(pMsg); }
到这里,就是CListCtrl控件的子项编辑化实现的全部内容了,用的是我自己的代码,磕磕碰碰的,体会到了新手的难处,觉得还是写出来分享一下的好,如果有更好更简便的实现方法,高手们请多多指点!
顺便看看我的效果吧,嘻嘻!
相关文章推荐
- MFC实现CListCtrl子项可编辑的简便操作
- MFC--CListCtrl的两个扩展:可设置单元格(子项)颜色属性、可编辑单元格(子项)
- CListCtrl 报表风格,可编辑子项的完美实现
- MFC 重载CListCtrl实现可编辑功能
- [ListControl]MFC中实现list控件的编辑操作
- 可编辑子项的CListCtrl类
- vc++ MFC-CListCtrl控件的16条常用操作
- Repeater控件实现编辑、更新、删除操作
- MFC List Control控件添加单元格编辑和单元格下拉列表项以适用于数据库相关操作
- C#如何实现在PPT文档中插入、编辑和删除表格的操作
- MFC 的List Control控件实现可编辑
- MFC中CListCtrl单击表头排序+表格大小随窗体大小改变等功能实现
- 基于Metronic的Bootstrap开发框架经验总结(17)-- 使用 summernote插件实现HTML文档的编辑和图片插入操作
- VS2015/MFC编辑框基本操作
- iOS 通过textfield的代理方法实现不进入编辑,实现别的操作
- DataGrid的使用:(一)、在DataGrid控件中实现基本的操作(编辑、删除、分页)
- MFC--快捷键(组合键/热键)与按钮实现操作按钮的方法
- [原创]文本编辑中利用栈来实现undo和redo的无限次操作
- MFC编辑框如何实现用TAB键切换
- 利用ArcGIS Server REST API实现对Feature的编辑操作