编辑子项的CListCtrl类.doc_第1页
编辑子项的CListCtrl类.doc_第2页
编辑子项的CListCtrl类.doc_第3页
编辑子项的CListCtrl类.doc_第4页
编辑子项的CListCtrl类.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编辑子项的CListCtrl类作者:Nobita关键词:可编辑子项 CListCtrl摘 要:本文对CListCtrl控件进行了一个扩展,使它即可以编辑主项(Item),又可以编辑子项(SubItem),并尽量符合CListCtrl的操作习惯。 一、说明大家都知道在MFC中通过给CListCtrl设置LVS_EDITLABELS属性,并且在程序中响应控件的LVN_ENDLABELEDIT消息可以修改列表控件每一行的第一项,也就是主项(Item)。代码如下:void CEditListCtrlSampleDlg:OnEndlabeleditList1(NMHDR* pNMHDR, LRESULT* pResult) LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;/ TODO: Add your control notification handler code here*pResult = TRUE; /TRUE值表示可以修改主项,FALSE值表示不修改主项但是让人郁闷的是,微软留了一手,CListCtrl不支持直接修改子项(SubItem)。无奈之下只好自力更生,对CListCtrl进行扩展。_nmcd.dwDrawStage = CDDS_PREPAINT)*pResult = CDRF_NOTIFYITEMDRAW;else if (pNMLVCustomDraw-nmcd.dwDrawStage = CDDS_ITEMPREPAINT)/ This is the notification message for an item. Well request/ notifications before each subitems prepaint stage.*pResult = CDRF_NOTIFYSUBITEMDRAW;else if (pNMLVCustomDraw-nmcd.dwDrawStage = (CDDS_ITEMPREPAINT | CDDS_SUBITEM)/当前要绘制的主项标识符和子项标识符int iItem = (int)pNMLVCustomDraw-nmcd.dwItemSpec;int iSubItem = pNMLVCustomDraw-iSubItem;CDC* pDC = CDC:FromHandle(pNMLVCustomDraw-nmcd.hdc);CString strItemText = GetItemText(iItem, iSubItem);CRect rcItem, rcText;GetSubItemRect(iItem, iSubItem, LVIR_LABEL, rcItem);rcText = rcItem;CSize size = pDC-GetTextExtent(strItemText);if(strItemText = _T()size.cx = 41; /设置文本高亮矩形rcText.left += 4;rcText.right = rcText.left + size.cx + 6;if(rcText.right rcItem.right)rcText.right = rcItem.right;COLORREF crOldTextColor = pDC-GetTextColor();/绘制项焦点/高亮效果if(m_bFocus)if(m_iItem = iItem) & (m_iSubItem = iSubItem)if(m_bHighLight)pDC-SetTextColor(:GetSysColor(COLOR_HIGHLIGHTTEXT);pDC-FillSolidRect(&rcText, :GetSysColor(COLOR_HIGHLIGHT);pDC-DrawFocusRect(&rcText);/绘制项文本rcItem.left += 6;pDC-DrawText(strItemText, &rcItem, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS | DT_NOCLIP);pDC-SetTextColor(crOldTextColor);*pResult = CDRF_SKIPDEFAULT;/ Weve painted everything.单击一次文本高亮,再单击一次文本开始编辑在WM_LBUTTONDOWN消息处理中实现:void CEditListCtrl:OnLButtonDown(UINT nFlags, CPoint point) m_bFocus = TRUE;LVHITTESTINFO lvhit;lvhit.pt = point;int item = SubItemHitTest(&lvhit);/if (over a item/subitem)if (item != -1 & (lvhit.flags & LVHT_ONITEM)CListCtrl:OnLButtonDown(nFlags, point);if(m_bHighLight & m_iItem = lvhit.iItem & m_iSubItem = lvhit.iSubItem) /第二次单击EditLabel(m_iItem);return;else /第一次单击m_iItem = lvhit.iItem;m_iSubItem = lvhit.iSubItem;m_bHighLight = TRUE;elseif(m_edtItemEdit.m_hWnd = NULL) /未出现文本编辑框时m_bHighLight = FALSE;CListCtrl:OnLButtonDown(nFlags, point);Invalidate(); /强制重绘控件关键的一步,对项文本进行编辑。在以上代码中当执行到EditLabel时将会产生一个编辑框,这时需要将它进行子类化处理,以控制它出现的位置。void CEditListCtrl:OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult) LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;if (m_iSubItem = 0) ASSERT(m_iItem = pDispInfo-item.iItem);CRect rcSubItem;GetSubItemRect( pDispInfo-item.iItem, m_iSubItem, LVIR_BOUNDS, rcSubItem);/get edit control and subclassHWND hWnd= (HWND)SendMessage(LVM_GETEDITCONTROL);ASSERT(hWnd != NULL);VERIFY(m_edtItemEdit.SubclassWindow(hWnd);/move edit control text 4 pixel to the right of org label,/as Windows does it.编辑框定位m_edtItemEdit.m_iXPos = rcSubItem.left + 4;m_edtItemEdit.SetWindowText(GetItemText(pDispInfo-item.iItem, m_iSubItem);*pResult = 0;void CEditListCtrl:OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;LV_ITEM*plvItem = &pDispInfo-item;if (m_iSubItem = 0)if (plvItem-pszText != NULL )SetItemText(plvItem-iItem,m_iSubItem, plvItem-pszText);VERIFY(m_edtItemEdit.UnsubclassWindow()!=NULL);*pResult = 0;/编辑文本时对控件父窗口操作(如单击其

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论