[转载]vc中让列表框可编辑原文地址:vc中让列表框可编辑作者:杨清跃
多功能编辑框的实现 引言: 在运用VC开发数据库管理系统时,列表框无疑是最常用也是最为有用直观的开发控件之一,然而VC所提供的列表框却有其局限,因此,也为运用其开发应用程序带来了一定的麻烦, 在此,本人制作一个功能略强一些的列表框,意在起到引线的作用. 思想: 得到列表框被点击的列与行,临时创建编辑框,并用该行与列的字符填写编辑框,进行编辑后, 用编辑后的字符填充该项行该列,销毁编辑框. 制作过程: (1) (2) (3) (4) m_list.InsertColumn(0,"第0列"); //插入列头 CRect rect; m_list.GetWindowRect(&rect); int width=(rect.right-rect.left)/4; m_list.SetColumnWidth(0,width); m_list.SetColumnWidth(1,width); m_list.SetColumnWidth(2,width); m_list.SetColumnWidth(3,width); //设置列宽 for(int i=0;i<=10;i++){ CString str; str.Format("第%d行第0列",i); m_list.InsertItem(i,str); } for(int j=0;j<=10;j++){ for(int k=0;k<4;k++) { CString str; str.Format("第行%d第%d列",j,k); m_list.SetItemText(j,k,str); } } //插入列值 m_list.SetExtendedStyle(WS_CHILD|WS_CLIPSIBLINGS|WS_EX_TOOLWINDOW|WS_BORDER|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);//修改其样式 (5) (6) (7) (8) CEdit m_edit;//编辑框控件 //m_nitem,m_nsubitem为点击的行号与列号,m_nitem1,m_nsubitem1为前一点点击行号与列 //号 void EndEdit();//自定义的结束编辑函数 (9)打开该类的实现文件,在构造函数中加入下列代码: (10)编写Edit函数如下: void CNewListCtrl::Edit() { CRect rect; if(GetSubItemRect(m_nitem,m_nsubitem,LVIR_LABEL,rect)==FALSE) return; int sty=WS_CHILD|WS_CLIPSIBLINGS|WS_EX_TOOLWINDOW|WS_BORDER; //设置编辑框样式 if(m_edit.Create(sty,rect,this,ID_MYEDIT)==FALSE) //创建编辑框 return; CString txt=GetItemText(m_nitem,m_nsubitem); m_edit.SetWindowText(txt);//设置编辑框的内容 m_edit.SetFocus(); m_edit.SetSel(0,-1); m_edit.ShowWindow(SW_SHOW);//显示编辑框 m_nitem1=m_nitem; m_nsubitem1=m_nsubitem; } (11)编写EndEdit函数如下: if(m_nitem1!=-1&&m_nsubitem1!=-1)//判断是否为初始时 { CString txt; m_edit.GetWindowText(txt); SetItemText(m_nitem1,m_nsubitem1,txt);//设置为编辑后的文件内容 m_edit.DestroyWindow(); (12)加入左键的点击功能函数: //{{AFX_MSG(CNewListCtrl) 其次在实现文件中加入消息如下: BEGIN_MESSAGE_MAP(CNewListCtrl, CListCtrl) END_MESSAGE_MAP() 最后编写消息函数如下: void CNewListCtrl::OnLButtonDown(UINT nFlags, CPoint point) { LVHITTESTINFO testinfo; testinfo.pt.x=point.x; testinfo.pt.y=point.y; testinfo.flags=LVHT_ONITEMLABEL;//强调点击必是标题 if(SubItemHitTest(&testinfo)<0) return; m_nitem=testinfo.iItem;//得到行号 m_nsubitem=testinfo.iSubItem;//得到列号 if(m_nitem==m_nitem1&&m_nsubitem==m_nsubitem1)//判断是否是前一点击的行列 return; else{ Edit();//创建新的编辑框对列表框进行编辑 } } 至此,完成一个简单的可编辑的列表框的制作,虽然简单,却也是必要的一些实现步骤. 只能自己用浮动的edit. GetItemRect 可以得到整个一行的rect, GetColumnWidth可以得到column的宽度。 两个函数结合起来可以得到一个cell 的rect。然后搞一个edit在上面 |
|