使CListCtrl可編輯

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章