大家都知道在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()
/新建乙個ceditlistctrl類,該類繼承自clistctrl,幷包含了乙個citemedit物件的成員變數。// citemedit message handlers
void citemedit::onwindowposchanging(windowpos far* lpwndpos)
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...