可編輯子項的CListCtrl類

2021-05-22 07:29:28 字數 3758 閱讀 4045

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

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

但是讓人鬱悶的是,微軟留了一手,clistctrl不支援直接修改子項(subitem)。下面的**實現直接修改子項的功能。
具體思路如下:

建立乙個cedit 編輯框,然後把編輯框覆蓋當前的 subitem 上,並且使編輯框獲取焦點。當編輯框失去焦點時,把編輯框裡的文字,顯示到 listctrl 控制項上,就可以了。為了能夠使控制項知道何時顯示編輯框中的文字,所以還有重寫編輯框,當編輯框失去焦點時,通過訊息通知 listctrl 控制項。 

**如下:
1.新建乙個citemedit類,該類繼承自cedit
itemedit.h檔案的**如下:
class citemedit : public cedit

}afx_virtual

// implementation

public:

virtual ~citemedit();

// generated message map functions

protected:

//}afx_msg

declare_message_map()

public:

int m_ixpos;

};

itemedit.cpp檔案的**如下:
#include "itemedit.h"

#ifdef _debug

#define new debug_new

#undef this_file

static char this_file = __file__;

#endif

/// citemedit

citemedit::citemedit()

citemedit::~citemedit()

begin_message_map(citemedit, cedit)

//}afx_msg_map

end_message_map()

/

// citemedit message handlers

void citemedit::onwindowposchanging(windowpos far* lpwndpos)

新建乙個ceditlistctrl類,該類繼承自clistctrl,幷包含了乙個citemedit物件的成員變數。

editlistctrl.h檔案的**如下:

#include "itemedit.h"

/// ceditlistctrl window

class ceditlistctrl : public clistctrl

}afx_virtual

// implementation

public:

virtual ~ceditlistctrl();

// generated message map functions

protected:

//}afx_msg

afx_msg void oncustomdraw(nmhdr* pnmhdr, lresult* presult); //自定義控制項的繪製

declare_message_map()

private:

int m_iitem;

int m_isubitem;

bool m_bfocus;

bool m_bhighlight;

citemedit m_edtitemedit;};

editlistctrl.cpp檔案的**如下所示:

#include "editlistctrl.h"

ceditlistctrl::ceditlistctrl()

ceditlistctrl::~ceditlistctrl()

begin_message_map(ceditlistctrl, clistctrl)

//}afx_msg_map

on_notify_reflect(nm_customdraw, oncustomdraw)

end_message_map()

/// ceditlistctrl message handlers

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

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

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

//設定文字高亮矩形

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; }}

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

else

}else

clistctrl::onlbuttondown(nflags, point);

} invalidate();

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

*presult = 0;

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

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

*presult = 0; }

crect rect;

getwindowrect(&rect);

cpoint point;

::getcursorpos(&point);

if ( !rect.ptinrect(point)) }

void ceditlistctrl::onpaint()

} clistctrl::onpaint();

}void ceditlistctrl::onkillfocus(cwnd* pnewwnd)

}void ceditlistctrl::presubclasswindow()

使用ceditlistctrl類生成的listctrl就可以編輯其子項了。

可編輯子項的CListCtrl類

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

可編輯單元格的CListCtrl控制項

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

可編輯樹extjs

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