使CListCtrl可編輯)

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.