vc中让列表框可编辑

来源:互联网 发布:淘宝哪家手办店好 编辑:程序博客网 时间:2024/05/17 02:45

vc中让列表框可编辑

 (2009-03-16 13:03:36)
转载
标签: 

杂谈

分类: VC++技术内幕

多功能编辑框的实现

引言:

在运用VC开发数据库管理系统时,列表框无疑是最常用也是最为有用直观的开发控件之一,然而VC所提供的列表框却有其局限,因此,也为运用其开发应用程序带来了一定的麻烦,

在此,本人制作一个功能略强一些的列表框,意在起到引线的作用.

思想:

得到列表框被点击的列与行,临时创建编辑框,并用该行与列的字符填写编辑框,进行编辑后,

用编辑后的字符填充该项行该列,销毁编辑框.

制作过程:

(1)     启动VC,新建工程,命名为”我的多功能列表框”选择基于对话框,然后直接点击完成.

(2)     删除对话框上默认的控件,加入列表框控件,启用类向导命名类名为m_list; 创建一个编辑框ID_MYEDIT,设置为invisible.

(3)     修必其属性为REPORT,调整其大小

(4)     修改对话框的初始化函数,在其返回前加入下列找码:

m_list.InsertColumn(0,"第0列");

         m_list.InsertColumn(1,"第1列");

             m_list.InsertColumn(2,"第2列");

                 m_list.InsertColumn(3,"第3列");

//插入列头

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)     在对话框头文件中找到列表框的声名(处,修改ClistCtrl为CnewListCtrl;变量名不变;

(6)     在其顶部加入头文件声名     :#include “NewListCtrl.h”;

(7)     新建类,取名为CnewListCtrl,选择基类为ClistCtrl;

(8)     在NewListCtrl.h中加入下列变量:

CEdit m_edit;//编辑框控件

     int m_nitem,m_nsubitem,m_nitem1,m_nsubitem1;

//m_nitem,m_nsubitem为点击的行号与列号,m_nitem1,m_nsubitem1为前一点点击行号与列

//号

      void Edit();//自定义的编辑函数

void EndEdit();//自定义的结束编辑函数

(9)打开该类的实现文件,在构造函数中加入下列代码:

     m_nitem=-1;

     m_nsubitem=-1;

     m_nitem1=-1;

     m_nsubitem1=-1;

(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)加入左键的点击功能函数:

    首先在NewListCtrl.h中加入\消息映射函数如下:

//{{AFX_MSG(CNewListCtrl)

         // NOTE - the ClassWizard will add and remove member functions here.

     afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//左键消息映射;

     //}}AFX_MSG

     DECLARE_MESSAGE_MAP()

     }

其次在实现文件中加入消息如下:

BEGIN_MESSAGE_MAP(CNewListCtrl, CListCtrl)

     //{{AFX_MSG_MAP(CNewListCtrl)

         // NOTE - the ClassWizard will add and remove mapping macros here.

         ON_WM_LBUTTONDOWN()//左键消息

     //}}AFX_MSG_MAP

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{

     EndEdit();//结束编辑框

Edit();//创建新的编辑框对列表框进行编辑

}

}

至此,完成一个简单的可编辑的列表框的制作,虽然简单,却也是必要的一些实现步骤.

只能自己用浮动的edit.

GetItemRect 可以得到整个一行的rect, GetColumnWidth可以得到column的宽度。

两个函数结合起来可以得到一个cell 的rect。然后搞一个edit在上面

0 0