CListControl 为什么没有行标头串烧

CListView用法_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
CListView用法
阅读已结束,下载本文需要
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩5页未读,
定制HR最喜欢的简历
你可能喜欢C.O.L.A.P.I.N
CList Control 控件的使用
以下未经说明,listctrl默认view 风格为report
1. CListCtrl 风格
LVS_ICON: 为每个item显示大图标
LVS_SMALLICON: 为每个item显示小图标
LVS_LIST: 显示一列带有小图标的item
LVS_REPORT: 显示item详细资料
直观的理解:windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料”
2. 设置listctrl 风格及扩展风格
lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style
lStyle &= ~LVS_TYPEMASK; //清除显示方式位
lStyle |= LVS_REPORT; //设置style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style
DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_list.SetExtendedStyle(dwStyle); //设置扩展风格
注:listview的style请查阅msdn
3. 插入数据
m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列
m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );
int nRow = m_list.InsertItem(0, “11”);//插入行
m_list.SetItemText(nRow, 1, “jacky”);//设置数据
4. 一直选中item
选中style中的Show selection always,或者在上面第2点中设置LVS_SHOWSELALWAYS5. 选中和取消选中一行
int nIndex = 0;
m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
//取消选中
m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);
6. 得到listctrl中所有行的checkbox的状态
m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);
for(int i=0; i&m_list.GetItemCount(); i++)
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))
str.Format(_T("第%d行的checkbox为选中状态"), i);
AfxMessageBox(str);
7. 得到listctrl中所有选中行的序号
for(int i=0; i&m_list.GetItemCount(); i++)
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
str.Format(_T("选中了第%d行"), i);
AfxMessageBox(str);
POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos == NULL)
TRACE0("No items were selected!/n");
while (pos)
int nItem = m_list.GetNextSelectedItem(pos);
TRACE1("Item %d was selected!/n", nItem);
// you could do your own processing on nItem here
8. 得到item的信息
TCHAR szBuf[1024];
lvi.iItem = nItemI
lvi.iSubItem = 0;
lvi.mask = LVIF_TEXT;
lvi.pszText = szB
lvi.cchTextMax = 1024;
m_list.GetItem(&lvi);
关于得到设置item的状态,还可以参考msdn文章
Q173242: Use Masks to Set/Get Item States in CListCtrl
9. 得到listctrl的所有列的header字符串内容
strColumnName[4];//假如有4列
nColNum = 0;
lvcol.mask = LVCF_TEXT;
lvcol.pszText =
lvcol.cchTextMax = 256;
while(m_list.GetColumn(nColNum, &lvcol))
strColumnName[nColNum] = lvcol.pszT
nColNum++;
10. 使listctrl中一项可见,即滚动滚动条
m_list.EnsureVisible(i, FALSE);11. 得到listctrl列数
int nHeadNum = m_list.GetHeaderCtrl()-&GetItemCount();12. 删除所有列
while ( m_list.DeleteColumn (0))
因为你删除了第一列后,后面的列会依次向上移动。
int nColumns = 4;
for (int i=nColumns-1; i&=0; i--)
m_list.DeleteColumn (i);
13. 得到单击的listctrl的行列号
添加listctrl控件的NM_CLICK消息相应函数
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
// 方法一:
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
LVHITTESTINFO
lvinfo.pt =
lvinfo.flags = LVHT_ABOVE;
int nItem = m_list.SubItemHitTest(&lvinfo);
if(nItem != -1)
strtemp.Format("单击的是第%d行第%d列", lvinfo.iItem, lvinfo.iSubItem);
AfxMessageBox(strtemp);
// 方法二:
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView-&iItem != -1)
strtemp.Format("单击的是第%d行第%d列",
pNMListView-&iItem, pNMListView-&iSubItem);
AfxMessageBox(strtemp);
*pResult = 0;
14. 判断是否点击在listctrl的checkbox上
添加listctrl控件的NM_CLICK消息相应函数
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
LVHITTESTINFO
lvinfo.pt =
lvinfo.flags = LVHT_ABOVE;
int nItem = m_list.HitTest(point, &nFlag);
//判断是否点在checkbox上
if(nFlag == LVHT_ONITEMSTATEICON)
AfxMessageBox("点在listctrl的checkbox上");
*pResult = 0;
15. 右键点击listctrl的item弹出菜单
添加listctrl控件的NM_RCLICK消息相应函数
void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView-&iItem != -1)
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
VERIFY( menu.LoadMenu( IDR_MENU1 ) );
CMenu* popup = menu.GetSubMenu(0);
ASSERT( popup != NULL );
popup-&TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );
*pResult = 0;
修改某一行的某一项
m_listRecvDetail.SetItem(m_listItemCount-2,3,LVIF_TEXT,"不应答",0,0,0,NULL);
文章地址:http://blog.csdn.net/wangjiannuaa/article/details/6306176/
MF CListControl 简单功能使用
MFC控件(四)(列表视图控件CListControl)
关于VC中CListControl的不断插入和删除后内存不减的解决办法。
VC++ 文件读取并在CListControl上展示
CListControl用法
MFC中如何修改CListControl的列名
【MFC-12】VS2010/MFC之列表框控件动态编辑(List Control Edit)
没有更多推荐了,CListCtrl如何设置行头与列头相同的样式(凸起,灰色)
[问题点数:30分,结帖人xianglitian]
本版专家分:811
结帖率 96%
CSDN今日推荐
本版专家分:30277
2006年2月 C/C++大版内专家分月排行榜第二
本版专家分:119051
2018年5月 VC/MFC大版内专家分月排行榜第一2018年4月 VC/MFC大版内专家分月排行榜第一2018年3月 VC/MFC大版内专家分月排行榜第一2018年2月 VC/MFC大版内专家分月排行榜第一2018年1月 VC/MFC大版内专家分月排行榜第一2017年12月 VC/MFC大版内专家分月排行榜第一2017年11月 VC/MFC大版内专家分月排行榜第一2017年7月 VC/MFC大版内专家分月排行榜第一2012年7月 VC/MFC大版内专家分月排行榜第一
2018年6月 VC/MFC大版内专家分月排行榜第二2017年9月 VC/MFC大版内专家分月排行榜第二2017年8月 VC/MFC大版内专家分月排行榜第二2017年4月 VC/MFC大版内专家分月排行榜第二2017年3月 VC/MFC大版内专家分月排行榜第二2017年2月 VC/MFC大版内专家分月排行榜第二2016年8月 VC/MFC大版内专家分月排行榜第二2016年7月 VC/MFC大版内专家分月排行榜第二2016年6月 VC/MFC大版内专家分月排行榜第二2015年6月 VC/MFC大版内专家分月排行榜第二
2017年10月 VC/MFC大版内专家分月排行榜第三2017年6月 VC/MFC大版内专家分月排行榜第三2017年5月 VC/MFC大版内专家分月排行榜第三2016年9月 VC/MFC大版内专家分月排行榜第三2016年4月 VC/MFC大版内专家分月排行榜第三2015年4月 VC/MFC大版内专家分月排行榜第三2012年8月 VC/MFC大版内专家分月排行榜第三
本版专家分:811
本版专家分:358065
2013年 荣获名人称号
2011年 总版技术专家分年内排行榜第三2010年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第五
2012年1月 总版技术专家分月排行榜第一
本版专家分:140603
2013年10月 荣获微软MVP称号2012年10月 荣获微软MVP称号2011年10月 荣获微软MVP称号2010年10月 荣获微软MVP称号
2012年4月 VC/MFC大版内专家分月排行榜第一
2012年5月 VC/MFC大版内专家分月排行榜第二2012年3月 VC/MFC大版内专家分月排行榜第二2011年7月 VC/MFC大版内专家分月排行榜第二2011年1月 VC/MFC大版内专家分月排行榜第二2010年12月 VC/MFC大版内专家分月排行榜第二2010年9月 VC/MFC大版内专家分月排行榜第二2010年6月 VC/MFC大版内专家分月排行榜第二2010年5月 VC/MFC大版内专家分月排行榜第二2010年4月 VC/MFC大版内专家分月排行榜第二
2010年11月 VC/MFC大版内专家分月排行榜第三
匿名用户不能发表回复!|
其他相关推荐CListContainerElement 扩展任意类型的列表控件--表头拖拽不起作用
今天在做一个程序的界面时,需要在一个列表中显示除文字以外的其他控件,如:、、等;我做界面使用的是,其自带的并不能满足此项功能,需要进行扩展,在此记录,以便后续使用需要。
先看一下实现的效果:
今天我们的扩展主要包含如下部分:
1. 表头支持控件
在ListUI中,表头是CListHeaderItemUI,而这个类是从CControlUI继承而来,为了能支持在其中显示其他控件,它需要是一个容器,那么需要将其父类改成CContainerUI,调整基类后,需要同时将CListHeaderItemUI类中引用 CControlUI的地方全部改成CContainerUI,如:
LPVOID CListHeaderItemUI::GetInterface(LPCTSTR pstrName)
if( _tcscmp(pstrName, DUI_CTR_LISTHEADERITEM) == 0 ) return this;
return CContainerUI::GetInterface(pstrName);
LPVOID CListHeaderItemUI::GetInterface(LPCTSTR pstrName)
if( _tcscmp(pstrName, DUI_CTR_LISTHEADERITEM) == 0 )
return CContainerUI::GetInterface(pstrName);
如果此处不改,将无法从文件中加载内嵌控件。
还需要修改其他如事件中的CControlUI,否则会导致表头无法拖拉,切记。
改造后,我们可以从文件加载了,文件可以这样写:
name="listex" bkcolor="#FFFFFFFF" inset="0,0,0,0" itemshowhtml="true" vscrollbar="true" hscrollbar="true" headerbkimage="file='list_header_bg.png'" itemhotimage="file='tree_hot.bmp' corner='2,1,2,1'" itemselectedimage="file='tree_select.bmp' corner='2,1,2,1'" itemalign="center" itembkcolor="#FFE2DDDF" itemaltbk="true" hscrollbar="false" menu="true"
height="24" menu="true"
text="" inset="1,0,1,0" minwidth="60" endellipsis="true" font="1" width="95"
normalimage="headerctrl_normal.bmp" hotimage="headerctrl_hot.bmp" pushedimage="headerctrl_down.bmp" sepimage="Headerctrl_Sperator.bmp" sepwidth="2"
inset="1,0,5,0"
name="selall" endellipsis="true"
text="全选" textcolor="#FF386382" hottextcolor="#FF386382" selectedtextcolor="#FF386382" disabledtextcolor="#FFbac0c5" textpadding="20,3,0,0" align="left" selectedimage="file='checkbox_p.png' dest='0,2,15,17'" normalimage="file='checkbox_h.png' dest='0,2,15,17'"
text="域名" minwidth="100" endellipsis="true" font="1" width="200"
normalimage="headerctrl_normal.bmp" hotimage="headerctrl_hot.bmp" pushedimage="headerctrl_down.bmp" sepimage="Headerctrl_Sperator.bmp" sepwidth="2"
text="描述" minwidth="120" endellipsis="true" font="1" width="150"
normalimage="headerctrl_normal.bmp" hotimage="headerctrl_hot.bmp" pushedimage="headerctrl_down.bmp" sepimage="Headerctrl_Sperator.bmp" sepwidth="2"
&List name="listex" bkcolor="#FFFFFFFF" inset="0,0,0,0" itemshowhtml="true" vscrollbar="true" hscrollbar="true" headerbkimage="file='list_header_bg.png'" itemhotimage="file='tree_hot.bmp' corner='2,1,2,1'" itemselectedimage="file='tree_select.bmp' corner='2,1,2,1'" itemalign="center" itembkcolor="#FFE2DDDF" itemaltbk="true" hscrollbar="false" menu="true"&
&ListHeader height="24" menu="true"&
&ListHeaderItem text="" inset="1,0,1,0" minwidth="60" endellipsis="true" font="1" width="95"
normalimage="headerctrl_normal.bmp" hotimage="headerctrl_hot.bmp" pushedimage="headerctrl_down.bmp" sepimage="Headerctrl_Sperator.bmp" sepwidth="2"&
&VerticalLayout inset="1,0,5,0"&
&CheckBox name="selall" endellipsis="true"
text="全选" textcolor="#FF386382" hottextcolor="#FF386382" selectedtextcolor="#FF386382" disabledtextcolor="#FFbac0c5" textpadding="20,3,0,0" align="left" selectedimage="file='checkbox_p.png' dest='0,2,15,17'" normalimage="file='checkbox_h.png' dest='0,2,15,17'"
&/VerticalLayout&
&/ListHeaderItem&
&ListHeaderItem text="域名" minwidth="100" endellipsis="true" font="1" width="200"
normalimage="headerctrl_normal.bmp" hotimage="headerctrl_hot.bmp" pushedimage="headerctrl_down.bmp" sepimage="Headerctrl_Sperator.bmp" sepwidth="2"/&
&ListHeaderItem text="描述" minwidth="120" endellipsis="true" font="1" width="150"
normalimage="headerctrl_normal.bmp" hotimage="headerctrl_hot.bmp" pushedimage="headerctrl_down.bmp" sepimage="Headerctrl_Sperator.bmp" sepwidth="2"/&
&/ListHeader&
这样显示出来的效果如下:
此处需要将内嵌控件的ListHeaderItem 添加一个属性,控制内嵌的控件不要铺满整个,否则表头拖动不了,如:
ListHeaderItem text="" inset="1,0,1,0"
2. 列表项支持控件
CListUI的某一行CListContainerElementUI继承至容器CContainerUI,这样一来我们只需要将需要的控件添加到此容器中,即可正确的显示相关的控件了,此处并不需要做调整,只是这样一来会带来一个问题,那就是所添加的列的宽度无法与表头的宽度保持一致。
要解决这个问题,需要给CListContainerElementUI添加SetPos函数,在此函数中,重新校正数据列宽与表头宽度一致,具体如下:
void SetPos(RECT rc)
CContainerUI::SetPos(rc);
if( m_pOwner == NULL ) return;
if (m_pHeader == NULL)
TListInfoUI* pInfo = m_pOwner-&GetListInfo();
int nCount = m_items.GetSize();
for (int i = 0; i & nC i++)
CControlUI *pHorizontalLayout = static_cast&CControlUI*&(m_items[i]);
CListHeaderItemUI *pHeaderItem = static_cast&CListHeaderItemUI*&(m_pHeader-&GetItemAt(i));
if (pHorizontalLayout != NULL && pHeaderItem != NULL)
RECT rtHeader = pHeaderItem-&GetPos();
RECT rt = pHorizontalLayout-&GetPos();
rt.left = rtHeader.
rt.right = rtHeader.
pHorizontalLayout-&SetPos(rt);
CListHeaderUI *m_pH
void SetPos(RECT rc)
CContainerUI::SetPos(rc);
if( m_pOwner == NULL )
if (m_pHeader == NULL)
TListInfoUI* pInfo = m_pOwner-&GetListInfo();
int nCount = m_items.GetSize();
for (int i = 0; i & nC i++)
CControlUI *pHorizontalLayout = static_cast&CControlUI*&(m_items[i]);
// if (pHorizontalLayout != NULL)
// RECT rtHeader = pHeaderItem-&GetPos();
// RECT rt = pHorizontalLayout-&GetPos();
// rt.left = pInfo-&rcColumn[i].
// rt.right = pInfo-&rcColumn[i].
// pHorizontalLayout-&SetPos(rt);
CListHeaderItemUI *pHeaderItem = static_cast&CListHeaderItemUI*&(m_pHeader-&GetItemAt(i));
if (pHorizontalLayout != NULL && pHeaderItem != NULL)
RECT rtHeader = pHeaderItem-&GetPos();
RECT rt = pHorizontalLayout-&GetPos();
rt.left = rtHeader.
rt.right = rtHeader.
pHorizontalLayout-&SetPos(rt);
CListHeaderUI *m_pH
此处往列表项中添加了表头的指针,需要在插入一行的时候,将表头的指针传递进来,用于在SetPos的时候获取表头宽度。
注意以上代码中的注释部分,原本打算从TListInfoUI的rcColumn中获取表头项宽度的,但发现新添加行时,rcCulumn中的值全是,需要在插入行前主动调用一次才能正常,使用起来较麻烦,且容易忘记;即使是添加上了,测试发现获取到的位置有一定的偏移,所以采用将传入,实时获取了。
以下是一行数据的文件描述:
version="1.0" encoding="UTF-8"
name="selectme" endellipsis="true"
text="亲,选我吧!" textcolor="#FF386382" hottextcolor="#FF386382" selectedtextcolor="#FF386382" disabledtextcolor="#FFbac0c5" textpadding="20,3,0,0" align="left" selectedimage="file='checkbox_p.png' dest='0,2,15,17'" normalimage="file='checkbox_h.png' dest='0,2,15,17'"
inset="4,4,4,4"
text="测试文本" bordersize="1" height="20" bordercolor="#FF4775CC" name="domain"
text="按钮1" width="50" pushedimage="button_down.bmp" hotimage="button_over.bmp" normalimage="button_nor.bmp" name="ttt"
text="按钮2" width="50" pushedimage="button_down.bmp" hotimage="button_over.bmp" normalimage="button_nor.bmp" name="ttt"
text="这是从XML文件中加载的列表项"
&?xml version="1.0" encoding="UTF-8"?&
&ListContainerElement &
&CheckBox name="selectme" endellipsis="true"
text="亲,选我吧!" textcolor="#FF386382" hottextcolor="#FF386382" selectedtextcolor="#FF386382" disabledtextcolor="#FFbac0c5" textpadding="20,3,0,0" align="left" selectedimage="file='checkbox_p.png' dest='0,2,15,17'" normalimage="file='checkbox_h.png' dest='0,2,15,17'"
&HorizontalLayout inset="4,4,4,4"&
&Edit text="测试文本" bordersize="1" height="20" bordercolor="#FF4775CC" name="domain" &&/Edit&
&/HorizontalLayout&
&HorizontalLayout &
&VerticalLayout&
&Button text="按钮1" width="50" pushedimage="button_down.bmp" hotimage="button_over.bmp" normalimage="button_nor.bmp" name="ttt" &&/Button&
&Button text="按钮2" width="50" pushedimage="button_down.bmp" hotimage="button_over.bmp" normalimage="button_nor.bmp" name="ttt" &&/Button&
&Label text="这是从XML文件中加载的列表项"&&/Label&
&/VerticalLayout&
&/HorizontalLayout&
&/ListContainerElement&
&/Window&注意,此处需要确保的子控件个数不少于列表的列数
在代码中加载此文件,将行数据添加到列表中:
CListUIEx *pList = static_cast&CListUIEx*&(m_PaintManager.FindControl(_T("listex")));
CListContainerElementUI* pLine = (CListContainerElementUI*)(builder.Create(_T("sigle_list_item_column.xml"),(UINT)0, this));
if( pLine != NULL )
pList-&InsertItem(0, 60, pLine);
CListUIEx *pList = static_cast&CListUIEx*&(m_PaintManager.FindControl(_T("listex")));
CListContainerElementUI* pLine = (CListContainerElementUI*)(builder.Create(_T("sigle_list_item_column.xml"),(UINT)0, this));
if( pLine != NULL )
pList-&InsertItem(0, 60, pLine); //此函数是经过二次封装的
} 加载的效果如下:
这样我们可以在列表的不同项中显示任意内容,甚至是一个完整的窗口了。
3. 通过代码动态添加列及列表项
以上的处理均是调整后从加载相应的加载已经配置好的列表进行显示,在完成上述工作后,我这边进一步封装了几个函数,以便于动态的添加列指定内嵌控件、动态的插入行以及动态的在某一行列中添加控件。
1). 以下代码用于动态的添加列:
BOOL CListUIEx::InsertColumn(
CListHeaderItemUI *pHeaderItem
CListHeaderUI *pHeader = CListUI::GetHeader();
if (pHeader == NULL)
return FALSE;
if (pHeader-&AddAt(pHeaderItem, nCol))
return TRUE;
delete pHeaderI
pHeaderItem = NULL;
return FALSE;
BOOL CListUIEx::SetHeaderItemData(int nColumn, CControlUI* pControl)
CListHeaderUI *pHeader = CListUI::GetHeader();
if (pHeader == NULL)
return FALSE;
CListHeaderItemUI *pHeaderItem = (CListHeaderItemUI *)pHeader-&GetItemAt(nColumn);
pHeaderItem-&Add(pControl);
BOOL CListUIEx::InsertColumn(
CListHeaderItemUI *pHeaderItem
CListHeaderUI *pHeader = CListUI::GetHeader();
if (pHeader == NULL)
return FALSE;
if (pHeader-&AddAt(pHeaderItem, nCol))
return TRUE;
delete pHeaderI
pHeaderItem = NULL;
return FALSE;
BOOL CListUIEx::SetHeaderItemData(int nColumn, CControlUI* pControl)
CListHeaderUI *pHeader = CListUI::GetHeader();
if (pHeader == NULL)
return FALSE;
CListHeaderItemUI *pHeaderItem = (CListHeaderItemUI *)pHeader-&GetItemAt(nColumn);
pHeaderItem-&Add(pControl);
}调用代码如下添加一列,并且向此列中嵌入一个:
CListHeaderItemUI *pHeaderItem = new CListHeaderItemUI;
pHeaderItem-&SetTextStyle(DT_RIGHT|DT_VCENTER|DT_SINGLELINE);
pHeaderItem-&SetText("新增列
pHeaderItem-&SetAttribute(_T("sepimage"), _T("Headerctrl_Sperator.bmp"));
pHeaderItem-&SetAttribute(_T("sepwidth"), _T("1"));
pHeaderItem-&SetAttribute(_T("pushedimage"), _T("headerctrl_down.bmp"));
pHeaderItem-&SetAttribute(_T("hotimage"), _T("headerctrl_hot.bmp"));
pHeaderItem-&SetAttribute(_T("normalimage"), _T("headerctrl_normal.bmp"));
pHeaderItem-&SetFixedWidth(150);
pList-&InsertColumn(3, pHeaderItem);
CCheckBoxUI *pBtnUI = new CCheckBoxUI;
pBtnUI-&SetText("选择");
pBtnUI-&SetAttribute(_T("selectedimage"), _T("file='checkbox_p.png' dest='0,2,15,17'"));
pBtnUI-&SetAttribute(_T("normalimage"), _T("file='checkbox_h.png' dest='0,2,15,17'"));
pBtnUI-&SetAttribute(_T("textpadding"), _T("20,3,0,0"));
pBtnUI-&SetAttribute(_T("align"), _T("right"));
pBtnUI-&SetFloat(true);
pBtnUI-&SetAttribute("pos", "20,3, 65, 20");
pList-&SetHeaderItemData(3, pBtnUI);
CListHeaderItemUI *pHeaderItem = new CListHeaderItemUI;
pHeaderItem-&SetTextStyle(DT_RIGHT|DT_VCENTER|DT_SINGLELINE);
pHeaderItem-&SetText("新增列
pHeaderItem-&SetAttribute(_T("sepimage"), _T("Headerctrl_Sperator.bmp"));
pHeaderItem-&SetAttribute(_T("sepwidth"), _T("1"));
pHeaderItem-&SetAttribute(_T("pushedimage"), _T("headerctrl_down.bmp"));
pHeaderItem-&SetAttribute(_T("hotimage"), _T("headerctrl_hot.bmp"));
pHeaderItem-&SetAttribute(_T("normalimage"), _T("headerctrl_normal.bmp"));
pHeaderItem-&SetFixedWidth(150);
pList-&InsertColumn(3, pHeaderItem);
CCheckBoxUI *pBtnUI = new CCheckBoxUI;
pBtnUI-&SetText("选择");
pBtnUI-&SetAttribute(_T("selectedimage"), _T("file='checkbox_p.png' dest='0,2,15,17'"));
pBtnUI-&SetAttribute(_T("normalimage"), _T("file='checkbox_h.png' dest='0,2,15,17'"));
pBtnUI-&SetAttribute(_T("textpadding"), _T("20,3,0,0"));
pBtnUI-&SetAttribute(_T("align"), _T("right"));
pBtnUI-&SetFloat(true);
pBtnUI-&SetAttribute("pos", "20,3, 65, 20");
pList-&SetHeaderItemData(3, pBtnUI);2). 以下代码用于动态的添加行,动态的指定一列的内容:
int CListUIEx::InsertItem(int nItem, int nHeight)
CListContainerElementUIEx *pListItem = new CListContainerElementUIEx;
pListItem-&SetFixedHeight(nHeight);
pListItem-&SetList(this);
CListHeaderUI *pHeader = CListUI::GetHeader();
if (NULL != pHeader)
int nHeaderCount = pHeader-&GetCount();
for (int i = 0; i & nHeaderC i++)
pListItem-&InsertColumn(i);
if ( !CListUI::AddAt(pListItem, nItem) )
delete pListI
pListItem = NULL;
return -1;
void CListUIEx::SetItemData(int nItem,
int nColumn,
LPCTSTR Text, LPCTSTR Name)
CHorizontalLayoutUI *pSubHor = GetListSubItem(nItem, nColumn);
CLabelUI *pLabel = new CLabelUI;
pLabel-&SetText(Text);
pLabel-&SetTextStyle(DT_CENTER);
pLabel-&SetAttribute("endellipsis", "true");
pSubHor-&SetAttribute("inset", "3,1,3,1");
pLabel-&SetName(Name);
pSubHor-&Add(pLabel);
void CListUIEx::SetItemData(int nItem, int nColumn,CControlUI* pControl)
CHorizontalLayoutUI *pSubHor = GetListSubItem(nItem, nColumn);
pSubHor-&SetAttribute("inset", "3,0,3,1");
pSubHor-&Add(pControl);
int CListUIEx::InsertItem(int nItem, int nHeight)
CListContainerElementUIEx *pListItem = new CListContainerElementUIEx;
pListItem-&SetFixedHeight(nHeight);/*固定一个行高*/
pListItem-&SetList(this);
CListHeaderUI *pHeader = CListUI::GetHeader();
if (NULL != pHeader)
int nHeaderCount = pHeader-&GetCount();
for (int i = 0; i & nHeaderC i++)
pListItem-&InsertColumn(i);
if ( !CListUI::AddAt(pListItem, nItem) )
delete pListI
pListItem = NULL;
return -1;
void CListUIEx::SetItemData(int nItem,
int nColumn,
LPCTSTR Text, LPCTSTR Name)
//存放文本
CHorizontalLayoutUI *pSubHor = GetListSubItem(nItem, nColumn);
CLabelUI *pLabel = new CLabelUI;
pLabel-&SetText(Text);//控件属性就根据需求设置吧,我简单设置一下
pLabel-&SetTextStyle(DT_CENTER);
pLabel-&SetAttribute("endellipsis", "true");
pSubHor-&SetAttribute("inset", "3,1,3,1");
pLabel-&SetName(Name);
pSubHor-&Add(pLabel);//添加到父控件
void CListUIEx::SetItemData(int nItem, int nColumn,CControlUI* pControl)
CHorizontalLayoutUI *pSubHor = GetListSubItem(nItem, nColumn);
pSubHor-&SetAttribute("inset", "3,0,3,1");
pSubHor-&Add(pControl);//添加到父控件
通过如下代码来添加一行数据:
CListUIEx *pList = static_cast&CListUIEx*&(m_PaintManager.FindControl(_T("listex")));
int nIndex = pList-&GetCount();
pList-&InsertItem(nIndex);
CEditUI *pControl = new CEditUI;
pControl-&SetText("");
pControl-&SetName("edit");
pControl-&SetBorderColor(RGB(255, 0, 0));
pControl-&SetAttribute("bordersize", "1");
pControl-&SetAttribute("bordercolor", "#FF4775CC");
pList-&SetItemData(nIndex, 0, pControl);
CButtonUI *pBtnUI = new CButtonUI;
pBtnUI-&SetText("添加");
pBtnUI-&SetFixedWidth(60);
pBtnUI-&SetAttribute(_T("pushedimage"), _T("button_down.bmp"));
pBtnUI-&SetAttribute(_T("hotimage"), _T("button_over.bmp"));
pBtnUI-&SetAttribute(_T("normalimage"), _T("button_nor.bmp"));
pList-&SetItemData(nIndex, 1, pBtnUI);
pList-&SetItemData(nIndex, 2, "这是一行动态添加的数据", "testid");
if (pList-&GetHeader()-&GetCount() & 3)
pList-&SetItemData(nIndex, 3, "新增列数据", "testid1");
CListUIEx *pList = static_cast&CListUIEx*&(m_PaintManager.FindControl(_T("listex")));
int nIndex = pList-&GetCount();
pList-&InsertItem(nIndex);
CEditUI *pControl = new CEditUI;
pControl-&SetText("");
pControl-&SetName("edit");
pControl-&SetBorderColor(RGB(255, 0, 0));
pControl-&SetAttribute("bordersize", "1");
pControl-&SetAttribute("bordercolor", "#FF4775CC");
pList-&SetItemData(nIndex, 0, pControl);
CButtonUI *pBtnUI = new CButtonUI;
pBtnUI-&SetText("添加");
pBtnUI-&SetFixedWidth(60);
pBtnUI-&SetAttribute(_T("pushedimage"), _T("button_down.bmp"));
pBtnUI-&SetAttribute(_T("hotimage"), _T("button_over.bmp"));
pBtnUI-&SetAttribute(_T("normalimage"), _T("button_nor.bmp"));
pList-&SetItemData(nIndex, 1, pBtnUI);
pList-&SetItemData(nIndex, 2, "这是一行动态添加的数据", "testid");
if (pList-&GetHeader()-&GetCount() & 3)
pList-&SetItemData(nIndex, 3, "新增列数据", "testid1");
至此,ListUI的扩展就告一段落了,目前已经完全满足了的使用需求,相信也能满足绝大部分其他人的需求了,测试程序的完整效果图如下:
测试程序代码下载地址:
扩展此控件,参考了文章:
此份测试代码改自 群友 【朗】 的
同时特别感谢群友 的帮助!
duilib功能确实很强大,给我这种UI小白带来了希望,希望有越来越多的高级控件能纳入的基础源码库中,方便大众;也希望其他扩展过duilib功能的大侠,放出代码来,造福众人。
CListContainerElementUI 表头拖拽不起作用
duilib各种控件相应的消息类型
duilib list控件扩展
没有更多推荐了,

我要回帖

更多关于 标头餐饮 的文章

 

随机推荐