VS2008下的CListCtrl控件的使用
最近要适应VS这个开发环境,从VC6移植到VS有很多不习惯.在一个小程序中利用到了 CListCtrl控件的时候 就出现了问题 。其实自VC6下这个控件我还是会使用的 主要指Report风格 。。
下面是VS下的CListCtrl控件的使用。。
我们利用的时候主要是针对CListCtrl的 report风格。关于CListCtrl,有基本风格和扩展风格 。 设置控件风格的API SetWindowLong(可以设置基本风格和扩展风格),还有就是CListCtrl类的
SetExtendedStyle函数可以设置扩展风格 。
下面是基本风格:
LVS_ALIGNLEFT 指定项是左对齐的
LVS_ALIGNTOP 指定靠顶部对齐
LVS_AUTOARRANGE 指定图标自动安排在大图标和小图标视图
LVS_EDITLABELS 允许项目文本进行编辑但是父窗口必须处理LVN_ENDLABELEDIT消息
LVS_ICON 指定是ICON视图
LVS_LIST 指定是列表视图
LVS_REPORT 指定是repoet风格
LVS_NOCOLUMNHEADER 指定在一个report视图列头不显示,但是默认下是显示的
LVS_NOLABELWRAP 在图标视图中单行显示项文本 ,缺省情况下项文本可以包含在图标列表
LVS_NOSCROLL 禁用scroll ,所有项必须在客户区域内 也就是我们可以看见的部分
LVS_NOSORTHEADER Specifies that column headers do not work like buttons. This style is useful if clicking a column header in report view does not carry out an action, such as sorting.
LVS_SMALLICON 指定大图标
LVS_SORTASCENDING 对项目文本按照升序方式排序
LVS_SORTDESCENDING 项目文本按照降序方式排序
LVS_SINGLESEL 在一个时间内仅仅允许一个项被选中 。默认情况下一次可以选中多个项 。
LVS_SHOWSELALWAYS 总是显示选择项 即使CListCtrl控件失去焦点
LVS_OWNERDRAWFIXED 允许窗体拥有者重回控件。列表控件发送 WM_DRAWITEM 到每一个项 。 他不会发送的消息到每个项 theDRAWITEMSTRUCT包含了将要重会的列表项的一些数据
下面是扩展风格:
LVS_EX_FULLROWSELECT 可以整行都选择 只针对于report
LVS_EX_GRIDLINES 控件有网格线
LVS_EX_CHECKBOXES 列表项前面有个复选框 CheckBox
上面这几个是常用的 还有很多扩展风格用到的时候 直接去源文件看定义。
下面这个函数可以获得控件的风格 或者扩展风格:
LONG GetWindowLong(
HWND hWnd, // handle to window
int nIndex // offset of value to retrieve
);
下面这个函数可以设置控件的风格 或者扩展风格:
LONG SetWindowLong(
HWND hWnd, // handle to window
int nIndex, // offset of value to set
LONG dwNewLong // new value
);
假设有一个指向CListCtrl对象的指针 那么我们修改他的风格:
DWORD style=::GetWindowLong(c->m_hWnd,GWL_STYLE) ;//获得控件的Style
::SetWindowLong(c->m_hWnd,GWL_STYLE,style|LVS_REPORT |LVS_NOLABELWRAP|LVS_EDITLABELS) ; //修改风格为report和可以加入图标
::SetWindowLong(c->m_hWnd,GWL_STYLE,LVS_REPORT |LVS_NOLABELWRAP|style) ;
DWORD styles = LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES; //新风格 网格和选中一行只支持report
c->SetExtendedStyle(styles) ;//设置扩展风格 其实在底层应该是调用了SetWindowLong进行风格的修改
插入列有2中方式 :可以通过位LVCOLUMN和直接插入文本
typedef struct _LVCOLUMN {
UINT mask; //位掩码 指定结构体中的那几个成员是有效的
int fmt;
int cx;
LPTSTR pszText;
int cchTextMax;
int iSubItem;
int iOrder;
int iImage;}
LVCOLUMN;
定义LVCOLUMN结构体并赋值,赋值后并且插入 具体去看看MSDN简单
LVCOLUMN lv1,lv2 ,lv3;
lv1.mask=LVCF_FMT |LVCF_TEXT|LVCF_WIDTH ; //设置LVCOLUMN的位掩码
lv1.pszText=_T("歌曲名字") ;//文本
lv1.cx=100 ; //列表宽是
lv1.fmt=LVCFMT_LEFT ;//文本居中显示
lv2.mask=LVCF_FMT |LVCF_TEXT|LVCF_WIDTH ; //设置LVCOLUMN的位掩码
lv2.pszText=_T("歌曲路径") ;//文本
lv2.cx=nWidth-200 ; //列表宽是
lv2.fmt=LVCFMT_LEFT ;//文本居中显示
lv3.mask=LVCF_FMT |LVCF_TEXT|LVCF_WIDTH ; //设置LVCOLUMN的位掩码
lv3.pszText=_T("歌曲长度") ;//文本
lv3.cx=100 ; //列表宽是
lv3.fmt=LVCFMT_LEFT ;//文本居中显示
c->InsertColumn(1,&lv1) ;
c->InsertColumn(3,&lv3) ;
c->InsertColumn(2,&lv2) ;
插入项的时候要注意: 一定要先插入项,再设置项的文本。
c->InsertItem(0,"ITEM1") ; //插入ITEM
c->SetItemText(0,1,"subitem") ;//设置项目的文本 从1开始 因为0是项的索引 如果SubItem多的话那么依次往后加即可
处理CListCtrl控件时候常用到的消息:
NM_CLICK 当项目列表单击的时候发送 在程序中我们需要做相应的处理
NM_DBCLICK 当项目列表双击的时候发送
但是我们要注意CListCtrl类中的2个模糊的函数
POSITION GetFirstSelectedItemPosition( ) const; //这个函数返回的是单击或者双击后 的位置 如果点击之处不在 项上面的话 那么 返回的 POSITION 是NULL 。
如果返回的POSITION 不是NULL 那么调用
int GetNextSelectedItem( POSITION& pos ) const; //通过返回的POSITION 位置 来返回点击列表项的索引 。