編寫可編輯的List控制項

2021-06-16 19:54:37 字數 1392 閱讀 5720

今天由於專案的需要,要編寫個能編輯的list控制項,即雙擊list控制項的表項能修改其中的內容。由於mfc自帶的list控制項是不能編輯的,所以在網上找了下怎樣編寫可編輯的clistctrl控制項,基本上都是繼承clistctrl這個類,我叫它ceditlistctrl控制項。

具體方法:在繼承的clistctrl的類中響應滑鼠雙擊的訊息,根據滑鼠雙擊的位置獲取list控制項中被選中的子表項。在獲取的子表項位置上顯示乙個編輯框,並將編輯框中的內容設定為選中的子表項的內容,同時將焦點設定在編輯框上。當焦點離開編輯框的時候,則認為輸入結束,並把編輯框中的內容重新設定為被選中子表項的內容。顯示的效果如下圖:

繼承的類主要是實現兩個處理,乙個是當滑鼠雙擊時(貌似和我響應滑鼠左鍵放開訊息的效果一樣),在滑鼠雙擊的位置顯示乙個編輯框,把焦點設定在編輯框中。具體**如下:

void

ceditlistctrl::onlbuttonup(uint nflags, cpoint point)

clistctrl::onlbuttonup(nflags, point);

}void ceditlistctrl::show_edit(int item, int

sub_item)

//將編輯框移動到子表項所在的位置,並將焦點設定在編輯框中

cstring stritem =clistctrl::getitemtext(item, sub_item);

rect.top -= 2; //

防止上邊框被遮擋

m_edit.movewindow(&rect);

m_edit.showwindow(sw_show);

m_edit.setwindowtext(stritem);//設定編輯框的內容為字表項的內容

m_edit.setfocus();

m_edit.setsel(-1

); }

第二個要處理的就是當編輯框失去焦點時,把編輯框中的內容設定為子表項的內容,將編輯框隱藏。由於要響應編輯框失去焦點這一事件,所以要讓編輯框失去焦點後發乙個訊息給ceditlistctrl類,在ceditlistctrl類中響應這個訊息即可。下面是響應編輯框發給ceditlistctrl類的訊息**:

lresult ceditlistctrl::oneditend(wparam wparam,lparam lparam)

void clistctrledit::onkillfocus(cwnd*pnewwnd)

總結:發現c++的繼承真的很強大,間間單單的幾行**就可以實現比較複雜的功能,站在巨人的肩膀上很強大,不過也深感自己的渺小,還有很多的東西要學習。

可編輯單元格的CListCtrl控制項

clistctrl 控制項生成之後,無論你單擊還是雙擊它的單元格,都沒有任何反應,如果我們需要像excel那樣雙擊乙個單元格後即可編輯該單元格的內容,那怎麼辦呢?乙個 方法就是雙擊單元格之後,在該單元格的地方生成乙個編輯框,然後讓輸入焦點落在該編輯框上,我們即可對該編輯框進行文字編輯,當輸入焦點從編...

WPF下可編輯Header的Tab控制項實現

介紹 接下來,我們需要定義個 editabletabheadercontrol 類,它具有控制textbox和textblock的能力。如下 namespace editabletabheaderdemo setthis.oldtext this.textbox.text this.setvalue...

WPF下可編輯Header的Tab控制項實現

介紹 有這樣乙個需求,當使用者雙擊tab控制項header區域時,希望可以直接編輯。對於wpf控制項,提供乙個controltemplate在加上一些trigger就可以實現。效果如下 首先,我們需要給tab header設計乙個controltemplate。類似乙個textblock,雙擊進入編...