CListCtrl 是一个经常使用的控件,通常用来显示数据库的内容。但是,CListCtrl并不好用。我们当然希望CListCtrl能像Excel那样好用,因此,得在原来的基础上进行改进。
一、使CListCtrl能够编辑子项
1、在对话框中添加一个CListCtrl控件,并添加CListCtrl类型的变量m_list。
2、初始化控件
设置控件风格
LONG lStyle; lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style lStyle |= LVS_REPORT; //设置style SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style DWORD dwStyle = m_list.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl) dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl) m_list.SetExtendedStyle(dwStyle); //设置扩展风格
插入列
m_list.InsertColumn(0,"OrderID",LVCFMT_LEFT,80); m_list.InsertColumn(1,"CustomerID",LVCFMT_LEFT,80); m_list.InsertColumn(2,"OrderDate",LVCFMT_LEFT,80); m_list.InsertColumn(3,"Feight",LVCFMT_LEFT,80); m_list.InsertColumn(4,"ShipName",LVCFMT_LEFT,80); m_list.InsertColumn(5,"ShipAddress",LVCFMT_LEFT,80); m_list.InsertColumn(6,"ShipCountry",LVCFMT_LEFT,80);
插入行
m_list.InsertItem(i,sOrderID);//sOrderID为插入的数据(LPCTSTR类型变量),i表示在数据在CListCtrl中的位置(int类型变量),以下类似 m_list.SetItemText(i,1,sCustomerID); m_list.SetItemText(i,2,sOrderDate); m_list.SetItemText(i,3,sFeight); m_list.SetItemText(i,4,sShipName); m_list.SetItemText(i,5,sShipAddress); m_list.SetItemText(i,6,sShipCountry);
3、使CListCtrl可编辑
我采用的方法如下:当你单击CListCtrl控件时,使其中的一行高亮显示。当你双击CListCtrl控件时,将一个CEdit(编辑框)控件移动到你所双击的列中(CEdit控件中显示你所单击列的内容)所在的位置。并使CEdit控件获取焦点。然后,你可以修改CEdit中的内容。当你的鼠标点击其他地方,CEdit将失去焦点,同时,我们将CEdit中的内容更新到CListCtrl中,从而完成了对CListCtrl的子项的修改。
首先在对话框中添加一个CEdit控件,并定义CEdit变量m_edit。当对话框初始化函数中隐藏该控件。 m_edit.ShowWindow(SW_HIDE);
然后对CListCtrl添加消息NM_DBLCLK(双击事件),在消息中添加代码
NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR; CRect rc; if(pNMListView->iItem!=-1) { m_row=pNMListView->iItem;//m_row为被选中行的行序号(int类型成员变量) m_column=pNMListView->iSubItem;//m_column为被选中行的列序号(int类型成员变量) m_list.GetSubItemRect(pNMListView->iItem, pNMListView->iSubItem,LVIR_LABEL,rc);//取得子项的矩形 rc.left+=3; rc.top+=2; rc.right+=3; rc.bottom+=2;
char * ch=new char [128]; m_list.GetItemText(pNMListView->iItem, pNMListView->iSubItem,ch,128);//取得子项的内容 m_edit.SetWindowText(ch);//将子项的内容显示到编辑框中 m_edit.ShowWindow(SW_SHOW);//显示编辑框 m_edit.MoveWindow(&rc);//将编辑框移动到子项上面,覆盖在子项上 m_edit.SetFocus();//使编辑框取得焦点 m_edit.CreateSolidCaret(1,rc.Height()-5);//创建一个光标 m_edit.ShowCaret();//显示光标 m_edit.SetSel(-1);//使光标移到最后面 } *pResult = 0;
然后,添加CEdit失去焦点时的消息EN_KILLFOCUS。在该消息中添加代码使编辑框中的内容更新到CListCtrl中。
CString str; m_edit.GetWindowText(str);//取得编辑框的内容 m_list.SetItemText(m_row,m_column,str);//将该内容更新到CListCtrl中 m_edit.ShowWindow(SW_HIDE);//隐藏编辑框
经过以上的步骤就实现的实现CListCtrl的子项可编辑。当然了,这还不完整。接下来所要做的工作:1、直接对CListCtrl派生出一个扩展类CListCtrlEx。2、添加自绘相关的代码。3、实现Virutal功能。4、继续添加双击子项弹出一个CComboBox控件的功能。5、可以调整行高。6、能够单击行头进行排序。等等等
|