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等為非檢查異常,大部分都是檢查異常。過載,重寫 過載就是同乙個類中方法名相同,但是方...