可編輯子項的CListCtrl類

2021-05-21 22:11:55 字數 2357 閱讀 1523

一、說明

大家都知道在mfc中通過給clistctrl設定lvs_editlabels屬性,並且在程式中響應控制項的lvn_endlabeledit訊息可以修改列表控制項每一行的第一項,也就是主項(item)。**如下:

void ceditlistctrlsampledlg::onendlabeleditlist1(nmhdr* pnmhdr, lresult* presult) 

int m_iitem; //主項識別符號

int m_isubitem; //子項識別符號

bool m_bfocus; //是否繪製項文字焦點框

bool m_bhighlight; //是否高亮項文字

citemedit m_edtitemedit; //用於子類化editlabel函式返回的cedit*指標

列表控制項中所有項文字的繪製以及特效(焦點框、高亮)都在nm_customdraw訊息處理中實現:

void ceditlistctrl::oncustomdraw(nmhdr* pnmhdr, lresult* presult)

else if (pnmlvcustomdraw->nmcd.dwdrawstage == cdds_itemprepaint)

else if (pnmlvcustomdraw->nmcd.dwdrawstage == (cdds_itemprepaint | cdds_subitem))

//設定文字高亮矩形

rctext.left += 4;

rctext.right = rctext.left + size.cx + 6;

if(rctext.right > rcitem.right)

colorref croldtextcolor = pdc->gettextcolor();

//繪製項焦點/高亮效果

if(m_bfocus)

pdc->drawfocusrect(&rctext);

} }

//繪製項文字

rcitem.left += 6;

pdc->drawtext(stritemtext, &rcitem, dt_left | dt_vcenter | dt_singleline | dt_end_ellipsis | dt_noclip);

pdc->settextcolor(croldtextcolor);

*presult = cdrf_skipdefault;// we've painted everything.

} }

void ceditlistctrl::onlbuttondown(uint nflags, cpoint point) 

else

}else

clistctrl::onlbuttondown(nflags, point); }

invalidate(); //強制重繪控制項

}

關鍵的一步,對項文字進行編輯。在以上**中當執行到editlabel時將會產生乙個編輯框,這時需要將它進行子類化處理,以控制它出現的位置。

void ceditlistctrl::onbeginlabeledit(nmhdr* pnmhdr, lresult* presult) 

*presult = 0;

}void ceditlistctrl::onendlabeledit(nmhdr* pnmhdr, lresult* presult)

verify(m_edtitemedit.unsubclasswindow()!=null);

*presult = 0;

} //編輯文字時對控制項父視窗操作(如單擊其它控制項)引發"onendlabeledit"時重新整理控制項

crect rect;

getwindowrect(&rect);

cpoint point;

::getcursorpos(&point);

if(!rect.ptinrect(point))

}

通過以上三個步驟大體實現了本文要達到的目的,但是還不能放鬆。接下來還要進行一些顯示細節方面的處理。這包括對wm_paint、wm_setfocus和wm_killfocus訊息的處理,限於篇幅,就不進行細講了,有興趣的朋友可以檢視本文提供的源**。最後實現的效果如下圖所示:

四、參考資料

2. 可設定單元格顏色的clistctrl類

可編輯子項的CListCtrl類

大家都知道在mfc中通過給clistctrl設定lvs editlabels屬性,並且在程式中響應控制項的lvn endlabeledit訊息可以修改列表控制項每一行的第一項,也就是主項 item void ceditlistctrlsampledlg onendlabeleditlist1 nmh...

可編輯單元格的CListCtrl控制項

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

可編輯樹extjs

ext.ns htsoft.ux company 巨集天軟體 createtime 2010 01 02 author csx class treepaneleditor extends ext.tree.treepanel description 樹選單編輯器,可帶右鍵操作選單,使用方式示例見ar...