多功能编辑框的实现
引言:
在运用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在上面
联系客服