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、能夠單擊行頭進行排序。等等等
一些別人寫的比較好的東東
【1】http://www.codeproject.com/KB/list/virtuallist.aspx
【2】http://www.codeproject.com/KB/list/quicklist.aspx#text
【3】http://www.codeproject.com/KB/miscctrl/gridctrl.aspx#EditValidate
【4】http://www.chinaitpower.com/A/2004-02-14/132385.html
【5】http://m.cnblogs.com/35075/1556904.html
【6】http://www.vckbase.com/document/viewdoc/?id=1853