ListCtrl控件使用技巧Word格式.docx
《ListCtrl控件使用技巧Word格式.docx》由会员分享,可在线阅读,更多相关《ListCtrl控件使用技巧Word格式.docx(15页珍藏版)》请在冰点文库上搜索。
lStyle&
=~LVS_TYPEMASK;
//清除显示方式位
lStyle|=LVS_REPORT;
//设置style
SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);
DWORDdwStyle=m_ListCtrl.GetExtendedStyle();
//获取当前扩展样式
dwStyle|=LVS_EX_FULLROWSELECT;
//选中某行使整行高亮(report风格时)
dwStyle|=LVS_EX_GRIDLINES;
//网格线(report风格时)
dwStyle|=LVS_EX_CHECKBOXES;
//item前生成checkbox控件
m_ListCtrl.SetExtendedStyle(dwStyle);
//设置扩展风格
m_ListCtrl.InsertColumn(0,"
名称"
LVCFMT_LEFT,50);
//插入列
m_ListCtrl.InsertColumn(1,"
备注"
//直接插入:
intnRow=m_ListCtrl.InsertItem(0,"
VC++"
);
//插入行
m_ListCtrl.SetItemText(nRow,1,"
VisualC++6.0"
//设置数据
//LVITEM结构插入:
LVITEMitem={0};
item.iItem=0;
//行号
item.mask=LVIF_TEXT;
/*LVIF_IMAGE支持图标*/;
item.cchTextMax=15;
//插入字符串长度
item.pszText="
;
intnRow=m_ListCtrl.InsertItem(&
item);
选中style中的Showselectionalways,
或者添加扩展样式LVS_SHOWSELALWAYS
intnIndex=0;
//选中
m_ListCtrl.SetItemState(nIndex,LVIS_SELECTED|
LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
//取消选中
m_ListCtrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);
CStringstr;
for(inti=0;
i<
m_ListCtrl.GetItemCount();
i++)
{
if(m_ListCtrl.GetItemState(i,LVIS_SELECTED)==
LVIS_SELECTED||m_ListCtrl.GetCheck(i))
{
str.Format(_T("
第%d行的checkbox为选中状态"
),i);
AfxMessageBox(str);
}
}
//方法一:
if(m_ListCtrl.GetItemState(i,LVIS_SELECTED)==LVIS_SELECTED)
选中了第%d行"
//方法二:
POSITIONpos=m_ListCtrl.GetFirstSelectedItemPosition();
if(pos==NULL)
TRACE0("
Noitemswereselected!
\n"
else
while(pos)
intnItem=m_ListCtrl.GetNextSelectedItem(pos);
TRACE1("
Item%dwasselected!
nItem);
//添加其他操作
TCHARszBuf[1024];
LVITEMlvi;
lvi.iItem=nItemIndex;
lvi.iSubItem=0;
lvi.mask=LVIF_TEXT;
lvi.pszText=szBuf;
lvi.cchTextMax=1024;
m_ListCtrl.GetItem(&
lvi);
关于得到设置item的状态,还可以参考msdn文章
Q173242:
UseMaskstoSet/GetItemStatesinCListCtrl
LVCOLUMNlvcol;
charstr[256];
int
nColNum;
CStringstrColumnName[3];
//假如有3列
nColNum=0;
lvcol.mask=LVCF_TEXT;
lvcol.pszText=str;
lvcol.cchTextMax=256;
while(m_list.GetColumn(nColNum,&
lvcol))
{
strColumnName[nColNum]=lvcol.pszText;
nColNum++;
m_ListCtrl.EnsureVisible(i,FALSE);
intnHeadNum=m_ListCtrl.GetHeaderCtrl()->
GetItemCount();
方法一:
while(m_ListCtrl.DeleteColumn(0))
//因为你删除了第一列后,后面的列会依次向上移动。
方法二:
intnColumns=3;
//列数
for(inti=nColumns-1;
i>
=0;
i--)
m_ListCtrl.DeleteColumn(i);
添加listctrl控件的NM_CLICK消息相应函数
voidCMyDlg:
:
OnClickList1(NMHDR*pNMHDR,LRESULT*pResult)
//方法一:
DWORDdwPos=GetMessagePos();
CPointpoint(LOWORD(dwPos),HIWORD(dwPos));
m_ListCtrl.ScreenToClient(&
point);
LVHITTESTINFOlvinfo;
lvinfo.pt=point;
lvinfo.flags=LVHT_ABOVE;
intnItem=m_ListCtrl.SubItemHitTest(&
lvinfo);
if(nItem!
=-1)
CStringstrtemp;
strtemp.Format("
单击的是第%d行第%d列"
lvinfo.iItem,lvinfo.iSubItem);
AfxMessageBox(strtemp);
//方法二:
NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR;
if(pNMListView->
iItem!
pNMListView->
iItem,pNMListView->
iSubItem);
*pResult=0;
DWORDdwPos=GetMessagePos();
CPointpoint(LOWORD(dwPos),HIWORD(dwPos));
m_ListCtrl.ScreenToClient(&
LVHITTESTINFOlvinfo;
lvinfo.pt=point;
lvinfo.flags=LVHT_ABOVE;
UINTnFlag;
intnItem=m_ListCtrl.HitTest(point,&
nFlag);
//判断是否点在checkbox上
if(nFlag==LVHT_ONITEMSTATEICON)
AfxMessageBox("
点在listctrl的checkbox上"
}
添加CListCtrl控件的NM_RCLICK消息相应函数
OnRclickList1(NMHDR*pNMHDR,LRESULT*pResult)
NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR;
if(pNMListView->
DWORDdwPos=GetMessagePos();
CPointpoint(LOWORD(dwPos),HIWORD(dwPos));
CMenumenu;
VERIFY(menu.LoadMenu(IDR_MENU1));
CMenu*popup=menu.GetSubMenu(0);
ASSERT(popup!
=NULL);
popup->
TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,
point.x,point.y,this);
m_ListCtrl.SetRedraw(FALSE);
//更新内容
m_ListCtrl.SetRedraw(TRUE);
m_ListCtrl.Invalidate();
m_ListCtrl.UpdateWindow();
//或者参考
/////////////////////////////////////////////////********************************************************************************************************************************
CListCtrl控件主要事件及LVN_ITEMCHANGED消息和鼠标双击列表项事件的处理
2009年08月03日星期一下午04:
18
LVN_BEGINDRAG鼠标左键正在被触发以便进行拖放操作(当鼠标左键开始拖拽列表视图控件中的项目时产生)
LVN_BEGINRDRAG鼠标右键正在被触发以便进行拖放操作(当鼠标右键开始拖拽列表视图控件中的项目时产生)
LVN_BEGINLABELEDIT开始编辑项的文本
LVN_COLUMNCLICK单击列(当鼠标单击列表视图控件列标题时产生)
NM_CLICK当鼠标单击列表视图控件时产生
LVN_COLUMNCLICK单击列
LVN_DELETEALLITEMS删除所有项
LVN_DELETEITEM删除某个项
NM_DBLCLK当鼠标双击列表视图控件时产生
LVN_ENDLABELEDIT结束对项文本的编辑
LVN_GETDISPINFO请求需要显示的信息
LVN_GETINFOTIP请求显示在工具提示窗口内的附加的文本信息
LVN_HOTTRACK鼠标滑过某个项
LVN_INSERTITEM当向列表视图控件插入项目时产生
lVN_ITEMACTIVATE激活某个项
LVN_ITEMCHANGED某个项已经发生变化
LVN_ITEMCHANGING某个项目正在发生变化
NM_KILLFOCUS当视表列图控件失去焦点时产生
LVN_KEYDOWN某个键被按下
LVN_MARQUEEBEGIN开始某个边框选择
NM_OUTOFMEMORY当内存溢出时产生
LVN_ODCACHEHINT虚拟列表控件的显示区域的内容发生了变化
LVN_ODSTATECHANGED虚拟列表的控件的某个项或某个范围内的项已经发生变化
LVN_ODFINDITEM需要拥有者查找一个特定的回调项
NM_RCLICK当鼠标右键单击列表视图控件时产生
NM_RDBLCLK当鼠标右键双击列表视图控件时产生
NM_SETFOCUS当列表视图控件获得焦点时产生
LVN_SETDISPINFO父窗口必须更新控件为项所维护的信息
注解:
HDN:
HeaderNotify
LVN:
ListViewcontrolNotify
NM:
NotifyMessage
TVN:
TreeViewcontrolNotify
LVN_ITEMCHANGED消息的处理
消息处理函数:
voidC***Dlg:
OnItemchangedList(NMHDR*pNMHDR,LRESULT*pResult)
NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR;
uChanged==LVIF_STATE)
uNewState&
LVIS_SELECTED)
//处理内容
intnItem=pNMListView->
iItem;
CStringvalue[6];
for(inti=0;
i<
6;
i++)
value[i]=m_List.GetItemText(nItem,i);
*pResult=0;
消息处理函数中的两个if条件句一定要有,否则可能出现多次进入处理内容的问题。
鼠标双击列表项事件的处理
响应NM_DBLCLK消息:
voidCDisSalaryDlg:
OnDblclkList(NMHDR*pNMHDR,LRESULT*pResult)
NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR;
intnItem=pNMListView->
if(nItem>
=0&
&
nItem<
m_List.GetItemCount())
//判断双击位置是否在有数据的列表项上面
.............
消息处理函数中的if语句很重要,用于判断双击位置是否在有数据的列表项上面。
因为NM_DBLCLK消息是CListCtrl控件(整体)消息,只要是在CListCtrl控件范围之内执行此事件就会产生该消息,而不一定要在有数据的列表项上面。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
防止CListCtrl闪烁的几种方法
(2009-12-2811:
24:
15)
转载
标签:
listctrl
闪烁
防止
it
分类:
VC及相关
1.使用SetRedraw禁止窗口重绘,操作完成后,再恢复窗口重绘
m_ctlList.SetRedraw(FALSE);
//以下为更新数据操作
//……
//恢复窗口重绘
m_ctlList.SetRedraw(TRUE);
2.使用LockWindowUpdate禁止窗口重绘,操作完成后,用UnlockWindowUpdate恢复窗口重绘
m_ctlList.LockWindowUpdate();
m_ctlList.UnlockWindowUpdate();
3.使用ListCtrl的内部双缓冲
m_ctlLisit.SetExtendedStyle(m_ctlLisit.GetExtendedStyle()|LVS_EX_DOUBLEBUFFER);
VC6未定义LVS_EX_DOUBLEBUFFER宏,使用者可以自定义,如下:
#defineLVS_EX_DOUBLEBUFFER
0x00010000
4.VirtualList
首先要设置ListCtrl风格为LVS_REPORT|LVS_OWNERDATA或在ListCtrl属里中的MoreStyles页面中选中Ownerdata复选框。
其次要向应LVN_GETDISPINFO消息;
voidOnGetdispinfoList(NMHDR*pNMHDR,LRESULT*pResult)
LV_DISPINFO*pDispInfo=(LV_DISPINFO*)pNMHDR;
LV_ITEM*pItem=&
(pDispInfo)->
i