CListCtrl學習筆記 2 中級篇

2021-06-02 05:43:39 字數 1693 閱讀 5402

clistctrl學習筆記(2)---中級篇

1.背景 : 我們知道如果clistctrl是報表樣式,那麼clistctrl所提供的編輯功能只侷限於第一列.也就是說只有第一列可編輯.這樣顯然無法滿足一般資料庫的要求.我們想要每個子項都能編輯.

2.思路 : cedit是乙個很好的可控制編輯控制項.如何把cedit和我們的clistctrl聯絡起來?一種很好的想法是------一般我們如果想編輯某一項,那麼就應該去雙擊.雙擊以後就讓cedit在那裡顯示,當然要把大小調整和子項**一樣.如果cedit失去了焦點,表示修改完畢,那麼立即更改子項的資料,同時讓cedit隱藏.因為每次只能編輯一項,所以只需要乙個cedit就夠了.

3.方法:(1)

首先從clistctrl派生乙個類,其他已經有的變數或者函式設定我已經介紹,如果不清楚的讀者,可以去參考」基礎篇」.

(2)有一點可以肯定,我們必須響應雙擊事件:

void cmylist::onlbuttondblclk(uint nflags, cpoint point)

int index;//行號

int colnum;//列號

getwindowrect(r);//稍後說明

getparent()->screentoclient(r);//稍後說明

if((index=hittestex(point,&colnum))!=-1)

editsubitem(index,colnum);

clistctrl::onlbuttondblclk(nflags, point);

其中hittestex是用來求出雙擊點所在的行列號,如果行號不為-1,那麼就呼叫函式editsubitem. 這個函式會根據行列號求出該子項具體座標,方便cedit調整位置.

(3)如何求出行列號?行號是很好求出來的 ,但是列號就不是很簡單了,必須詳細判斷.

int cmylist::hittestex(cpoint &point, int *pcolumn)

rect.left+=colwidth; }

}return -1; }

當然上面那種方法有點複雜,是完全從頭開始判斷.其實我們可以先利用clistctrl提供的函式求出行號,再求列號,這樣稍微簡單點

int cmylist::hittestex(cpoint &point, int *pcolumn)

rect.left+=colwidth;

}*/

} (4)

求出具體cedit移動座標

int cmylist::item_x(int row, int column,crect& rect_x)

rect.left+=offset+2;

rect.right=rect.left+getcolumnwidth(column)-2;

//bottom和top不用管

rect_x=rect;

return rect.right; }

(5)移動cedit

void cmylist::editsubitem(int item, int column)

void cmylist::editcellshow(crect rect, int item, int column,crect r)

^_^!這樣就完成了.效果還可以.當然你還要去響應cedit失去焦點和得到焦點的事件.這個就不是我的任務了,因為每個人的要求不一樣啊!

看看我的效果!

CListCtrl 使用筆記

1.如何獲取和設定某一行的選中狀態?1 獲取選中狀態 int state listctrl.getitemstate item,lvis selected if state lvis selected else 2 設定選中狀態 取消選中 listctrl.setitemstate item,0,l...

MFC中的列表控制項CListCtrl

在使用clistctrl控制項report顯示風格時,需要設定列標題資訊,否則不能向控制項中新增資料資訊,編輯列標題需要 使用insertcolumn方法 m listctrl.insertcolumn 0,姓名 lvcfmt left,150,0 m listctrl.insertcolumn 1...

學習筆記2

異常 try catch exception e finally 如果出現異常的 沒有try catch語句,異常會浮現至它所出現的方法上,然後從該方法拋至其呼叫者。異常分為檢查異常和非檢查異常,常見的錯誤例如1 0等為非檢查異常,大部分都是檢查異常。過載,重寫 過載就是同乙個類中方法名相同,但是方...