ListCtrl的擴充套件類EditListCtrl

2021-07-14 16:19:25 字數 3818 閱讀 9747

該類繼承自mfc的clistctrl類;

實現列可選,多單元格可選,單擊選中單元格並能雙擊編輯,同時也可以設定某一列是否能進行編輯等等。

功能強大,歡迎使用。

標頭檔案:

ceditlistctrl.h

class ceditlistctrl : public clistctrl

}afx_virtual

// implementation

public:

virtual ~ceditlistctrl();

// generated message map functions

protected:

//}afx_msg

declare_message_map()

private:

void invalidate_grid(int row,int col);

afx_msg void custom_draw_funtion(nmhdr *pnmhdr, lresult *presult);

};

原始檔:

ceditlistctrl.cpp

// editlistctrl.cpp : implementation file

//#include "stdafx.h"

//#include "ceditlistdlg.h"

#include "editlistctrl.h"

#ifdef _debug

#define new debug_new

#undef this_file

static char this_file = __file__;

#endif

// ceditlistctrl

ceditlistctrl::ceditlistctrl()

ceditlistctrl::~ceditlistctrl()

begin_message_map(ceditlistctrl, clistctrl)

//}afx_msg_map

on_notify_reflect(nm_customdraw,custom_draw_funtion)

end_message_map()

/// ceditlistctrl message handlers

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

if (m_old_subitem>m_now_subitem)

if( (row>=olditem&&row<=nowitem)&&(col>=oldsub&&col<=nowsub))

else

cbrush brush(kolor);

pdc->fillrect(&rect,&brush);

}else

else

} rect.offsetrect(5,0);

if (col==3)

else

pdc->drawtext(str,&rect,ucode);

*presult=cdrf_skipdefault;

break;

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

} *presult = 0;

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

*presult = 0;

}void ceditlistctrl::invalidate_grid(int row, int col)

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

clistctrl::onmousemove(nflags, point);

}void ceditlistctrl::onlbuttonup(uint nflags, cpoint point)

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

//m_edit->showwindow(sw_hide);

clistctrl::onlbuttondown(nflags, point);

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

*presult = 0;

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

void ceditlistctrl::onhscroll(uint nsbcode, uint npos, cscrollbar* pscrollbar)

void ceditlistctrl::onvscroll(uint nsbcode, uint npos, cscrollbar* pscrollbar)

else

}}void ceditlistctrl::seteditcolomn(int col, bool edit)

} if(!m_isedit[m_subitem])//若當前列不允許直接編輯,則返回

return;

rect m_itemrect,m_r;

getitemrect(m_item ,&m_itemrect,2);

getitemrect(0 ,&m_r,2);

int m_height=m_itemrect.bottom -m_itemrect.top ;

int x=m_r.left ,y=m_r.top,cx,cy;//(x,y,cx,cy)為編輯框顯示的位置

for(i=0;i< m_item;i++)

y+=m_height;

cy=y+m_height;

for(i=0;imovewindow(x-4,y,cx-x-4,cy-y);//移動到當前子專案的位置。

invalidate();//重新整理螢幕。

return;

} //若編輯框不存在,則建立編輯框,並在當前子專案處顯示編輯框。

crect rect(x-4,y,cx-4,cy);

m_edit=new cedit();

m_edit->create (ws_child|ws_visible|ws_border,rect,this,id_listedit);

setwindowlong(m_edit->m_hwnd, gwl_style,getwindowlong(m_edit->m_hwnd, gwl_style) | es_number);//控制只允許輸入數字

cstring str=getitemtext (pnmlistview->iitem,pnmlistview->isubitem);

m_edit->updatedata(0);

m_edit->setwindowtext(str);

dword dwsel = m_edit->getsel();

m_edit->setsel(hiword(dwsel), -1);

m_edit->showwindow (sw_show);//顯示編輯框。

m_edit->setfocus ();

*presult = 0;

}bool ceditlistctrl::destroywindow()

void ceditlistctrl::onclose()

關於listctrl的用法

插入列 行和列都是從0開始 m list.insertcolumn 0,執行時間 lvcfmt left 80 1 m list.insertcolumn 1,描述 lvcfmt left 80 1 m list.insertcolumn 2,程式路徑 lvcfmt left 150 1 m lis...

報表風格的listctrl

報表風格的listctrl 說明 m list是clistctrl型別變數 long lstyle lstyle getwindowlong m list.m hwnd,gwl style 獲取當前視窗的風格 lstyle lvs typemask 清除顯示方式位 lstyle lstyle lvs...

ListCtrl控制項的使用

list contrl控制項的使用 1.建立基於對話方塊的應用程式,布置介面,設定屬性。注意新增的是listctrl控制項,不是listbox控制項,在控制項工具箱的倒數第五行list control控制項。屬性中設定styles標籤中的檢視屬性為report,是乙個多列列表顯示。2.設定控制項變數...